NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: lib/56905: getentropy() may return predictable data



The following reply was made to PR lib/56905; it has been noted by GNATS.

From: Andreas Gustafsson <gson%gson.org@localhost>
To: gnats-bugs%netbsd.org@localhost
Cc: 
Subject: Re: lib/56905: getentropy() may return predictable data
Date: Fri, 22 Jul 2022 14:22:12 +0300

 The situation is even more complicated that I thought.
 
 I thought adding getentropy() as a new libc function would only affect
 third-party software because nothing in the base system would be using
 a function that did not yet exist, but it turns out I was wrong.  The
 OpenSSL library in base actually detects the presence of getentropy()
 at run time, and now ends up calling getentropy() rather than
 sysctl(KERN_ARND).
 
 Therefore, changing getentropy() to have the proper blocking semantics
 would have the side effect of causing many programs in the NetBSD base
 system that rely on OpenSSL, such as ssh-keygen(1), syslogd(8), and
 login(1), to also block until entropy is available.  That would be a
 good thing from a security perspective, and might have worked in -9
 where processes blocking for entropy eventually get unblocked, but
 regrettably, in -current they no longer do on some systems.  Since
 login(1) blocking forever would render the system unusable and not
 easily recoverable, making OpenSSL block is not a realistic option
 until the root cause of the blocking problems in -current, the
 persistent lack of entropy (or lack of belief in the entropy that is
 present), is fixed.
 
 If the intent when adding getentropy() to libc really was just to
 introduce the symbol into libc for reasons of ABI compatibility, and
 not to switch OpenSSL over to it, perhaps OpenSSL could be patched to
 ignore it, as in the patch below.  But this would just be a stopgap
 measure that effectively amounts to perpetuating a long-standing
 vulnerability in OpenSSL so that a new one in getentropy() can be
 fixed.
 
 Index: src/crypto/external/bsd/openssl/dist/crypto/rand/rand_unix.c
 ===================================================================
 RCS file: /cvsroot/src/crypto/external/bsd/openssl/dist/crypto/rand/rand_unix.c,v
 retrieving revision 1.18
 diff -u -r1.18 rand_unix.c
 --- src/crypto/external/bsd/openssl/dist/crypto/rand/rand_unix.c	7 Jan 2022 15:50:11 -0000	1.18
 +++ src/crypto/external/bsd/openssl/dist/crypto/rand/rand_unix.c	21 Jul 2022 12:16:43 -0000
 @@ -370,7 +370,9 @@
       * Note: Sometimes getentropy() can be provided but not implemented
       * internally. So we need to check errno for ENOSYS
       */
 -#  if defined(__GNUC__) && __GNUC__>=2 && defined(__ELF__) && !defined(__hpux)
 +#  if defined(__NetBSD__)
 +    /* Avoid getentropy() while its semantics are still being debated */
 +#  elif defined(__GNUC__) && __GNUC__>=2 && defined(__ELF__) && !defined(__hpux)
      extern int getentropy(void *buffer, size_t length) __attribute__((weak));
  
      if (getentropy != NULL) {
 
 -- 
 Andreas Gustafsson, gson%gson.org@localhost
 


Home | Main Index | Thread Index | Old Index