fix(sandbox): drop allowRead:["/"] so denyRead binds (F26, #55) - #56
Merged
Conversation
srt allows reads everywhere by default and allowRead takes PRECEDENCE over denyRead, so allowRead:["/"] silently re-allowed every secret the denylist denied — the F6 read-denylist remediation was a no-op on macOS Seatbelt (last-match-wins). Verified against live srt 1.0.0: with the fix, a planted secret in denyRead is refused (rc=1) while broad system and workspace reads still work; workspace-write-deny and egress-bounding were already holding. Applies to both srt settings builders — caller_srt_settings (boundary launch involuntary containment) and _srt_settings (bash-tool jail behind --deny-read-secrets). Tests now assert allowRead is absent so the denylist can't be silently defeated again. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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
Closes #55.
allowRead: ["/"]in both srt settings builders silently defeateddenyReadon macOS. Per srt's own docs, reads are allowed everywhere by default andallowReadtakes precedence overdenyRead— soallowRead:["/"]re-allowed every secret the denylist denied. Dropping the line makesdenyReadbind while keeping reads broad (srt's default).This is the F26 leg that #51 / v0.13.0 is held on, and it also silently no-op'd the F6 read-denylist remediation and the README's
--deny-read-secretsclaim on macOS.Changes
boundary/launcher.py— removeallowRead:["/"]fromcaller_srt_settings()(involuntary-containment caller jail, feat: involuntary containment — gateway HTTP transport, jailed-caller launcher, capability-tax benchmark #48).boundary/tools/sandbox.py— removeallowRead:["/"]from_srt_settings()(bash-tool jail behind--deny-read/--deny-read-secrets).allowReadis absent in both builders, so the denylist can't be silently defeated again (the old tests asserteddenyReadwas populated but never that it bound).Verification (live srt 1.0.0, macOS)
Full F26 re-run against the fixed
caller_srt_settings()— all three legs hold:Before the fix, leg b leaked the secret in full (rc=0) — reproduced from real
$HOMEand canonical/private/tmp, ruling out the/tmpsymlink red herring.Full suite: 421 passed, 3 skipped.
Notes / follow-ups (not in this PR)
denyReadvia bubblewrap tmpfs — a different code path; the CI Linux selftest should confirm broad reads still work there. srt's README documents "reads allowed by default" cross-platform, so omittingallowReadis the intended shape everywhere.--deny-read-secretswording could add a "requires this fix" note until released.Test plan
pytest -qgreen (421 passed, 3 skipped)🤖 Generated with Claude Code