aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2017-06-07 23:06:55 -0400
committerTheodore Ts'o <tytso@mit.edu>2017-06-19 22:06:28 -0400
commitd06bfd1989fe97623b32d6df4ffa6e4338c99dc8 (patch)
tree26155c03fdfc23828c93712813a55f75b1b39e29
parent7aed9f72c3c70bdc18e72ec086c1a0eafdcd273f (diff)
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 <Jason@zx2c4.com> Signed-off-by: Theodore Ts'o <tytso@mit.edu>
-rw-r--r--drivers/char/random.c15
-rw-r--r--lib/Kconfig.debug16
2 files changed, 29 insertions, 2 deletions
diff --git a/drivers/char/random.c b/drivers/char/random.c
index 3853dd4f92e7..fa5bbd5a7ca0 100644
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -288,7 +288,6 @@
288#define SEC_XFER_SIZE 512 288#define SEC_XFER_SIZE 512
289#define EXTRACT_SIZE 10 289#define EXTRACT_SIZE 10
290 290
291#define DEBUG_RANDOM_BOOT 0
292 291
293#define LONGS(x) (((x) + sizeof(unsigned long) - 1)/sizeof(unsigned long)) 292#define LONGS(x) (((x) + sizeof(unsigned long) - 1)/sizeof(unsigned long))
294 293
@@ -1481,7 +1480,7 @@ void get_random_bytes(void *buf, int nbytes)
1481{ 1480{
1482 __u8 tmp[CHACHA20_BLOCK_SIZE]; 1481 __u8 tmp[CHACHA20_BLOCK_SIZE];
1483 1482
1484#if DEBUG_RANDOM_BOOT > 0 1483#ifdef CONFIG_WARN_UNSEEDED_RANDOM
1485 if (!crng_ready()) 1484 if (!crng_ready())
1486 printk(KERN_NOTICE "random: %pF get_random_bytes called " 1485 printk(KERN_NOTICE "random: %pF get_random_bytes called "
1487 "with crng_init = %d\n", (void *) _RET_IP_, crng_init); 1486 "with crng_init = %d\n", (void *) _RET_IP_, crng_init);
@@ -2075,6 +2074,12 @@ u64 get_random_u64(void)
2075 return ret; 2074 return ret;
2076#endif 2075#endif
2077 2076
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
2078 batch = &get_cpu_var(batched_entropy_u64); 2083 batch = &get_cpu_var(batched_entropy_u64);
2079 if (use_lock) 2084 if (use_lock)
2080 read_lock_irqsave(&batched_entropy_reset_lock, flags); 2085 read_lock_irqsave(&batched_entropy_reset_lock, flags);
@@ -2101,6 +2106,12 @@ u32 get_random_u32(void)
2101 if (arch_get_random_int(&ret)) 2106 if (arch_get_random_int(&ret))
2102 return ret; 2107 return ret;
2103 2108
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
2104 batch = &get_cpu_var(batched_entropy_u32); 2115 batch = &get_cpu_var(batched_entropy_u32);
2105 if (use_lock) 2116 if (use_lock)
2106 read_lock_irqsave(&batched_entropy_reset_lock, flags); 2117 read_lock_irqsave(&batched_entropy_reset_lock, flags);
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index e4587ebe52c7..c4159605bfbf 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -1209,6 +1209,22 @@ config STACKTRACE
1209 It is also used by various kernel debugging features that require 1209 It is also used by various kernel debugging features that require
1210 stack trace generation. 1210 stack trace generation.
1211 1211
1212config 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
1212config DEBUG_KOBJECT 1228config DEBUG_KOBJECT
1213 bool "kobject debugging" 1229 bool "kobject debugging"
1214 depends on DEBUG_KERNEL 1230 depends on DEBUG_KERNEL