Skip to content

Commit 7cdec28

Browse files
authored
fix: block rustup toolchain env overrides [AI] (#91615)
* fix: block rustup toolchain env overrides [AI] * test: cover inherited rustup env stripping [AI] * fix: preserve inherited rustup env [AI] * fix: filter ignored opengrep changed paths [AI] * fix: honor opengrep ignored directory globs [AI] * fix: match ignored opengrep descendants [AI] * fix: cover rustup mirror overrides [AI] * fix: preserve opengrep directory-only ignores [AI] * chore: drop opengrep cleanup from rustup fix [AI]
1 parent 9f413ac commit 7cdec28

5 files changed

Lines changed: 61 additions & 2 deletions

File tree

apps/macos/Sources/OpenClaw/HostEnvSecurityPolicy.generated.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,11 @@ enum HostEnvSecurityPolicy {
433433
"REQUESTS_CA_BUNDLE",
434434
"RUSTC_WRAPPER",
435435
"RUSTFLAGS",
436+
"RUSTUP_DIST_ROOT",
437+
"RUSTUP_DIST_SERVER",
438+
"RUSTUP_HOME",
439+
"RUSTUP_TOOLCHAIN",
440+
"RUSTUP_UPDATE_ROOT",
436441
"R_LIBS_USER",
437442
"SSH_ASKPASS",
438443
"SSH_AUTH_SOCK",

src/infra/host-env-security-policy.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,11 @@
191191
"PYTHONUSERBASE",
192192
"RUSTC_WRAPPER",
193193
"RUSTFLAGS",
194+
"RUSTUP_DIST_ROOT",
195+
"RUSTUP_DIST_SERVER",
196+
"RUSTUP_HOME",
197+
"RUSTUP_TOOLCHAIN",
198+
"RUSTUP_UPDATE_ROOT",
194199
"CARGO_HOME",
195200
"VIRTUAL_ENV",
196201
"LUA_PATH",
@@ -275,6 +280,11 @@
275280
"NO_PROXY",
276281
"PAGER",
277282
"REQUESTS_CA_BUNDLE",
283+
"RUSTUP_DIST_ROOT",
284+
"RUSTUP_DIST_SERVER",
285+
"RUSTUP_HOME",
286+
"RUSTUP_TOOLCHAIN",
287+
"RUSTUP_UPDATE_ROOT",
278288
"SSH_AUTH_SOCK",
279289
"SSL_CERT_DIR",
280290
"SSL_CERT_FILE",

src/infra/host-env-security.reported-baseline.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,11 @@
224224
"REQUESTS_CA_BUNDLE",
225225
"RUSTC_WRAPPER",
226226
"RUSTFLAGS",
227+
"RUSTUP_DIST_ROOT",
228+
"RUSTUP_DIST_SERVER",
229+
"RUSTUP_HOME",
230+
"RUSTUP_TOOLCHAIN",
231+
"RUSTUP_UPDATE_ROOT",
227232
"R_LIBS_USER",
228233
"SSH_ASKPASS",
229234
"SSH_AUTH_SOCK",
@@ -252,5 +257,5 @@
252257
"YARN_RC_FILENAME",
253258
"ZDOTDIR"
254259
],
255-
"expectedTotalReportedEntries": 247
260+
"expectedTotalReportedEntries": 252
256261
}

