android_kernel_sony_sdm845/drivers/char
Repository files (latest commit first)
Filename Latest commit message Latest commit date
George Spelvin 29da3bb1a8 random32: make prandom_u32() output unpredictable
commit c51f8f88d705e06bd696d7510aff22b33eb8e638 upstream.

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 ]
[wt: backported to 4.9 -- various context adjustments; timer API change]
Signed-off-by: Willy Tarreau <w@1wt.eu>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2020-11-18 18:26:29 +01:00
..
agp agp/intel: Fix a memory leak on module initialisation failure 2020-08-21 11:01:59 +02:00
hw_random hwrng: omap3-rom - Call clk_disable_unprepare() on exit only if not idled 2020-01-04 13:39:15 +01:00
ipmi ipmi: fix hung processes in __get_guid() 2020-04-24 07:59:00 +02:00
mwave char/mwave: fix potential Spectre v1 vulnerability 2019-01-31 08:12:34 +01:00
pcmcia pcmcia: remove left-over %Z format 2017-06-07 12:07:48 +02:00
tpm tpm: ibmvtpm: Wait for buffer to be set before proceeding 2020-10-01 20:40:09 +02:00
xilinx_hwicap
xillybus char: xillybus: Fix spelling mistake and comment 2016-08-31 14:47:54 +02:00
apm-emulation.c
applicom.c applicom: Fix potential Spectre v1 vulnerabilities 2019-03-13 14:04:54 -07:00
applicom.h
bfin-otp.c miscdevice: Use module_misc_device() macro 2016-08-31 14:12:35 +02:00
bsr.c
ds1302.c
ds1620.c
dsp56k.c dsp56k: prevent a harmless underflow 2016-07-14 16:21:53 +09:00
dtlk.c
efirtc.c
generic_nvram.c
hangcheck-timer.c
hpet.c hpet: Fix division by zero in hpet_time_div() 2019-08-04 09:33:43 +02:00
Kconfig tty: mark Siemens R3964 line discipline as BROKEN 2019-04-17 08:36:44 +02:00
lp.c char: lp: fix possible integer overflow in lp_setup() 2017-05-25 15:44:30 +02:00
Makefile RTC for 4.8 2016-08-05 09:48:22 -04:00
mbcs.c
mbcs.h
mem.c /dev/mem: Bail out upon SIGKILL. 2019-10-05 12:30:35 +02:00
misc.c
mmtimer.c
mspec.c
nsc_gpio.c
nvram.c
nwbutton.c
nwbutton.h
nwflash.c
pc8736x_gpio.c
powernv-op-panel.c powerpc/powernv: Add driver for operator panel on FSP machines 2016-06-29 17:33:46 +10:00
ppdev.c ppdev: fix PPGETTIME/PPSETTIME ioctls 2019-12-21 10:42:07 +01:00
ps3flash.c
random.c random32: make prandom_u32() output unpredictable 2020-11-18 18:26:29 +01:00
raw.c
rtc.c
scx200_gpio.c
snsc.c snsc: check return value of class_create 2016-08-31 14:47:54 +02:00
snsc.h
snsc_event.c
sonypi.c fs: Replace current_fs_time() with current_time() 2016-09-27 21:06:22 -04:00
tb0219.c mips: separate extable.h, switch module.h to it 2016-10-05 18:36:18 -04:00
tile-srom.c tile-srom: avoid krealloc(... __GFP_ZERO) pattern 2016-08-30 14:45:50 +02:00
tlclk.c drivers: char: tlclk.c: Avoid data race between init and interrupt handler 2020-10-01 20:40:12 +02:00
toshiba.c
ttyprintk.c ttyprintk: fix a potential deadlock in interrupt context issue 2020-02-05 13:05:47 +00:00
uv_mmtimer.c
virtio_console.c virtio: virtio_console: add missing MODULE_DEVICE_TABLE() for rproc serial 2020-07-22 09:10:53 +02:00