Skip to content

Commit d06bfd1

Browse files
zx2c4tytso
authored andcommitted
random: warn when kernel uses unseeded randomness
This enables an important dmesg notification about when drivers have used the crng without it being seeded first. Prior, these errors would occur silently, and so there hasn't been a great way of diagnosing these types of bugs for obscure setups. By adding this as a config option, we can leave it on by default, so that we learn where these issues happen, in the field, will still allowing some people to turn it off, if they really know what they're doing and do not want the log entries. However, we don't leave it _completely_ by default. An earlier version of this patch simply had `default y`. I'd really love that, but it turns out, this problem with unseeded randomness being used is really quite present and is going to take a long time to fix. Thus, as a compromise between log-messages-for-all and nobody-knows, this is `default y`, except it is also `depends on DEBUG_KERNEL`. This will ensure that the curious see the messages while others don't have to. Signed-off-by: Jason A. Donenfeld <[email protected]> Signed-off-by: Theodore Ts'o <[email protected]>
1 parent 7aed9f7 commit d06bfd1

File tree

2 files changed

+29
-2
lines changed

2 files changed

+29
-2
lines changed

drivers/char/random.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,6 @@
288288
#define SEC_XFER_SIZE 512
289289
#define EXTRACT_SIZE 10
290290

291-
#define DEBUG_RANDOM_BOOT 0
292291

293292
#define LONGS(x) (((x) + sizeof(unsigned long) - 1)/sizeof(unsigned long))
294293

@@ -1481,7 +1480,7 @@ void get_random_bytes(void *buf, int nbytes)
14811480
{
14821481
__u8 tmp[CHACHA20_BLOCK_SIZE];
14831482

1484-
#if DEBUG_RANDOM_BOOT > 0
1483+
#ifdef CONFIG_WARN_UNSEEDED_RANDOM
14851484
if (!crng_ready())
14861485
printk(KERN_NOTICE "random: %pF get_random_bytes called "
14871486
"with crng_init = %d\n", (void *) _RET_IP_, crng_init);
@@ -2075,6 +2074,12 @@ u64 get_random_u64(void)
20752074
return ret;
20762075
#endif
20772076

2077+
#ifdef CONFIG_WARN_UNSEEDED_RANDOM
2078+
if (!crng_ready())
2079+
printk(KERN_NOTICE "random: %pF get_random_u64 called "
2080+
"with crng_init = %d\n", (void *) _RET_IP_, crng_init);
2081+
#endif
2082+
20782083
batch = &get_cpu_var(batched_entropy_u64);
20792084
if (use_lock)
20802085
read_lock_irqsave(&batched_entropy_reset_lock, flags);
@@ -2101,6 +2106,12 @@ u32 get_random_u32(void)
21012106
if (arch_get_random_int(&ret))
21022107
return ret;
21032108

2109+
#ifdef CONFIG_WARN_UNSEEDED_RANDOM
2110+
if (!crng_ready())
2111+
printk(KERN_NOTICE "random: %pF get_random_u32 called "
2112+
"with crng_init = %d\n", (void *) _RET_IP_, crng_init);
2113+
#endif
2114+
21042115
batch = &get_cpu_var(batched_entropy_u32);
21052116
if (use_lock)
21062117
read_lock_irqsave(&batched_entropy_reset_lock, flags);

lib/Kconfig.debug

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1209,6 +1209,22 @@ config STACKTRACE
12091209
It is also used by various kernel debugging features that require
12101210
stack trace generation.
12111211

1212+
config WARN_UNSEEDED_RANDOM
1213+
bool "Warn when kernel uses unseeded randomness"
1214+
default y
1215+
depends on DEBUG_KERNEL
1216+
help
1217+
Some parts of the kernel contain bugs relating to their use of
1218+
cryptographically secure random numbers before it's actually possible
1219+
to generate those numbers securely. This setting ensures that these
1220+
flaws don't go unnoticed, by enabling a message, should this ever
1221+
occur. This will allow people with obscure setups to know when things
1222+
are going wrong, so that they might contact developers about fixing
1223+
it.
1224+
1225+
Say Y here, unless you simply do not care about using unseeded
1226+
randomness and do not want a potential warning message in your logs.
1227+
12121228
config DEBUG_KOBJECT
12131229
bool "kobject debugging"
12141230
depends on DEBUG_KERNEL

0 commit comments

Comments
 (0)