• Kees Cook's avatar
    ELF: implement AT_RANDOM for glibc PRNG seeding · f06295b4
    Kees Cook authored
    While discussing[1] the need for glibc to have access to random bytes
    during program load, it seems that an earlier attempt to implement
    AT_RANDOM got stalled.  This implements a random 16 byte string, available
    to every ELF program via a new auxv AT_RANDOM vector.
    
    [1] http://sourceware.org/ml/libc-alpha/2008-10/msg00006.html
    
    Ulrich said:
    
    glibc needs right after startup a bit of random data for internal
    protections (stack canary etc).  What is now in upstream glibc is that we
    always unconditionally open /dev/urandom, read some data, and use it.  For
    every process startup.  That's slow.
    
    ...
    
    The solution is to provide a limited amount of random data to the
    starting process in the aux vector.  I suggested 16 bytes and this is
    what the patch implements.  If we need only 16 bytes or less we use the
    data directly.  If we need more we'll use the 16 bytes to see a PRNG.
    This avoids the costly /dev/urandom use and it allows the kernel to use
    the most adequate source of random data for this purpose.  It might not
    be the same pool as that for /dev/urandom.
    
    Concerns were expressed about the depletion of the randomness pool.  But
    this patch doesn't make the situation worse, it doesn't deplete entropy
    more than happens now.
    Signed-off-by: default avatarKees Cook <kees.cook@canonical.com>
    Cc: Jakub Jelinek <jakub@redhat.com>
    Cc: Andi Kleen <andi@firstfloor.org>
    Cc: Ulrich Drepper <drepper@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    f06295b4
binfmt_elf.c 54.1 KB