From: Greg Kroah-Hartman Date: Sun, 29 Apr 2018 10:35:53 +0000 (+0200) Subject: 4.9-stable patches X-Git-Tag: v4.16.7~41 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4ff98f26af382a16fb894f4861cb9a94077a0113;p=thirdparty%2Fkernel%2Fstable-queue.git 4.9-stable patches added patches: random-set-up-the-numa-crng-instances-after-the-crng-is-fully-initialized.patch --- diff --git a/queue-4.9/random-set-up-the-numa-crng-instances-after-the-crng-is-fully-initialized.patch b/queue-4.9/random-set-up-the-numa-crng-instances-after-the-crng-is-fully-initialized.patch new file mode 100644 index 00000000000..1b4bcfdadb8 --- /dev/null +++ b/queue-4.9/random-set-up-the-numa-crng-instances-after-the-crng-is-fully-initialized.patch @@ -0,0 +1,99 @@ +From 8ef35c866f8862df074a49a93b0309725812dea8 Mon Sep 17 00:00:00 2001 +From: Theodore Ts'o +Date: Wed, 11 Apr 2018 15:23:56 -0400 +Subject: random: set up the NUMA crng instances after the CRNG is fully initialized + +From: Theodore Ts'o + +commit 8ef35c866f8862df074a49a93b0309725812dea8 upstream. + +Until the primary_crng is fully initialized, don't initialize the NUMA +crng nodes. Otherwise users of /dev/urandom on NUMA systems before +the CRNG is fully initialized can get very bad quality randomness. Of +course everyone should move to getrandom(2) where this won't be an +issue, but there's a lot of legacy code out there. This related to +CVE-2018-1108. + +Reported-by: Jann Horn +Fixes: 1e7f583af67b ("random: make /dev/urandom scalable for silly...") +Cc: stable@kernel.org # 4.8+ +Signed-off-by: Theodore Ts'o +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/char/random.c | 46 +++++++++++++++++++++++++++------------------- + 1 file changed, 27 insertions(+), 19 deletions(-) + +--- a/drivers/char/random.c ++++ b/drivers/char/random.c +@@ -819,6 +819,32 @@ static int crng_fast_load(const char *cp + return 1; + } + ++#ifdef CONFIG_NUMA ++static void numa_crng_init(void) ++{ ++ int i; ++ struct crng_state *crng; ++ struct crng_state **pool; ++ ++ pool = kcalloc(nr_node_ids, sizeof(*pool), GFP_KERNEL|__GFP_NOFAIL); ++ for_each_online_node(i) { ++ crng = kmalloc_node(sizeof(struct crng_state), ++ GFP_KERNEL | __GFP_NOFAIL, i); ++ spin_lock_init(&crng->lock); ++ crng_initialize(crng); ++ pool[i] = crng; ++ } ++ mb(); ++ if (cmpxchg(&crng_node_pool, NULL, pool)) { ++ for_each_node(i) ++ kfree(pool[i]); ++ kfree(pool); ++ } ++} ++#else ++static void numa_crng_init(void) {} ++#endif ++ + static void crng_reseed(struct crng_state *crng, struct entropy_store *r) + { + unsigned long flags; +@@ -848,6 +874,7 @@ static void crng_reseed(struct crng_stat + memzero_explicit(&buf, sizeof(buf)); + crng->init_time = jiffies; + if (crng == &primary_crng && crng_init < 2) { ++ numa_crng_init(); + crng_init = 2; + process_random_ready_list(); + wake_up_interruptible(&crng_init_wait); +@@ -1661,29 +1688,10 @@ static void init_std_data(struct entropy + */ + static int rand_initialize(void) + { +-#ifdef CONFIG_NUMA +- int i; +- struct crng_state *crng; +- struct crng_state **pool; +-#endif +- + init_std_data(&input_pool); + init_std_data(&blocking_pool); + crng_initialize(&primary_crng); + crng_global_init_time = jiffies; +- +-#ifdef CONFIG_NUMA +- pool = kcalloc(nr_node_ids, sizeof(*pool), GFP_KERNEL|__GFP_NOFAIL); +- for_each_online_node(i) { +- crng = kmalloc_node(sizeof(struct crng_state), +- GFP_KERNEL | __GFP_NOFAIL, i); +- spin_lock_init(&crng->lock); +- crng_initialize(crng); +- pool[i] = crng; +- } +- mb(); +- crng_node_pool = pool; +-#endif + return 0; + } + early_initcall(rand_initialize); diff --git a/queue-4.9/series b/queue-4.9/series index d513c14b1c0..e220dacddc5 100644 --- a/queue-4.9/series +++ b/queue-4.9/series @@ -2,3 +2,4 @@ ext4-prevent-right-shifting-extents-beyond-ext_max_blocks.patch ext4-set-h_journal-if-there-is-a-failure-starting-a-reserved-handle.patch ext4-add-validity-checks-for-bitmap-block-numbers.patch ext4-fix-bitmap-position-validation.patch +random-set-up-the-numa-crng-instances-after-the-crng-is-fully-initialized.patch