OLD | NEW |
(Empty) | |
| 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. |
| 4 |
| 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. |
| 8 // |
| 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). |
| 11 // |
| 12 // List gathered from glibc sources (00ebd7ed58df389a78e41dece058048725cb585e): |
| 13 // sysdeps/unix/sysv/linux/i386/dl-librecon.h |
| 14 // sysdeps/generic/unsecvars.h |
| 15 |
| 16 #ifndef SANDBOX_LINUX_SUID_SUID_UNSAFE_ENVIRONMENT_VARIABLES_H_ |
| 17 #define SANDBOX_LINUX_SUID_SUID_UNSAFE_ENVIRONMENT_VARIABLES_H_ |
| 18 |
| 19 #include <stdint.h> |
| 20 #include <stdlib.h> // malloc |
| 21 #include <string.h> // memcpy |
| 22 |
| 23 static const char* kSUIDUnsafeEnvironmentVariables[] = { |
| 24 "LD_AOUT_LIBRARY_PATH", |
| 25 "LD_AOUT_PRELOAD", |
| 26 "GCONV_PATH", |
| 27 "GETCONF_DIR", |
| 28 "HOSTALIASES", |
| 29 "LD_AUDIT", |
| 30 "LD_DEBUG", |
| 31 "LD_DEBUG_OUTPUT", |
| 32 "LD_DYNAMIC_WEAK", |
| 33 "LD_LIBRARY_PATH", |
| 34 "LD_ORIGIN_PATH", |
| 35 "LD_PRELOAD", |
| 36 "LD_PROFILE", |
| 37 "LD_SHOW_AUXV", |
| 38 "LD_USE_LOAD_BIAS", |
| 39 "LOCALDOMAIN", |
| 40 "LOCPATH", |
| 41 "MALLOC_TRACE", |
| 42 "NIS_PATH", |
| 43 "NLSPATH", |
| 44 "RESOLV_HOST_CONF", |
| 45 "RES_OPTIONS", |
| 46 "TMPDIR", |
| 47 "TZDIR", |
| 48 NULL, |
| 49 }; |
| 50 |
| 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; |
| 56 |
| 57 if (envvar_len > kMaxSizeT - 1 - 8) |
| 58 return NULL; |
| 59 |
| 60 const size_t saved_envvarlen = envvar_len + 1 /* NUL terminator */ + |
| 61 8 /* strlen("SANDBOX_") */; |
| 62 char* const saved_envvar = (char*) malloc(saved_envvarlen); |
| 63 if (!saved_envvar) |
| 64 return NULL; |
| 65 |
| 66 memcpy(saved_envvar, "SANDBOX_", 8); |
| 67 memcpy(saved_envvar + 8, envvar, envvar_len); |
| 68 saved_envvar[8 + envvar_len] = 0; |
| 69 |
| 70 return saved_envvar; |
| 71 } |
| 72 |
| 73 #endif // SANDBOX_LINUX_SUID_SUID_UNSAFE_ENVIRONMENT_VARIABLES_H_ |
OLD | NEW |