fix(policy): remove telegram + discord from base sandbox policy#2415
Open
latenighthackathon wants to merge 1 commit intoNVIDIA:mainfrom
Open
fix(policy): remove telegram + discord from base sandbox policy#2415latenighthackathon wants to merge 1 commit intoNVIDIA:mainfrom
latenighthackathon wants to merge 1 commit intoNVIDIA:mainfrom
Conversation
…NVIDIA#2180) ## Problem After a fresh `nemoclaw onboard` with Balanced tier defaults, where the user explicitly skipped messaging channels in step [5/8] and did not tick Discord in step [8/8], `nemoclaw <name> policy-list` reports: ● discord — Discord API, gateway, and CDN access (active on gateway, missing from local state) The sandbox can reach `discord.com`, `gateway.discord.gg`, and `cdn.discordapp.com` without the user having opted in — the base sandbox policy's own header says "deny by default, allow only what's needed for core functionality," which messaging to third-party IM platforms is not. Same story for `api.telegram.org`. ## Root cause This is a regression, not a new bug: - NVIDIA#1705 (2026-04-09, 77051cc) removed pre-allowed `telegram` and `discord` from `nemoclaw-blueprint/policies/openclaw-sandbox.yaml` for exactly this reason. - NVIDIA#1700 (2026-04-14, 855924f), an unrelated npm_registry PR, was rebased on a branch that predated NVIDIA#1705 and re-added both entries during conflict resolution. The CodeRabbit release notes on NVIDIA#1700 even called this out as "Added network policy entries to enable controlled Telegram and Discord messaging access" — it landed along with the legitimate npm_registry tightening and has been in the baseline since. Once a key like `discord` exists in the gateway's loaded policy, `policies.getGatewayPresets()` detects the Discord preset as active (it matches on key presence), and `policy-list` then renders the misleading "active on gateway, missing from local state" line. ## Fix - Re-remove `telegram` and `discord` entries from `nemoclaw-blueprint/policies/openclaw-sandbox.yaml`. Messaging endpoints are only reachable if the user selects the matching channel in step [5/8] and the corresponding preset is applied on top of the baseline in step [8/8]. Leave a comment block at the removed location referencing NVIDIA#1705, NVIDIA#2180, and the preset path so the next merge-conflict resolution does not casually re-add them. - Add three regression tests in `test/validate-blueprint.test.ts` mirroring the existing `NVIDIA#1583` GitHub pattern: - `regression NVIDIA#2180: base policy does not silently grant Telegram access` - `regression NVIDIA#2180: base policy does not silently grant Discord access` - `regression NVIDIA#2180: base policy does not silently grant Slack access` (guard against the same merge pattern re-adding Slack even though it was never in the baseline historically) Each asserts both the key absence in `network_policies` and the absence of any host-matching endpoint anywhere in the base policy, so a rename can't smuggle the grant back in. ## Test plan - `npx vitest run test/validate-blueprint.test.ts test/policies.test.ts` — 124 tests pass including the 3 new regressions. - `npx vitest run test/validate-configs-dangerous-hosts.test.ts test/onboard.test.ts` — 160 tests pass, no onboard flow regressions. ## Scope Touches only the base policy YAML and the blueprint validator. Does not modify any preset (presets/telegram.yaml, presets/discord.yaml, presets/slack.yaml) — users who enabled messaging via onboard still get the same preset applied on top of baseline and retain the same endpoint access. The permissive variant (openclaw-sandbox-permissive.yaml), used for `--dangerously-skip-permissions`, is intentionally unchanged. Fixes NVIDIA#2180. Signed-off-by: latenighthackathon <latenighthackathon@users.noreply.github.com>
Contributor
📝 WalkthroughWalkthroughThe OpenClaw sandbox baseline policy removes network egress rules for messaging providers (telegram, discord) and replaces them with documentation, while new regression tests prevent accidental reintroduction of messaging provider access. Changes
Estimated code review effort🎯 2 (Simple) | ⏱️ ~12 minutes Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The base sandbox policy (
nemoclaw-blueprint/policies/openclaw-sandbox.yaml) was silently granting every sandbox egress toapi.telegram.org,discord.com,gateway.discord.gg, andcdn.discordapp.com— regardless of whether the user enabled the telegram/discord messaging channel in step [5/8] or ticked the preset in step [8/8] of onboard. This is a regression of a previously-fixed behavior.After a fresh onboard that explicitly skipped messaging channels and did not tick Discord in the Balanced-tier preset picker,
nemoclaw <name> policy-listreports:Problem
Regression history:
77051cc8) — removedtelegramanddiscordfrom baseline "for exactly this reason." Explicitly called it a data exfiltration vector.855924fd) — an unrelated npm_registry PR that was rebased on a branch predating fix(security): remove pre-allowed messaging from base sandbox policy #1705. The CodeRabbit release notes on fix(policy): restrict baseline npm_registry to openclaw binary only #1700 even flagged it: "Added network policy entries to enable controlled Telegram and Discord messaging access." The messaging entries came back as part of that PR's conflict-resolution and have been in the baseline since.Once
discordexists as a key in the gateway's loaded policy,policies.getGatewayPresets()detects the Discord preset as active (it matches on key presence).nemoclaw policy-listthen renders the misleading "active on gateway, missing from local state" line for a preset the user never selected — and the egress is actually enforced, so it's a real capability grant, not just a display bug.Test plan
npx vitest run test/validate-blueprint.test.ts test/policies.test.ts— 124 tests pass, including the three new regression tests that guard against this specific re-add pattern for telegram, discord, and slack.npx vitest run test/validate-configs-dangerous-hosts.test.ts test/onboard.test.ts— 160 tests pass. No onboard-flow regressions.presets/{telegram,discord}.yaml(no preset YAML changes in this PR).openclaw-sandbox-permissive.yaml(used for--dangerously-skip-permissions) unchanged — permissive users still get pre-allowed messaging as before.Fixes #2180.
Signed-off-by: latenighthackathon latenighthackathon@users.noreply.github.com