mirror of
https://github.com/fluencelabs/musl
synced 2025-06-23 03:31:55 +00:00
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!)
This commit is contained in:
18
src/env/__libc_start_main.c
vendored
18
src/env/__libc_start_main.c
vendored
@ -1,21 +1,21 @@
|
||||
#include "libc.h"
|
||||
|
||||
/* Any use of __environ/environ will override this symbol. */
|
||||
char **__dummy_environ = (void *)-1;
|
||||
weak_alias(__dummy_environ, ___environ);
|
||||
void __init_security(size_t *);
|
||||
|
||||
int __libc_start_main(
|
||||
int (*main)(int, char **, char **), int argc, char **argv,
|
||||
int (*init)(int, char **, char **), void (*fini)(void),
|
||||
void (*ldso_fini)(void))
|
||||
{
|
||||
/* Save the environment if it may be used by libc/application */
|
||||
char **envp = argv+argc+1;
|
||||
if (___environ != (void *)-1) ___environ = envp;
|
||||
char **envp = argv+argc+1, **auxv = envp;
|
||||
|
||||
/* Avoid writing 0 and triggering unnecessary COW */
|
||||
if (ldso_fini) libc.ldso_fini = ldso_fini;
|
||||
if (fini) libc.fini = fini;
|
||||
__environ = envp;
|
||||
do auxv++; while (*auxv);
|
||||
libc.auxv = (void *)++auxv;
|
||||
libc.ldso_fini = ldso_fini;
|
||||
libc.fini = fini;
|
||||
|
||||
__init_security((void *)auxv);
|
||||
|
||||
/* Execute constructors (static) linked into the application */
|
||||
if (init) init(argc, argv, envp);
|
||||
|
Reference in New Issue
Block a user