summaryrefslogtreecommitdiff
path: root/lib/libcrypto/arc4random
diff options
context:
space:
mode:
authorBrent Cook <bcook@cvs.openbsd.org>2016-01-04 02:04:57 +0000
committerBrent Cook <bcook@cvs.openbsd.org>2016-01-04 02:04:57 +0000
commit51ba3d277d2aaf6c936db2ad0155291df06e0d4e (patch)
tree06bc0be4c0dc0eb3536d3057f10317f8fce148e1 /lib/libcrypto/arc4random
parentd83b5378ef7949036592dff377f4c457e302354e (diff)
Calling clone(2) with CLONE_NEWPID yields multiple processes with pid=1.
Work around this particular case by reseeding whenever pid=1, but as guenther@ notes, directly calling clone(2), and then forking to match another pid, provides other ways to bypass new process detection on Linux. Hopefully at some point Linux implements something like MAP_INHERIT_ZERO, and does not invent a corresponding mechanism to subvert it. Noted by Sebastian Krahmer and the opmsg team. See http://stealth.openwall.net/crypto/randup.c for a test program. ok beck@
Diffstat (limited to 'lib/libcrypto/arc4random')
-rw-r--r--lib/libcrypto/arc4random/arc4random_linux.h5
1 files changed, 3 insertions, 2 deletions
diff --git a/lib/libcrypto/arc4random/arc4random_linux.h b/lib/libcrypto/arc4random/arc4random_linux.h
index 3296fdeca17..303deb57861 100644
--- a/lib/libcrypto/arc4random/arc4random_linux.h
+++ b/lib/libcrypto/arc4random/arc4random_linux.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: arc4random_linux.h,v 1.9 2015/01/15 06:57:18 deraadt Exp $ */
+/* $OpenBSD: arc4random_linux.h,v 1.10 2016/01/04 02:04:56 bcook Exp $ */
/*
* Copyright (c) 1996, David Mazieres <dm@uun.org>
@@ -60,7 +60,8 @@ _rs_forkdetect(void)
static pid_t _rs_pid = 0;
pid_t pid = getpid();
- if (_rs_pid == 0 || _rs_pid != pid || _rs_forked) {
+ /* XXX unusual calls to clone() can bypass checks */
+ if (_rs_pid == 0 || _rs_pid == 1 || _rs_pid != pid || _rs_forked) {
_rs_pid = pid;
_rs_forked = 0;
if (rs)