04 Aug, 2020

1 commit

  • The addition of percpu.h to the list of includes in random.h revealed
    some circular dependencies on arm64 and possibly other platforms. This
    include was added solely for the pseudo-random definitions, which have
    nothing to do with the rest of the definitions in this file but are
    still there for legacy reasons.

    This patch moves the pseudo-random parts to linux/prandom.h and the
    percpu.h include with it, which is now guarded by _LINUX_PRANDOM_H and
    protected against recursive inclusion.

    A further cleanup step would be to remove this from
    entirely, and make people who use the prandom infrastructure include
    just the new header file. That's a bit of a churn patch, but grepping
    for "prandom_" and "next_pseudo_random32" "struct rnd_state" should
    catch most users.

    But it turns out that that nice cleanup step is fairly painful, because
    a _lot_ of code currently seems to depend on the implicit include of
    , which can currently come in a lot of ways, including
    such fairly core headfers as .

    So the "nice cleanup" part may or may never happen.

    Fixes: 1c9df907da83 ("random: fix circular include dependency on arm64 after addition of percpu.h")
    Tested-by: Guenter Roeck
    Acked-by: Willy Tarreau
    Signed-off-by: Linus Torvalds

    Linus Torvalds
     

31 Jul, 2020

1 commit

  • Daniel Díaz and Kees Cook independently reported that commit
    f227e3ec3b5c ("random32: update the net random state on interrupt and
    activity") broke arm64 due to a circular dependency on include files
    since the addition of percpu.h in random.h.

    The correct fix would definitely be to move all the prandom32 stuff out
    of random.h but for backporting, a smaller solution is preferred.

    This one replaces linux/percpu.h with asm/percpu.h, and this fixes the
    problem on x86_64, arm64, arm, and mips. Note that moving percpu.h
    around didn't change anything and that removing it entirely broke
    differently. When backporting, such options might still be considered
    if this patch fails to help.

    [ It turns out that an alternate fix seems to be to just remove the
    troublesome remove from the arm64
    that causes the circular dependency.

    But we might as well do the whole belt-and-suspenders thing, and
    minimize inclusion in too. Either will fix the
    problem, and both are good changes. - Linus ]

    Reported-by: Daniel Díaz
    Reported-by: Kees Cook
    Tested-by: Marc Zyngier
    Fixes: f227e3ec3b5c
    Cc: Stephen Rothwell
    Signed-off-by: Willy Tarreau
    Signed-off-by: Linus Torvalds

    Willy Tarreau
     

30 Jul, 2020

2 commits

  • It turns out that the plugin right now ends up being really unhappy
    about the change from 'static' to 'extern' storage that happened in
    commit f227e3ec3b5c ("random32: update the net random state on interrupt
    and activity").

    This is probably a trivial fix for the latent_entropy plugin, but for
    now, just remove net_rand_state from the list of things the plugin
    worries about.

    Reported-by: Stephen Rothwell
    Cc: Emese Revfy
    Cc: Kees Cook
    Cc: Willy Tarreau
    Signed-off-by: Linus Torvalds

    Linus Torvalds
     
  • This modifies the first 32 bits out of the 128 bits of a random CPU's
    net_rand_state on interrupt or CPU activity to complicate remote
    observations that could lead to guessing the network RNG's internal
    state.

    Note that depending on some network devices' interrupt rate moderation
    or binding, this re-seeding might happen on every packet or even almost
    never.

    In addition, with NOHZ some CPUs might not even get timer interrupts,
    leaving their local state rarely updated, while they are running
    networked processes making use of the random state. For this reason, we
    also perform this update in update_process_times() in order to at least
    update the state when there is user or system activity, since it's the
    only case we care about.

    Reported-by: Amit Klein
    Suggested-by: Linus Torvalds
    Cc: Eric Dumazet
    Cc: "Jason A. Donenfeld"
    Cc: Andy Lutomirski
    Cc: Kees Cook
    Cc: Thomas Gleixner
    Cc: Peter Zijlstra
    Cc:
    Signed-off-by: Willy Tarreau
    Signed-off-by: Linus Torvalds

    Willy Tarreau
     

28 Feb, 2020

1 commit

  • Some architectures (e.g. arm64) can have heterogeneous CPUs, and the
    boot CPU may be able to provide entropy while secondary CPUs cannot. On
    such systems, arch_get_random_long() and arch_get_random_seed_long()
    will fail unless support for RNG instructions has been detected on all
    CPUs. This prevents the boot CPU from being able to provide
    (potentially) trusted entropy when seeding the primary CRNG.

    To make it possible to seed the primary CRNG from the boot CPU without
    adversely affecting the runtime versions of arch_get_random_long() and
    arch_get_random_seed_long(), this patch adds new early versions of the
    functions used when initializing the primary CRNG.

    Default implementations are provided atop of the existing
    arch_get_random_long() and arch_get_random_seed_long() so that only
    architectures with such constraints need to provide the new helpers.

    There should be no functional change as a result of this patch.

    Signed-off-by: Mark Rutland
    Cc: Mark Brown
    Cc: Theodore Ts'o
    Link: https://lore.kernel.org/r/20200210130015.17664-3-mark.rutland@arm.com
    Signed-off-by: Theodore Ts'o

    Mark Rutland
     

26 Jan, 2020

3 commits

  • We must not use the pointer output without validating the
    success of the random read.

    Reviewed-by: Ard Biesheuvel
    Signed-off-by: Richard Henderson
    Signed-off-by: Mark Brown
    Link: https://lore.kernel.org/r/20200110145422.49141-7-broonie@kernel.org
    Signed-off-by: Theodore Ts'o

    Richard Henderson
     
  • Keep the generic fallback versions in sync with the other architecture
    specific implementations and use the proper name for false.

    Suggested-by: Ard Biesheuvel
    Signed-off-by: Richard Henderson
    Signed-off-by: Mark Brown
    Link: https://lore.kernel.org/r/20200110145422.49141-6-broonie@kernel.org
    Signed-off-by: Theodore Ts'o

    Richard Henderson
     
  • The arm64 version of archrandom.h will need to be able to test for
    support and read the random number without preemption, so a separate
    query predicate is not practical.

    Since this part of the generic interface is unused, remove it.

    Signed-off-by: Richard Henderson
    Signed-off-by: Mark Brown
    Link: https://lore.kernel.org/r/20200110145422.49141-5-broonie@kernel.org
    Signed-off-by: Theodore Ts'o

    Richard Henderson
     

23 Aug, 2019

1 commit

  • Introducing a chosen node, rng-seed, which is an entropy that can be
    passed to kernel called very early to increase initial device
    randomness. Bootloader should provide this entropy and the value is
    read from /chosen/rng-seed in DT.

    Obtain of_fdt_crc32 for CRC check after early_init_dt_scan_nodes(),
    since early_init_dt_scan_chosen() would modify fdt to erase rng-seed.

    Add a new interface add_bootloader_randomness() for rng-seed use case.
    Depends on whether the seed is trustworthy, rng seed would be passed to
    add_hwgenerator_randomness(). Otherwise it would be passed to
    add_device_randomness(). Decision is controlled by kernel config
    RANDOM_TRUST_BOOTLOADER.

    Signed-off-by: Hsin-Yi Wang
    Reviewed-by: Stephen Boyd
    Reviewed-by: Rob Herring
    Reviewed-by: Theodore Ts'o # drivers/char/random.c
    Signed-off-by: Will Deacon

    Hsin-Yi Wang
     

18 May, 2019

1 commit

  • Pull more s390 updates from Martin Schwidefsky:

    - Enhancements for the QDIO layer

    - Remove the RCP trace event

    - Avoid three build issues

    - Move the defconfig to the configs directory

    * tag 's390-5.2-2' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
    s390: move arch/s390/defconfig to arch/s390/configs/defconfig
    s390/qdio: optimize state inspection of HW-owned SBALs
    s390/qdio: use get_buf_state() in debug_get_buf_state()
    s390/qdio: allow to scan all Output SBALs in one go
    s390/cio: Remove tracing for rchp instruction
    s390/kasan: adapt disabled_wait usage to avoid build error
    latent_entropy: avoid build error when plugin cflags are not set
    s390/boot: fix compiler error due to missing awk strtonum

    Linus Torvalds
     

08 May, 2019

1 commit

  • Some architectures set up CFLAGS for linux decompressor phase from
    scratch and do not include GCC_PLUGINS_CFLAGS. Since "latent_entropy"
    variable declaration is generated by the plugin code itself including
    linux/random.h in decompressor code then would cause a build
    error. E.g. on s390:

    In file included from ./include/linux/net.h:22,
    from ./include/linux/skbuff.h:29,
    from ./include/linux/if_ether.h:23,
    from ./arch/s390/include/asm/diag.h:12,
    from arch/s390/boot/startup.c:8:
    ./include/linux/random.h: In function 'add_latent_entropy':
    ./include/linux/random.h:26:39: error: 'latent_entropy' undeclared
    (first use in this function); did you mean 'add_latent_entropy'?
    26 | add_device_randomness((const void *)&latent_entropy,
    | ^~~~~~~~~~~~~~
    | add_latent_entropy
    ./include/linux/random.h:26:39: note: each undeclared identifier is
    reported only once for each function it appears in

    The build error is triggered by commit a80313ff91ab ("s390/kernel:
    introduce .dma sections") which made it into 5.2 merge window.

    To address that avoid using CONFIG_GCC_PLUGIN_LATENT_ENTROPY in
    favour of LATENT_ENTROPY_PLUGIN definition which is defined as a
    part of gcc plugins cflags and hence reflect more accurately when gcc
    plugin is active. Besides that it is also used for similar purpose in
    linux/compiler-gcc.h for latent_entropy attribute definition.

    Signed-off-by: Vasily Gorbik
    Acked-by: Kees Cook
    Signed-off-by: Martin Schwidefsky

    Vasily Gorbik
     

20 Apr, 2019

1 commit

  • Right now rand_initialize() is run as an early_initcall(), but it only
    depends on timekeeping_init() (for mixing ktime_get_real() into the
    pools). However, the call to boot_init_stack_canary() for stack canary
    initialization runs earlier, which triggers a warning at boot:

    random: get_random_bytes called from start_kernel+0x357/0x548 with crng_init=0

    Instead, this moves rand_initialize() to after timekeeping_init(), and moves
    canary initialization here as well.

    Note that this warning may still remain for machines that do not have
    UEFI RNG support (which initializes the RNG pools during setup_arch()),
    or for x86 machines without RDRAND (or booting without "random.trust=on"
    or CONFIG_RANDOM_TRUST_CPU=y).

    Signed-off-by: Kees Cook
    Signed-off-by: Theodore Ts'o

    Kees Cook
     

03 Aug, 2018

1 commit

  • It is very useful to be able to know whether or not get_random_bytes_wait
    / wait_for_random_bytes is going to block or not, or whether plain
    get_random_bytes is going to return good randomness or bad randomness.

    The particular use case is for mitigating certain attacks in WireGuard.
    A handshake packet arrives and is queued up. Elsewhere a worker thread
    takes items from the queue and processes them. In replying to these
    items, it needs to use some random data, and it has to be good random
    data. If we simply block until we can have good randomness, then it's
    possible for an attacker to fill the queue up with packets waiting to be
    processed. Upon realizing the queue is full, WireGuard will detect that
    it's under a denial of service attack, and behave accordingly. A better
    approach is just to drop incoming handshake packets if the crng is not
    yet initialized.

    This patch, therefore, makes that information directly accessible.

    Signed-off-by: Jason A. Donenfeld
    Signed-off-by: Theodore Ts'o

    Jason A. Donenfeld
     

18 Jul, 2018

1 commit

  • Currently the function get_random_bytes_arch() has return value 'void'.
    If the hw RNG fails we currently fall back to using get_random_bytes().
    This defeats the purpose of requesting random material from the hw RNG
    in the first place.

    There are currently no intree users of get_random_bytes_arch().

    Only get random bytes from the hw RNG, make function return the number
    of bytes retrieved from the hw RNG.

    Acked-by: Theodore Ts'o
    Reviewed-by: Steven Rostedt (VMware)
    Signed-off-by: Tobin C. Harding
    Signed-off-by: Theodore Ts'o

    Tobin C. Harding
     

01 Mar, 2018

1 commit

  • In the unfortunate event that a developer fails to check the return
    value of get_random_bytes_wait, or simply wants to make a "best effort"
    attempt, for whatever that's worth, it's much better to still fill the
    buffer with _something_ rather than catastrophically failing in the case
    of an interruption. This is both a defense in depth measure against
    inevitable programming bugs, as well as a means of making the API a bit
    more useful.

    Signed-off-by: Jason A. Donenfeld
    Signed-off-by: Theodore Ts'o

    Jason A. Donenfeld
     

02 Nov, 2017

1 commit

  • Many source files in the tree are missing licensing information, which
    makes it harder for compliance tools to determine the correct license.

    By default all files without license information are under the default
    license of the kernel, which is GPL version 2.

    Update the files which contain no license information with the 'GPL-2.0'
    SPDX license identifier. The SPDX identifier is a legally binding
    shorthand, which can be used instead of the full boiler plate text.

    This patch is based on work done by Thomas Gleixner and Kate Stewart and
    Philippe Ombredanne.

    How this work was done:

    Patches were generated and checked against linux-4.14-rc6 for a subset of
    the use cases:
    - file had no licensing information it it.
    - file was a */uapi/* one with no licensing information in it,
    - file was a */uapi/* one with existing licensing information,

    Further patches will be generated in subsequent months to fix up cases
    where non-standard license headers were used, and references to license
    had to be inferred by heuristics based on keywords.

    The analysis to determine which SPDX License Identifier to be applied to
    a file was done in a spreadsheet of side by side results from of the
    output of two independent scanners (ScanCode & Windriver) producing SPDX
    tag:value files created by Philippe Ombredanne. Philippe prepared the
    base worksheet, and did an initial spot review of a few 1000 files.

    The 4.13 kernel was the starting point of the analysis with 60,537 files
    assessed. Kate Stewart did a file by file comparison of the scanner
    results in the spreadsheet to determine which SPDX license identifier(s)
    to be applied to the file. She confirmed any determination that was not
    immediately clear with lawyers working with the Linux Foundation.

    Criteria used to select files for SPDX license identifier tagging was:
    - Files considered eligible had to be source code files.
    - Make and config files were included as candidates if they contained >5
    lines of source
    - File already had some variant of a license header in it (even if
    Reviewed-by: Philippe Ombredanne
    Reviewed-by: Thomas Gleixner
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     

16 Jul, 2017

1 commit

  • Pull random updates from Ted Ts'o:
    "Add wait_for_random_bytes() and get_random_*_wait() functions so that
    callers can more safely get random bytes if they can block until the
    CRNG is initialized.

    Also print a warning if get_random_*() is called before the CRNG is
    initialized. By default, only one single-line warning will be printed
    per boot. If CONFIG_WARN_ALL_UNSEEDED_RANDOM is defined, then a
    warning will be printed for each function which tries to get random
    bytes before the CRNG is initialized. This can get spammy for certain
    architecture types, so it is not enabled by default"

    * tag 'random_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/random:
    random: reorder READ_ONCE() in get_random_uXX
    random: suppress spammy warnings about unseeded randomness
    random: warn when kernel uses unseeded randomness
    net/route: use get_random_int for random counter
    net/neighbor: use get_random_u32 for 32-bit hash random
    rhashtable: use get_random_u32 for hash_rnd
    ceph: ensure RNG is seeded before using
    iscsi: ensure RNG is seeded before use
    cifs: use get_random_u32 for 32-bit lock random
    random: add get_random_{bytes,u32,u64,int,long,once}_wait family
    random: add wait_for_random_bytes() API

    Linus Torvalds
     

13 Jul, 2017

1 commit

  • Patch series "stackprotector: ascii armor the stack canary", v2.

    Zero out the first byte of the stack canary value on 64 bit systems, in
    order to mitigate unterminated C string overflows.

    The null byte both prevents C string functions from reading the canary,
    and from writing it if the canary value were guessed or obtained through
    some other means.

    Reducing the entropy by 8 bits is acceptable on 64-bit systems, which
    will still have 56 bits of entropy left, but not on 32 bit systems, so
    the "ascii armor" canary is only implemented on 64-bit systems.

    Inspired by the "ascii armor" code in execshield and Daniel Micay's
    linux-hardened tree.

    Also see https://github.com/thestinger/linux-hardened/

    This patch (of 5):

    Introduce get_random_canary(), which provides a random unsigned long
    canary value with the first byte zeroed out on 64 bit architectures, in
    order to mitigate non-terminated C string overflows.

    The null byte both prevents C string functions from reading the canary,
    and from writing it if the canary value were guessed or obtained through
    some other means.

    Reducing the entropy by 8 bits is acceptable on 64-bit systems, which
    will still have 56 bits of entropy left, but not on 32 bit systems, so
    the "ascii armor" canary is only implemented on 64-bit systems.

    Inspired by the "ascii armor" code in the old execshield patches, and
    Daniel Micay's linux-hardened tree.

    Link: http://lkml.kernel.org/r/20170524155751.424-2-riel@redhat.com
    Signed-off-by: Rik van Riel
    Acked-by: Kees Cook
    Cc: Daniel Micay
    Cc: "Theodore Ts'o"
    Cc: H. Peter Anvin
    Cc: Andy Lutomirski
    Cc: Ingo Molnar
    Cc: Catalin Marinas
    Cc: Yoshinori Sato
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Rik van Riel
     

20 Jun, 2017

2 commits


28 Jan, 2017

2 commits

  • Many times, when a user wants a random number, he wants a random number
    of a guaranteed size. So, thinking of get_random_int and get_random_long
    in terms of get_random_u32 and get_random_u64 makes it much easier to
    achieve this. It also makes the code simpler.

    On 32-bit platforms, get_random_int and get_random_long are both aliased
    to get_random_u32. On 64-bit platforms, int->u32 and long->u64.

    Signed-off-by: Jason A. Donenfeld
    Cc: Greg Kroah-Hartman
    Cc: Theodore Ts'o
    Signed-off-by: Theodore Ts'o

    Jason A. Donenfeld
     
  • Now that our crng uses chacha20, we can rely on its speedy
    characteristics for replacing MD5, while simultaneously achieving a
    higher security guarantee. Before the idea was to use these functions if
    you wanted random integers that aren't stupidly insecure but aren't
    necessarily secure either, a vague gray zone, that hopefully was "good
    enough" for its users. With chacha20, we can strengthen this claim,
    since either we're using an rdrand-like instruction, or we're using the
    same crng as /dev/urandom. And it's faster than what was before.

    We could have chosen to replace this with a SipHash-derived function,
    which might be slightly faster, but at the cost of having yet another
    RNG construction in the kernel. By moving to chacha20, we have a single
    RNG to analyze and verify, and we also already get good performance
    improvements on all platforms.

    Implementation-wise, rather than use a generic buffer for both
    get_random_int/long and memcpy based on the size needs, we use a
    specific buffer for 32-bit reads and for 64-bit reads. This way, we're
    guaranteed to always have aligned accesses on all platforms. While
    slightly more verbose in C, the assembly this generates is a lot
    simpler than otherwise.

    Finally, on 32-bit platforms where longs and ints are the same size,
    we simply alias get_random_int to get_random_long.

    Signed-off-by: Jason A. Donenfeld
    Suggested-by: Theodore Ts'o
    Cc: Theodore Ts'o
    Cc: Hannes Frederic Sowa
    Cc: Andy Lutomirski
    Signed-off-by: Theodore Ts'o

    Jason A. Donenfeld
     

16 Oct, 2016

1 commit

  • Pull gcc plugins update from Kees Cook:
    "This adds a new gcc plugin named "latent_entropy". It is designed to
    extract as much possible uncertainty from a running system at boot
    time as possible, hoping to capitalize on any possible variation in
    CPU operation (due to runtime data differences, hardware differences,
    SMP ordering, thermal timing variation, cache behavior, etc).

    At the very least, this plugin is a much more comprehensive example
    for how to manipulate kernel code using the gcc plugin internals"

    * tag 'gcc-plugins-v4.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux:
    latent_entropy: Mark functions with __latent_entropy
    gcc-plugins: Add latent_entropy plugin

    Linus Torvalds
     

12 Oct, 2016

2 commits

  • All call sites for randomize_range have been updated to use the much
    simpler and more robust randomize_addr(). Remove the now unnecessary
    code.

    Link: http://lkml.kernel.org/r/20160803233913.32511-8-jason@lakedaemon.net
    Signed-off-by: Jason Cooper
    Acked-by: Kees Cook
    Cc: "Theodore Ts'o"
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Jason Cooper
     
  • To date, all callers of randomize_range() have set the length to 0, and
    check for a zero return value. For the current callers, the only way to
    get zero returned is if end
    Cc: Nick Kralevich
    Cc: Jeffrey Vander Stoep
    Cc: Daniel Cashman
    Cc: Chris Metcalf
    Cc: Guan Xuetao
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Jason Cooper
     

11 Oct, 2016

2 commits

  • The __latent_entropy gcc attribute can be used only on functions and
    variables. If it is on a function then the plugin will instrument it for
    gathering control-flow entropy. If the attribute is on a variable then
    the plugin will initialize it with random contents. The variable must
    be an integer, an integer array type or a structure with integer fields.

    These specific functions have been selected because they are init
    functions (to help gather boot-time entropy), are called at unpredictable
    times, or they have variable loops, each of which provide some level of
    latent entropy.

    Signed-off-by: Emese Revfy
    [kees: expanded commit message]
    Signed-off-by: Kees Cook

    Emese Revfy
     
  • This adds a new gcc plugin named "latent_entropy". It is designed to
    extract as much possible uncertainty from a running system at boot time as
    possible, hoping to capitalize on any possible variation in CPU operation
    (due to runtime data differences, hardware differences, SMP ordering,
    thermal timing variation, cache behavior, etc).

    At the very least, this plugin is a much more comprehensive example for
    how to manipulate kernel code using the gcc plugin internals.

    The need for very-early boot entropy tends to be very architecture or
    system design specific, so this plugin is more suited for those sorts
    of special cases. The existing kernel RNG already attempts to extract
    entropy from reliable runtime variation, but this plugin takes the idea to
    a logical extreme by permuting a global variable based on any variation
    in code execution (e.g. a different value (and permutation function)
    is used to permute the global based on loop count, case statement,
    if/then/else branching, etc).

    To do this, the plugin starts by inserting a local variable in every
    marked function. The plugin then adds logic so that the value of this
    variable is modified by randomly chosen operations (add, xor and rol) and
    random values (gcc generates separate static values for each location at
    compile time and also injects the stack pointer at runtime). The resulting
    value depends on the control flow path (e.g., loops and branches taken).

    Before the function returns, the plugin mixes this local variable into
    the latent_entropy global variable. The value of this global variable
    is added to the kernel entropy pool in do_one_initcall() and _do_fork(),
    though it does not credit any bytes of entropy to the pool; the contents
    of the global are just used to mix the pool.

    Additionally, the plugin can pre-initialize arrays with build-time
    random contents, so that two different kernel builds running on identical
    hardware will not have the same starting values.

    Signed-off-by: Emese Revfy
    [kees: expanded commit message and code comments]
    Signed-off-by: Kees Cook

    Emese Revfy
     

09 Jun, 2016

1 commit

  • The gcc people have confirmed that using "bool" when combined with
    inline assembly always is treated as a byte-sized operand that can be
    assumed to be 0 or 1, which is exactly what the SET instruction
    emits. Change the output types and intermediate variables of as many
    operations as practical to "bool".

    Signed-off-by: H. Peter Anvin
    Link: http://lkml.kernel.org/r/1465414726-197858-3-git-send-email-hpa@linux.intel.com
    Reviewed-by: Andy Lutomirski
    Reviewed-by: Borislav Petkov
    Acked-by: Peter Zijlstra (Intel)

    H. Peter Anvin
     

21 May, 2016

1 commit

  • Let's gather the UUID related functions under one hood.

    Signed-off-by: Andy Shevchenko
    Reviewed-by: Matt Fleming
    Cc: Dmitry Kasatkin
    Cc: Mimi Zohar
    Cc: Rasmus Villemoes
    Cc: Arnd Bergmann
    Cc: "Theodore Ts'o"
    Cc: Al Viro
    Cc: Jens Axboe
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Andy Shevchenko
     

28 Feb, 2016

1 commit

  • Commit d07e22597d1d ("mm: mmap: add new /proc tunable for mmap_base
    ASLR") added the ability to choose from a range of values to use for
    entropy count in generating the random offset to the mmap_base address.

    The maximum value on this range was set to 32 bits for 64-bit x86
    systems, but this value could be increased further, requiring more than
    the 32 bits of randomness provided by get_random_int(), as is already
    possible for arm64. Add a new function: get_random_long() which more
    naturally fits with the mmap usage of get_random_int() but operates
    exactly the same as get_random_int().

    Also, fix the shifting constant in mmap_rnd() to be an unsigned long so
    that values greater than 31 bits generate an appropriate mask without
    overflow. This is especially important on x86, as its shift instruction
    uses a 5-bit mask for the shift operand, which meant that any value for
    mmap_rnd_bits over 31 acts as a no-op and effectively disables mmap_base
    randomization.

    Finally, replace calls to get_random_int() with get_random_long() where
    appropriate.

    This patch (of 2):

    Add get_random_long().

    Signed-off-by: Daniel Cashman
    Acked-by: Kees Cook
    Cc: "Theodore Ts'o"
    Cc: Arnd Bergmann
    Cc: Greg Kroah-Hartman
    Cc: Catalin Marinas
    Cc: Will Deacon
    Cc: Ralf Baechle
    Cc: Benjamin Herrenschmidt
    Cc: Paul Mackerras
    Cc: Michael Ellerman
    Cc: David S. Miller
    Cc: Thomas Gleixner
    Cc: Ingo Molnar
    Cc: H. Peter Anvin
    Cc: Al Viro
    Cc: Nick Kralevich
    Cc: Jeff Vander Stoep
    Cc: Mark Salyzyn
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Daniel Cashman
     

08 Oct, 2015

1 commit

  • Add a prandom_init_once() facility that works on the rnd_state, so that
    users that are keeping their own state independent from prandom_u32() can
    initialize their taus113 per cpu states.

    The motivation here is similar to net_get_random_once(): initialize the
    state as late as possible in the hope that enough entropy has been
    collected for the seeding. prandom_init_once() makes use of the recently
    introduced prandom_seed_full_state() helper and is generic enough so that
    it could also be used on fast-paths due to the DO_ONCE().

    Signed-off-by: Daniel Borkmann
    Acked-by: Hannes Frederic Sowa
    Acked-by: Alexei Starovoitov
    Signed-off-by: David S. Miller

    Daniel Borkmann
     

10 Jun, 2015

2 commits

  • This patch removes the kernel blocking API as it has been completely
    replaced by the callback API.

    Signed-off-by: Herbert Xu

    Herbert Xu
     
  • The get_blocking_random_bytes API is broken because the wait can
    be arbitrarily long (potentially forever) so there is no safe way
    of calling it from within the kernel.

    This patch replaces it with a callback API instead. The callback
    is invoked potentially from interrupt context so the user needs
    to schedule their own work thread if necessary.

    In addition to adding callbacks, they can also be removed as
    otherwise this opens up a way for user-space to allocate kernel
    memory with no bound (by opening algif_rng descriptors and then
    closing them).

    Signed-off-by: Herbert Xu

    Herbert Xu
     

27 May, 2015

1 commit


25 Aug, 2014

1 commit

  • This patch addresses a couple of minor items, mostly addesssing
    prandom_bytes(): 1) prandom_bytes{,_state}() should use size_t
    for length arguments, 2) We can use put_unaligned() when filling
    the array instead of open coding it [ perhaps some archs will
    further benefit from their own arch specific implementation when
    GCC cannot make up for it ], 3) Fix a typo, 4) Better use unsigned
    int as type for getting the arch seed, 5) Make use of
    prandom_u32_max() for timer slack.

    Regarding the change to put_unaligned(), callers of prandom_bytes()
    which internally invoke prandom_bytes_state(), don't bother as
    they expect the array to be filled randomly and don't have any
    control of the internal state what-so-ever (that's also why we
    have periodic reseeding there, etc), so they really don't care.

    Now for the direct callers of prandom_bytes_state(), which
    are solely located in test cases for MTD devices, that is,
    drivers/mtd/tests/{oobtest.c,pagetest.c,subpagetest.c}:

    These tests basically fill a test write-vector through
    prandom_bytes_state() with an a-priori defined seed each time
    and write that to a MTD device. Later on, they set up a read-vector
    and read back that blocks from the device. So in the verification
    phase, the write-vector is being re-setup [ so same seed and
    prandom_bytes_state() called ], and then memcmp()'ed against the
    read-vector to check if the data is the same.

    Akinobu, Lothar and I also tested this patch and it runs through
    the 3 relevant MTD test cases w/o any errors on the nandsim device
    (simulator for MTD devs) for x86_64, ppc64, ARM (i.MX28, i.MX53
    and i.MX6):

    # modprobe nandsim first_id_byte=0x20 second_id_byte=0xac \
    third_id_byte=0x00 fourth_id_byte=0x15
    # modprobe mtd_oobtest dev=0
    # modprobe mtd_pagetest dev=0
    # modprobe mtd_subpagetest dev=0

    We also don't have any users depending directly on a particular
    result of the PRNG (except the PRNG self-test itself), and that's
    just fine as it e.g. allowed us easily to do things like upgrading
    from taus88 to taus113.

    Signed-off-by: Daniel Borkmann
    Tested-by: Akinobu Mita
    Tested-by: Lothar Waßmann
    Cc: Hannes Frederic Sowa
    Signed-off-by: David S. Miller

    Daniel Borkmann
     

20 Mar, 2014

2 commits

  • Add predicate functions for having arch_get_random[_seed]*(). The
    only current use is to avoid the loop in arch_random_refill() when
    arch_get_random_seed_long() is unavailable.

    Signed-off-by: H. Peter Anvin
    Cc: Benjamin Herrenschmidt
    Cc: Paul Mackerras
    Cc: Michael Ellerman
    Signed-off-by: Theodore Ts'o

    H. Peter Anvin
     
  • Upcoming Intel silicon adds a new RDSEED instruction, which is similar
    to RDRAND but provides a stronger guarantee: unlike RDRAND, RDSEED
    will always reseed the PRNG from the true random number source between
    each read. Thus, the output of RDSEED is guaranteed to be 100%
    entropic, unlike RDRAND which is only architecturally guaranteed to be
    1/512 entropic (although in practice is much more.)

    The RDSEED instruction takes the same time to execute as RDRAND, but
    RDSEED unlike RDRAND can legitimately return failure (CF=0) due to
    entropy exhaustion if too many threads on too many cores are hammering
    the RDSEED instruction at the same time. Therefore, we have to be
    more conservative and only use it in places where we can tolerate
    failures.

    This patch introduces the primitives arch_get_random_seed_{int,long}()
    but does not use it yet.

    Signed-off-by: H. Peter Anvin
    Reviewed-by: Ingo Molnar
    Cc: Benjamin Herrenschmidt
    Cc: Paul Mackerras
    Cc: Michael Ellerman
    Signed-off-by: Theodore Ts'o

    H. Peter Anvin
     

22 Jan, 2014

1 commit

  • Many functions have open coded a function that returns a random
    number in range [0,N-1]. Under the assumption that we have a PRNG
    such as taus113 with being well distributed in [0, ~0U] space,
    we can implement such a function as uword t = (n*m')>>32, where
    m' is a random number obtained from PRNG, n the right open interval
    border and t our resulting random number, with n,m',t in u32 universe.

    Lets go with Joe and simply call it prandom_u32_max(), although
    technically we have an right open interval endpoint, but that we
    have documented. Other users can further be migrated to the new
    prandom_u32_max() function later on; for now, we need to make sure
    to migrate reciprocal_divide() users for the reciprocal_divide()
    follow-up fixup since their function signatures are going to change.

    Joint work with Hannes Frederic Sowa.

    Cc: Jakub Zawadzki
    Cc: Eric Dumazet
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Hannes Frederic Sowa
    Signed-off-by: Daniel Borkmann
    Signed-off-by: David S. Miller

    Daniel Borkmann
     

12 Nov, 2013

2 commits

  • Since we use prandom*() functions quite often in networking code
    i.e. in UDP port selection, netfilter code, etc, upgrade the PRNG
    from Pierre L'Ecuyer's original paper "Maximally Equidistributed
    Combined Tausworthe Generators", Mathematics of Computation, 65,
    213 (1996), 203--213 to the version published in his errata paper [1].

    The Tausworthe generator is a maximally-equidistributed generator,
    that is fast and has good statistical properties [1].

    The version presented there upgrades the 3 state LFSR to a 4 state
    LFSR with increased periodicity from about 2^88 to 2^113. The
    algorithm is presented in [1] by the very same author who also
    designed the original algorithm in [2].

    Also, by increasing the state, we make it a bit harder for attackers
    to "guess" the PRNGs internal state. See also discussion in [3].

    Now, as we use this sort of weak initialization discussed in [3]
    only between core_initcall() until late_initcall() time [*] for
    prandom32*() users, namely in prandom_init(), it is less relevant
    from late_initcall() onwards as we overwrite seeds through
    prandom_reseed() anyways with a seed source of higher entropy, that
    is, get_random_bytes(). In other words, a exhaustive keysearch of
    96 bit would be needed. Now, with the help of this patch, this
    state-search increases further to 128 bit. Initialization needs
    to make sure that s1 > 1, s2 > 7, s3 > 15, s4 > 127.

    taus88 and taus113 algorithm is also part of GSL. I added a test
    case in the next patch to verify internal behaviour of this patch
    with GSL and ran tests with the dieharder 3.31.1 RNG test suite:

    $ dieharder -g 052 -a -m 10 -s 1 -S 4137730333 #taus88
    $ dieharder -g 054 -a -m 10 -s 1 -S 4137730333 #taus113

    With this seed configuration, in order to compare both, we get
    the following differences:

    algorithm taus88 taus113
    rands/second [**] 1.61e+08 1.37e+08
    sts_serial(4, 1st run) WEAK PASSED
    sts_serial(9, 2nd run) WEAK PASSED
    rgb_lagged_sum(31) WEAK PASSED

    We took out diehard_sums test as according to the authors it is
    considered broken and unusable [4]. Despite that and the slight
    decrease in performance (which is acceptable), taus113 here passes
    all 113 tests (only rgb_minimum_distance_5 in WEAK, the rest PASSED).
    In general, taus/taus113 is considered "very good" by the authors
    of dieharder [5].

    The papers [1][2] states a single warm-up step is sufficient by
    running quicktaus once on each state to ensure proper initialization
    of ~s_{0}:

    Our selection of (s) according to Table 1 of [1] row 1 holds the
    condition L - k
    Cc: Theodore Ts'o
    Signed-off-by: Daniel Borkmann
    Signed-off-by: Hannes Frederic Sowa
    Signed-off-by: David S. Miller

    Daniel Borkmann
     
  • struct rnd_state got mistakenly pulled into uapi header. It is not
    used anywhere and does also not belong there!

    Commit 5960164fde ("lib/random32: export pseudo-random number
    generator for modules"), the last commit on rnd_state before it
    got moved to uapi, says:

    This patch moves the definition of struct rnd_state and the inline
    __seed() function to linux/random.h. It renames the static __random32()
    function to prandom32() and exports it for use in modules.

    Hence, the structure was moved from lib/random32.c to linux/random.h
    so that it can be used within modules (FCoE-related code in this
    case), but not from user space. However, it seems to have been
    mistakenly moved to uapi header through the uapi script. Since no-one
    should make use of it from the linux headers, move the structure back
    to the kernel for internal use, so that it can be modified on demand.

    Joint work with Hannes Frederic Sowa.

    Cc: Joe Eykholt
    Signed-off-by: Daniel Borkmann
    Signed-off-by: Hannes Frederic Sowa
    Signed-off-by: David S. Miller

    Daniel Borkmann