mirror of https://git.musl-libc.org/git/musl
Browse Source
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!)rs-1.0
6 changed files with 52 additions and 15 deletions
@ -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); |
|||
|
|||
@ -0,0 +1,26 @@ |
|||
#include <stddef.h> |
|||
#include <elf.h> |
|||
#include <poll.h> |
|||
#include <fcntl.h> |
|||
#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]<AUX_CNT) aux[auxv[0]] = auxv[1]; |
|||
if (aux[AT_UID]==aux[AT_EUID] && aux[AT_GID]==aux[AT_EGID] |
|||
&& !aux[AT_SECURE]) return; |
|||
|
|||
__syscall(SYS_poll, pfd, 3, 0); |
|||
for (i=0; i<3; i++) |
|||
if (pfd[i].revents&POLLNVAL) |
|||
if (__syscall(SYS_open, "/dev/null", O_RDWR)<0) |
|||
a_crash(); |
|||
libc.secure = 1; |
|||
} |
|||
Loading…
Reference in new issue