Chromium Code Reviews| Index: sandbox/linux/suid/suid_unsafe_environment_variables.h |
| diff --git a/sandbox/linux/suid/suid_unsafe_environment_variables.h b/sandbox/linux/suid/suid_unsafe_environment_variables.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..586201045c3a04ab6e4ab14907ec74d24bd6beec |
| --- /dev/null |
| +++ b/sandbox/linux/suid/suid_unsafe_environment_variables.h |
| @@ -0,0 +1,59 @@ |
| +// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +// This is a list of environment variables which the ELF loader unsets when |
| +// loading a SUID binary. Because they are unset rather than just ignored, they |
| +// aren't passed to child processes of SUID processes either. |
| +// |
| +// We need to save these environment variables before running a SUID sandbox |
| +// and restore them before running child processes (but after dropping root). |
| +// |
| +// List gathered from glibc sources (00ebd7ed58df389a78e41dece058048725cb585e): |
| +// sysdeps/unix/sysv/linux/i386/dl-librecon.h |
| +// sysdeps/generic/unsecvars.h |
| + |
| +static const char* kSUIDUnsafeEnvironmentVariables[] = { |
| + "LD_AOUT_LIBRARY_PATH", |
| + "LD_AOUT_PRELOAD", |
| + "GCONV_PATH", |
| + "GETCONF_DIR", |
| + "HOSTALIASES", |
| + "LD_AUDIT", |
| + "LD_DEBUG", |
| + "LD_DEBUG_OUTPUT", |
| + "LD_DYNAMIC_WEAK", |
| + "LD_LIBRARY_PATH", |
| + "LD_ORIGIN_PATH", |
| + "LD_PRELOAD", |
| + "LD_PROFILE", |
| + "LD_SHOW_AUXV", |
| + "LD_USE_LOAD_BIAS", |
| + "LOCALDOMAIN", |
| + "LOCPATH", |
| + "MALLOC_TRACE", |
| + "NIS_PATH", |
| + "NLSPATH", |
| + "RESOLV_HOST_CONF", |
| + "RES_OPTIONS", |
| + "TMPDIR", |
| + "TZDIR", |
| + NULL, |
| +}; |
| + |
| +// Return a malloc allocated string containing the 'saved' environment variable |
| +// name for a given environment variable. |
| +static inline char* SandboxSavedEnvironmentVariable(const char* envvar) { |
| + const size_t envvar_len = strlen(envvar); |
| + const size_t saved_envvarlen = envvar_len + 1 /* NUL terminator */ + |
| + 8 /* strlen("SANDBOX_") */; |
|
Evan Martin
2009/07/17 21:10:57
This seems like a ton of effort to go through. Wh
agl
2009/07/17 21:35:09
I'm currently sticking to the idea that the sandbo
|
| + char* const saved_envvar = (char*) malloc(saved_envvarlen); |
| + if (!saved_envvar) |
| + return NULL; |
| + |
| + memcpy(saved_envvar, "SANDBOX_", 8); |
| + memcpy(saved_envvar + 8, envvar, envvar_len); |
| + saved_envvar[8 + envvar_len] = 0; |
| + |
| + return saved_envvar; |
| +} |