drbg: ensure fork-safety without using a pthread_atfork handler
authorDr. Matthias St. Pierre <Matthias.St.Pierre@ncp-e.com>
Mon, 27 May 2019 19:03:09 +0000 (21:03 +0200)
committerDr. Matthias St. Pierre <Matthias.St.Pierre@ncp-e.com>
Wed, 11 Sep 2019 09:22:18 +0000 (11:22 +0200)
commit849529257c9979c7ca0d28e8b80a47bc4a36d4f2
tree2e85307b6e252fe6d175fae0bd8ca3282404e3d2
parentdc64dc2edd215d6cc5843c1bfe1f0b64bff26adc
drbg: ensure fork-safety without using a pthread_atfork handler

When the new OpenSSL CSPRNG was introduced in version 1.1.1,
it was announced in the release notes that it would be fork-safe,
which the old CSPRNG hadn't been.

The fork-safety was implemented using a fork count, which was
incremented by a pthread_atfork handler. Initially, this handler
was enabled by default. Unfortunately, the default behaviour
had to be changed for other reasons in commit b5319bdbd095, so
the new OpenSSL CSPRNG failed to keep its promise.

This commit restores the fork-safety using a different approach.
It replaces the fork count by a fork id, which coincides with
the process id on UNIX-like operating systems and is zero on other
operating systems. It is used to detect when an automatic reseed
after a fork is necessary.

To prevent a future regression, it also adds a test to verify that
the child reseeds after fork.

CVE-2019-1549

Reviewed-by: Paul Dale <paul.dale@oracle.com>
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/9832)
crypto/include/internal/rand_int.h
crypto/init.c
crypto/rand/drbg_lib.c
crypto/rand/rand_lcl.h
crypto/rand/rand_lib.c
crypto/threads_none.c
crypto/threads_pthread.c
crypto/threads_win.c
include/internal/cryptlib.h
test/drbgtest.c