1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 // This is a list of environment variables which the ELF loader unsets when
6 // loading a SUID binary. Because they are unset rather than just ignored, they
7 // aren't passed to child processes of SUID processes either.
9 // We need to save these environment variables before running a SUID sandbox
10 // and restore them before running child processes (but after dropping root).
12 // List gathered from glibc sources (00ebd7ed58df389a78e41dece058048725cb585e):
13 // sysdeps/unix/sysv/linux/i386/dl-librecon.h
14 // sysdeps/generic/unsecvars.h
16 #ifndef SANDBOX_LINUX_SUID_SUID_UNSAFE_ENVIRONMENT_VARIABLES_H_
17 #define SANDBOX_LINUX_SUID_SUID_UNSAFE_ENVIRONMENT_VARIABLES_H_
20 #include <stdlib.h> // malloc
21 #include <string.h> // memcpy
23 static const char* kSUIDUnsafeEnvironmentVariables
[] = {
24 "LD_AOUT_LIBRARY_PATH",
51 // Return a malloc allocated string containing the 'saved' environment variable
52 // name for a given environment variable.
53 static inline char* SandboxSavedEnvironmentVariable(const char* envvar
) {
54 const size_t envvar_len
= strlen(envvar
);
55 const size_t kMaxSizeT
= (size_t) -1;
57 if (envvar_len
> kMaxSizeT
- 1 - 8)
60 const size_t saved_envvarlen
= envvar_len
+ 1 /* NUL terminator */ +
61 8 /* strlen("SANDBOX_") */;
62 char* const saved_envvar
= (char*) malloc(saved_envvarlen
);
66 memcpy(saved_envvar
, "SANDBOX_", 8);
67 memcpy(saved_envvar
+ 8, envvar
, envvar_len
);
68 saved_envvar
[8 + envvar_len
] = 0;
73 #endif // SANDBOX_LINUX_SUID_SUID_UNSAFE_ENVIRONMENT_VARIABLES_H_