src/infra/host-env-security.reported-baseline.test.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ const INHERITED_ALLOWLIST_RATIONALE: Record<string, string> = {
4646
NO_PROXY: "Trusted inherited proxy bypass list from operator runtime.",
4747
PAGER: "Trusted inherited default pager preference.",
4848
REQUESTS_CA_BUNDLE: "Trusted inherited Python requests CA bundle path.",
49+
RUSTUP_DIST_ROOT: "Trusted inherited deprecated Rust static download mirror.",
50+
RUSTUP_DIST_SERVER: "Trusted inherited Rust static download mirror.",
51+
RUSTUP_HOME: "Trusted inherited Rust toolchain root selected by operator runtime.",
52+
RUSTUP_TOOLCHAIN: "Trusted inherited Rust toolchain selector selected by operator.",
53+
RUSTUP_UPDATE_ROOT: "Trusted inherited Rust self-update download mirror.",
4954
SSH_AUTH_SOCK: "Trusted inherited SSH agent socket from operator runtime.",
5055
SSL_CERT_DIR: "Trusted inherited OpenSSL certificate directory path.",
5156
SSL_CERT_FILE: "Trusted inherited OpenSSL certificate file path.",
@@ -92,7 +97,7 @@ describe("host env reported baseline coverage", () => {
9297
baseline.reportedDangerousEverywhereKeys.length +
9398
baseline.reportedDangerousOverrideOnlyKeys.length,
9499
).toBe(baseline.expectedTotalReportedEntries);
95-
expect(baseline.expectedTotalReportedEntries).toBe(247);
100+
expect(baseline.expectedTotalReportedEntries).toBe(252);
96101
expect(sortUniqueUpper(baseline.reportedDangerousEverywhereKeys)).toEqual(
97102
baseline.reportedDangerousEverywhereKeys,
98103
);

src/infra/host-env-security.test.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,10 @@ describe("isDangerousHostEnvVarName", () => {
160160
expect(isDangerousHostEnvVarName("CARGO_BUILD_RUSTC_WRAPPER")).toBe(true);
161161
expect(isDangerousHostEnvVarName("cargo_build_rustc_wrapper")).toBe(true);
162162
expect(isDangerousHostEnvVarName("cargo_home")).toBe(false);
163+
expect(isDangerousHostEnvVarName("RUSTUP_DIST_SERVER")).toBe(false);
164+
expect(isDangerousHostEnvVarName("RUSTUP_HOME")).toBe(false);
165+
expect(isDangerousHostEnvVarName("rustup_update_root")).toBe(false);
166+
expect(isDangerousHostEnvVarName("rustup_toolchain")).toBe(false);
163167
expect(isDangerousHostEnvVarName("CMAKE_C_COMPILER")).toBe(true);
164168
expect(isDangerousHostEnvVarName("cmake_c_compiler")).toBe(true);
165169
expect(isDangerousHostEnvVarName("CMAKE_CXX_COMPILER")).toBe(true);
@@ -337,6 +341,11 @@ describe("sanitizeHostExecEnv", () => {
337341
AWS_CONFIG_FILE: "/tmp/aws-config",
338342
SSH_AUTH_SOCK: "/tmp/trusted-ssh-agent.sock",
339343
CARGO_HOME: "/tmp/cargo",
344+
RUSTUP_DIST_ROOT: "https://mirror.example.test/deprecated-dist",
345+
RUSTUP_DIST_SERVER: "https://mirror.example.test",
346+
RUSTUP_HOME: "/tmp/rustup-home",
347+
RUSTUP_TOOLCHAIN: "/tmp/rustup-toolchain",
348+
RUSTUP_UPDATE_ROOT: "https://mirror.example.test/rustup",
340349
HELM_HOME: "/tmp/helm",
341350
HTTP_PROXY: "http://proxy.example.test:8080",
342351
HTTPS_PROXY: "http://proxy.example.test:8443",
@@ -373,6 +382,11 @@ describe("sanitizeHostExecEnv", () => {
373382
SSL_CERT_DIR: "/tmp/evil-cert-dir",
374383
DOCKER_CONTEXT: "trusted-remote",
375384
DOCKER_HOST: "tcp://docker.example.test:2376",
385+
RUSTUP_DIST_ROOT: "https://mirror.example.test/deprecated-dist",
386+
RUSTUP_DIST_SERVER: "https://mirror.example.test",
387+
RUSTUP_HOME: "/tmp/rustup-home",
388+
RUSTUP_TOOLCHAIN: "/tmp/rustup-toolchain",
389+
RUSTUP_UPDATE_ROOT: "https://mirror.example.test/rustup",
376390
OK: "1",
377391
});
378392
});
@@ -902,6 +916,11 @@ describe("isDangerousHostEnvOverrideVarName", () => {
902916
expect(isDangerousHostEnvOverrideVarName("rustc_wrapper")).toBe(true);
903917
expect(isDangerousHostEnvOverrideVarName("RUSTFLAGS")).toBe(true);
904918
expect(isDangerousHostEnvOverrideVarName("rustflags")).toBe(true);
919+
expect(isDangerousHostEnvOverrideVarName("RUSTUP_DIST_ROOT")).toBe(true);
920+
expect(isDangerousHostEnvOverrideVarName("rustup_dist_server")).toBe(true);
921+
expect(isDangerousHostEnvOverrideVarName("RUSTUP_HOME")).toBe(true);
922+
expect(isDangerousHostEnvOverrideVarName("rustup_toolchain")).toBe(true);
923+
expect(isDangerousHostEnvOverrideVarName("RUSTUP_UPDATE_ROOT")).toBe(true);
905924
expect(isDangerousHostEnvOverrideVarName("CARGO_BUILD_RUSTC_WRAPPER")).toBe(true);
906925
expect(isDangerousHostEnvOverrideVarName("cargo_build_rustc_wrapper")).toBe(true);
907926
expect(isDangerousHostEnvOverrideVarName("CARGO_HOME")).toBe(true);
@@ -1042,6 +1061,11 @@ describe("sanitizeHostExecEnvWithDiagnostics", () => {
10421061
PYTHONUSERBASE: "/tmp/evil-python-userbase",
10431062
RUSTC_WRAPPER: "/tmp/evil-rustc-wrapper",
10441063
RUSTFLAGS: "-C link-args=-l/tmp/evil.so",
1064+
RUSTUP_DIST_ROOT: "https://evil.example.test/deprecated-dist",
1065+
RUSTUP_DIST_SERVER: "https://evil.example.test",
1066+
RUSTUP_HOME: "/tmp/evil-rustup-home",
1067+
RUSTUP_TOOLCHAIN: "/tmp/evil-toolchain",
1068+
RUSTUP_UPDATE_ROOT: "https://evil.example.test/rustup",
10451069
VIRTUAL_ENV: "/tmp/evil-venv",
10461070
JAVA_OPTS: "-javaagent:/tmp/evil.jar",
10471071
YARN_RC_FILENAME: ".evil-yarnrc.yml",
@@ -1117,6 +1141,11 @@ describe("sanitizeHostExecEnvWithDiagnostics", () => {
11171141
"REQUESTS_CA_BUNDLE",
11181142
"RUSTC_WRAPPER",
11191143
"RUSTFLAGS",
1144+
"RUSTUP_DIST_ROOT",
1145+
"RUSTUP_DIST_SERVER",
1146+
"RUSTUP_HOME",
1147+
"RUSTUP_TOOLCHAIN",
1148+
"RUSTUP_UPDATE_ROOT",
11201149
"SSL_CERT_DIR",
11211150
"SSL_CERT_FILE",
11221151
"UV_DEFAULT_INDEX",
@@ -1197,6 +1226,11 @@ describe("sanitizeHostExecEnvWithDiagnostics", () => {
11971226
expect(result.env.PYTHONUSERBASE).toBeUndefined();
11981227
expect(result.env.RUSTC_WRAPPER).toBeUndefined();
11991228
expect(result.env.RUSTFLAGS).toBeUndefined();
1229+
expect(result.env.RUSTUP_DIST_ROOT).toBeUndefined();
1230+
expect(result.env.RUSTUP_DIST_SERVER).toBeUndefined();
1231+
expect(result.env.RUSTUP_HOME).toBeUndefined();
1232+
expect(result.env.RUSTUP_TOOLCHAIN).toBeUndefined();
1233+
expect(result.env.RUSTUP_UPDATE_ROOT).toBeUndefined();
12001234
expect(result.env.VIRTUAL_ENV).toBeUndefined();
12011235
expect(result.env.YARN_RC_FILENAME).toBeUndefined();
12021236
});

0 commit comments

Comments
 (0)