From df0b5a49406763aa4719dfad561a5de8924ecd59 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Tue, 23 Aug 2011 09:37:39 -0400 Subject: security hardening: ensure suid programs have valid stdin/out/err this behavior (opening fds 0-2 for a suid program) is explicitly allowed (but not required) by POSIX to protect badly-written suid programs from clobbering files they later open. this commit does add some cost in startup code, but the availability of auxv and the security flag will be useful elsewhere in the future. in particular auxv is needed for static-linked vdso support, which is still waiting to be committed (sorry nik!) --- src/env/__environ.c | 7 +++---- src/env/__init_security.c | 26 ++++++++++++++++++++++++++ src/env/__libc_start_main.c | 18 +++++++++--------- 3 files changed, 38 insertions(+), 13 deletions(-) create mode 100644 src/env/__init_security.c (limited to 'src/env') diff --git a/src/env/__environ.c b/src/env/__environ.c index d7bd5e50..0a2786fd 100644 --- a/src/env/__environ.c +++ b/src/env/__environ.c @@ -1,7 +1,6 @@ #include "libc.h" #undef environ -char **___environ = 0; -weak_alias(___environ, __environ); -weak_alias(___environ, _environ); -weak_alias(___environ, environ); +char **__environ = 0; +weak_alias(__environ, _environ); +weak_alias(__environ, environ); diff --git a/src/env/__init_security.c b/src/env/__init_security.c new file mode 100644 index 00000000..5fd12ecb --- /dev/null +++ b/src/env/__init_security.c @@ -0,0 +1,26 @@ +#include +#include +#include +#include +#include "syscall.h" +#include "libc.h" +#include "atomic.h" + +#define AUX_CNT 24 + +void __init_security(size_t *auxv) +{ + size_t i, aux[AUX_CNT] = { 0 }; + struct pollfd pfd[3] = { {.fd=0}, {.fd=1}, {.fd=2} }; + + for (; auxv[0]; auxv+=2) if (auxv[0]