Skip to content
目录

04 — 沙箱、执行策略与安全边界

为何沙箱是「核心」问题

Agent 会执行任意 shell、读写仓库、可能访问网络。若仅在 UI 提示「请谨慎」,无法防御恶意 prompt 或依赖供应链。策略必须在 core 层强制执行,与具体 UI 无关。

codex-core README 按平台列出 硬依赖(macOS sandbox-exec、Linux bwrap/Landlock、Windows 多后端),并描述 fail-closed 场景:当新策略无法映射到旧 Windows 后端语义时,拒绝运行而不是悄悄降级。

SandboxPolicy 与文件系统策略

协议层定义 FileSystemSandboxPolicyNetworkSandboxPolicy 等(见 codex_protocol::permissions),在 Op::UserTurn 中随回合传入,实现 每轮可变的沙箱视图(例如临时放宽某次命令的写权限由审批流完成,而非改全局配置)。

Linux:Landlock 与 Bubblewrap 的分流

README 说明(摘要):

  • 旧版 Landlock 路径仍在部分配置下使用。
  • split filesystem policy 需要细粒度 carve-out(只读岛、可写子路径重开等)且无法无损 round-trip 到旧模型时,走 bubblewrap
  • 若系统 bwrap 过旧缺少 --argv0,走兼容路径;缺失则使用 内置 vendor bubblewrap通过通知系统 告警而非在 helper 里直接 println。

设计原因:在 安全、可移植、用户体验 三角中,优先保证 语义正确可审计,其次才是「少一个依赖」。

macOS Seatbelt

要点(README):workspace-write 策略在允许写入配置根的同时,将 .git、解析后的 gitdir、.codex 等保持只读,降低 篡改版本控制元数据 / 本地密钥 的风险。

ExecPolicy(执行策略)

用户文档入口在 docs/execpolicy.md(指向官网)。代码侧 codex-execpolicy / codex-core::exec_policy命令是否允许、是否需审批 相关,与 沙箱能否执行 是互补维度:

  • 沙箱:能访问哪些路径/网络。
  • Exec policy:哪些命令模式在策略上被禁止或需人工确认。

MCP 与沙箱状态

codex-core 导出 MCP_SANDBOX_STATE_*SandboxStatelib.rs),用于 MCP 能力协商:远程工具需要知道 当前会话沙箱视图,否则工具侧假设会与 agent 侧不一致。

自测题示例

Q:为什么 Linux 不只用 Landlock?
A: Landlock 表达力不足以覆盖所有「可写根下的只读 carve-out + 子路径可写重开」组合;错误降级会导致 假安全。因此引入 bwrap 作为更强隔离层,并在无法映射时 fail-closed(见 core README)。

Q:沙箱策略为何放在 Turn 而不只是全局 config?
A: 同一 Thread 可能在不同任务下切换 cwd/模式;与模型、审批策略并列传入可保证 请求级一致性,避免并发 Turn(若存在)或 UI 竞态导致工具使用了错误环境。

延伸阅读

MIT License.