mirror of
https://github.com/openai/codex.git
synced 2026-04-25 07:05:38 +00:00
fix: reopen writable linux carveouts under denied parents (#14514)
## Summary - preserve Linux bubblewrap semantics for `write -> none -> write` filesystem policies by recreating masked mount targets before rebinding narrower writable descendants - add a Linux runtime regression for `/repo = write`, `/repo/a = none`, `/repo/a/b = write` so the nested writable child is exercised under bubblewrap - document the supported legacy Landlock fallback and the split-policy bubblewrap behavior for overlapping carveouts ## Example Given a split filesystem policy like: ```toml "/repo" = "write" "/repo/a" = "none" "/repo/a/b" = "write" ``` this PR keeps `/repo` writable, masks `/repo/a`, and still reopens `/repo/a/b` as writable again under bubblewrap. ## Testing - `just fmt` - `cargo test -p codex-linux-sandbox` - `cargo clippy -p codex-linux-sandbox --tests -- -D warnings`
This commit is contained in:
@@ -11,12 +11,15 @@ On Linux, the bubblewrap pipeline uses the vendored bubblewrap path compiled
|
||||
into this binary.
|
||||
|
||||
**Current Behavior**
|
||||
- Legacy `SandboxPolicy` / `sandbox_mode` configs remain supported.
|
||||
- Bubblewrap is the default filesystem sandbox pipeline and is standardized on
|
||||
the vendored path.
|
||||
- Legacy Landlock + mount protections remain available as an explicit legacy
|
||||
fallback path.
|
||||
- Set `features.use_legacy_landlock = true` (or CLI `-c use_legacy_landlock=true`)
|
||||
to force the legacy Landlock fallback.
|
||||
- The legacy Landlock fallback is used only when the split filesystem policy is
|
||||
sandbox-equivalent to the legacy model after `cwd` resolution.
|
||||
- Split-only filesystem policies that do not round-trip through the legacy
|
||||
`SandboxPolicy` model stay on bubblewrap so nested read-only or denied
|
||||
carveouts are preserved.
|
||||
@@ -27,9 +30,12 @@ into this binary.
|
||||
- When the default bubblewrap pipeline is active, protected subpaths under writable roots (for
|
||||
example `.git`,
|
||||
resolved `gitdir:`, and `.codex`) are re-applied as read-only via `--ro-bind`.
|
||||
- When the default bubblewrap pipeline is active, overlapping split-policy entries are applied in
|
||||
path-specificity order so narrower writable children can reopen broader
|
||||
read-only parents while narrower denied subpaths still win.
|
||||
- When the default bubblewrap pipeline is active, overlapping split-policy
|
||||
entries are applied in path-specificity order so narrower writable children
|
||||
can reopen broader read-only or denied parents while narrower denied subpaths
|
||||
still win. For example, `/repo = write`, `/repo/a = none`, `/repo/a/b = write`
|
||||
keeps `/repo` writable, denies `/repo/a`, and reopens `/repo/a/b` as
|
||||
writable again.
|
||||
- When the default bubblewrap pipeline is active, symlink-in-path and non-existent protected paths inside
|
||||
writable roots are blocked by mounting `/dev/null` on the symlink or first
|
||||
missing component.
|
||||
|
||||
Reference in New Issue
Block a user