Skip to content

Commit a199448

Browse files
committed
Merge tag 'hardening-v5.18-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux
Pull hardening fixes from Kees Cook: - latent_entropy: Use /dev/urandom instead of small GCC seed (Jason Donenfeld) - uapi/stddef.h: add missed include guards (Tadeusz Struk) * tag 'hardening-v5.18-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux: gcc-plugins: latent_entropy: use /dev/urandom uapi/linux/stddef.h: Add include guards
2 parents c1488c9 + c40160f commit a199448

File tree

2 files changed

+31
-17
lines changed

2 files changed

+31
-17
lines changed

include/uapi/linux/stddef.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2+
#ifndef _UAPI_LINUX_STDDEF_H
3+
#define _UAPI_LINUX_STDDEF_H
4+
25
#include <linux/compiler_types.h>
36

47
#ifndef __always_inline
@@ -41,3 +44,4 @@
4144
struct { } __empty_ ## NAME; \
4245
TYPE NAME[]; \
4346
}
47+
#endif

scripts/gcc-plugins/latent_entropy_plugin.c

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -86,25 +86,31 @@ static struct plugin_info latent_entropy_plugin_info = {
8686
.help = "disable\tturn off latent entropy instrumentation\n",
8787
};
8888

89-
static unsigned HOST_WIDE_INT seed;
90-
/*
91-
* get_random_seed() (this is a GCC function) generates the seed.
92-
* This is a simple random generator without any cryptographic security because
93-
* the entropy doesn't come from here.
94-
*/
89+
static unsigned HOST_WIDE_INT deterministic_seed;
90+
static unsigned HOST_WIDE_INT rnd_buf[32];
91+
static size_t rnd_idx = ARRAY_SIZE(rnd_buf);
92+
static int urandom_fd = -1;
93+
9594
static unsigned HOST_WIDE_INT get_random_const(void)
9695
{
97-
unsigned int i;
98-
unsigned HOST_WIDE_INT ret = 0;
99-
100-
for (i = 0; i < 8 * sizeof(ret); i++) {
101-
ret = (ret << 1) | (seed & 1);
102-
seed >>= 1;
103-
if (ret & 1)
104-
seed ^= 0xD800000000000000ULL;
96+
if (deterministic_seed) {
97+
unsigned HOST_WIDE_INT w = deterministic_seed;
98+
w ^= w << 13;
99+
w ^= w >> 7;
100+
w ^= w << 17;
101+
deterministic_seed = w;
102+
return deterministic_seed;
105103
}
106104

107-
return ret;
105+
if (urandom_fd < 0) {
106+
urandom_fd = open("/dev/urandom", O_RDONLY);
107+
gcc_assert(urandom_fd >= 0);
108+
}
109+
if (rnd_idx >= ARRAY_SIZE(rnd_buf)) {
110+
gcc_assert(read(urandom_fd, rnd_buf, sizeof(rnd_buf)) == sizeof(rnd_buf));
111+
rnd_idx = 0;
112+
}
113+
return rnd_buf[rnd_idx++];
108114
}
109115

110116
static tree tree_get_random_const(tree type)
@@ -537,8 +543,6 @@ static void latent_entropy_start_unit(void *gcc_data __unused,
537543
tree type, id;
538544
int quals;
539545

540-
seed = get_random_seed(false);
541-
542546
if (in_lto_p)
543547
return;
544548

@@ -573,6 +577,12 @@ __visible int plugin_init(struct plugin_name_args *plugin_info,
573577
const struct plugin_argument * const argv = plugin_info->argv;
574578
int i;
575579

580+
/*
581+
* Call get_random_seed() with noinit=true, so that this returns
582+
* 0 in the case where no seed has been passed via -frandom-seed.
583+
*/
584+
deterministic_seed = get_random_seed(true);
585+
576586
static const struct ggc_root_tab gt_ggc_r_gt_latent_entropy[] = {
577587
{
578588
.base = &latent_entropy_decl,

0 commit comments

Comments
 (0)