George Spelvin c51f8f88d7 random32: make prandom_u32() output unpredictable
Non-cryptographic PRNGs may have great statistical properties, but
are usually trivially predictable to someone who knows the algorithm,
given a small sample of their output.  An LFSR like prandom_u32() is
particularly simple, even if the sample is widely scattered bits.

It turns out the network stack uses prandom_u32() for some things like
random port numbers which it would prefer are *not* trivially predictable.
Predictability led to a practical DNS spoofing attack.  Oops.

This patch replaces the LFSR with a homebrew cryptographic PRNG based
on the SipHash round function, which is in turn seeded with 128 bits
of strong random key.  (The authors of SipHash have *not* been consulted
about this abuse of their algorithm.)  Speed is prioritized over security;
attacks are rare, while performance is always wanted.

Replacing all callers of prandom_u32() is the quick fix.
Whether to reinstate a weaker PRNG for uses which can tolerate it
is an open question.

Commit f227e3ec3b5c ("random32: update the net random state on interrupt
and activity") was an earlier attempt at a solution.  This patch replaces
it.

Reported-by: Amit Klein <aksecurity@gmail.com>
Cc: Willy Tarreau <w@1wt.eu>
Cc: Eric Dumazet <edumazet@google.com>
Cc: "Jason A. Donenfeld" <Jason@zx2c4.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Kees Cook <keescook@chromium.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: tytso@mit.edu
Cc: Florian Westphal <fw@strlen.de>
Cc: Marc Plumb <lkml.mplumb@gmail.com>
Fixes: f227e3ec3b5c ("random32: update the net random state on interrupt and activity")
Signed-off-by: George Spelvin <lkml@sdf.org>
Link: https://lore.kernel.org/netdev/20200808152628.GA27941@SDF.ORG/
[ willy: partial reversal of f227e3ec3b5c; moved SIPROUND definitions
  to prandom.h for later use; merged George's prandom_seed() proposal;
  inlined siprand_u32(); replaced the net_rand_state[] array with 4
  members to fix a build issue; cosmetic cleanups to make checkpatch
  happy; fixed RANDOM32_SELFTEST build ]
Signed-off-by: Willy Tarreau <w@1wt.eu>
2020-10-24 20:21:57 +02:00
..
2020-10-23 16:38:36 -07:00
2020-10-21 10:34:10 -07:00
2020-10-15 10:01:51 -07:00
2020-10-14 10:32:10 -07:00
2020-10-16 12:21:15 -07:00
2020-10-19 14:28:30 -07:00
2020-10-15 14:43:29 -07:00
2020-10-12 13:26:49 -07:00
2020-10-14 15:56:58 -07:00
2020-10-23 13:56:34 -07:00
2020-10-14 16:09:32 -07:00
2020-10-13 12:12:44 -07:00
2020-10-23 10:54:13 -07:00
2020-10-17 11:18:18 -07:00
2020-10-20 09:35:06 -07:00
2020-10-14 15:56:58 -07:00
2020-10-16 12:21:15 -07:00
2020-10-15 14:43:29 -07:00
2020-10-14 12:08:34 -07:00
2020-10-14 15:15:35 -07:00
2020-10-14 15:56:58 -07:00
2020-10-22 12:41:00 -07:00
2020-10-13 12:12:44 -07:00
2020-10-20 10:36:41 -07:00
2020-10-13 13:04:41 -07:00
2020-10-22 13:00:44 -07:00
2020-10-22 12:41:00 -07:00
2020-10-23 10:54:13 -07:00
2020-10-22 12:56:33 -07:00
2020-10-22 12:58:21 -07:00
2020-10-21 11:22:08 -07:00
2020-10-23 16:19:02 -07:00
2020-10-01 22:59:55 +02:00
2020-10-15 11:07:44 -07:00
2020-10-22 12:41:00 -07:00
2020-10-23 16:19:02 -07:00
2020-10-16 12:40:55 -07:00
2020-10-15 14:43:29 -07:00
2020-10-23 11:00:57 -07:00
2020-10-22 13:00:44 -07:00
2020-10-23 11:00:57 -07:00
2020-10-21 11:28:43 -07:00
2020-10-20 09:24:01 -07:00