← Back to PRs

#9200: Fix: Strip dangerous env vars from baseEnv in host execution

by vishaltandale00 open 2026-02-05 00:43 View on GitHub →
agents stale
## Summary Fixes #9193 where `NODE_OPTIONS` from the gateway process was being inherited by child processes spawned via exec tool, causing Node.js to reject the CLI with exit code 9. ## Problem Analysis When an agent executes `openclaw --version` or other OpenClaw CLI commands via the `exec` tool, Node.js rejects the command with: ``` /usr/bin/node: --disable-warning= is not allowed in NODE_OPTIONS Command exited with code 9 ``` ### Root Cause 1. **Gateway process sets NODE_OPTIONS**: The OpenClaw entry point (`src/entry.ts`) sets `NODE_OPTIONS=--disable-warning=ExperimentalWarning` when respawning itself to suppress experimental warnings 2. **Environment inheritance**: When `exec` tool spawns child processes on host (gateway/node), it uses `coerceEnv(process.env)` as base environment, which includes NODE_OPTIONS from the gateway 3. **No sanitization**: The base environment was not sanitized before passing to child processes - only custom `params.env` was validated 4. **Security risk**: Other dangerous variables like `LD_PRELOAD`, `LD_LIBRARY_PATH`, `DYLD_INSERT_LIBRARIES` were also being inherited ## Solution Strip dangerous environment variables from `baseEnv` when executing on host (gateway/node): - Check each env var against `DANGEROUS_HOST_ENV_VARS` set (includes NODE_OPTIONS, LD_PRELOAD, etc.) - Check prefixes against `DANGEROUS_HOST_ENV_PREFIXES` (LD_, DYLD_) - Build sanitized environment without these variables - Sandbox execution remains unchanged (still gets raw env as designed) ## Changes **File**: `src/agents/bash-tools.exec.ts` - Added sanitization step after `coerceEnv(process.env)` for host execution - Filters out all dangerous env vars before merging with custom params - Preserves existing validation for custom `params.env` **File**: `src/entry.ts` - Minor refactor to avoid unnecessary `.trim()` when setting NODE_OPTIONS (cosmetic improvement) ## Impact ✅ **Fixes CLI commands from agent sessions**: `exec('openclaw --version')` now works ✅ **Fixes cron jobs**: Automated tasks that execute OpenClaw CLI commands no longer fail ✅ **Improves security**: Prevents injection of dangerous env vars from gateway to child processes ✅ **Backward compatible**: No breaking changes, only fixes broken behavior ✅ **Sandbox unaffected**: Docker sandbox execution still gets full env as before ## Verification ### Confirmed the fix resolves the issue: - NODE_OPTIONS no longer inherited by exec'd commands on host - Other dangerous variables (LD_PRELOAD, etc.) also blocked - TypeScript compilation passes - Code formatted with oxfmt ### Why this is safe: - Only affects host execution (gateway/node), not sandbox - Dangerous vars were already blocked in custom `params.env`, now also blocked from baseEnv - Aligns security model: host execution should not inherit code-injection vectors from gateway ## Testing Plan To test this fix: 1. Start gateway with the fix 2. From an agent session: `exec('openclaw --version')` 3. **Expected**: Version output without error 4. **Before fix**: Exit code 9, "NODE_OPTIONS --disable-warning= is not allowed" Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> <!-- greptile_comment --> <h2>Greptile Overview</h2> <h3>Greptile Summary</h3> This PR addresses #9193 by preventing host (gateway/node) `exec` runs from inheriting dangerous environment variables (e.g., `NODE_OPTIONS`, `LD_*`, `DYLD_*`) from the gateway process, while leaving sandbox execution behavior unchanged. It also slightly refactors CLI self-respawn logic to set `NODE_OPTIONS` without relying on `.trim()`. Key integration point: `src/agents/bash-tools.exec.ts` now builds a sanitized base environment for non-sandbox execution before merging in validated `params.env` and running allowlist/approval logic. <h3>Confidence Score: 4/5</h3> - Mostly safe to merge, but host env sanitization still leaves an important inheritance hole. - The change is narrow and fixes the reported NODE_OPTIONS inheritance issue. However, the new baseEnv sanitization omits PATH despite `validateHostEnv` explicitly blocking PATH overrides, so host exec can still inherit a potentially unsafe PATH from the gateway process if it was modified upstream. - src/agents/bash-tools.exec.ts <!-- greptile_other_comments_section --> **Context used:** - Context from `dashboard` - CLAUDE.md ([source](https://app.greptile.com/review/custom-context?memory=fd949e91-5c3a-4ab5-90a1-cbe184fd6ce8)) - Context from `dashboard` - AGENTS.md ([source](https://app.greptile.com/review/custom-context?memory=0d0c8278-ef8e-4d6c-ab21-f5527e322f13)) <!-- /greptile_comment -->

Most Similar PRs