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; |
+} |