Skip to content

审批、沙箱、工作目录:三个不同的边界

返回机制目录 · Codex 决策图 · OpenHands 事件图

Codex 一次命令的审批与执行决策

查看原尺寸 SVG(可缩放)

Agent 请求执行命令时,“问过用户”“在沙箱里跑”“只在项目目录运行”回答的是三个不同问题:

边界回答的问题它本身不保证
审批这次动作是否被允许启动?执行过程不会访问别处或产生副作用
沙箱/隔离动作运行时可访问哪些资源?用户同意了动作,或结果已经正确
工作目录命令从哪个路径开始解析相对文件?路径外资源不可访问

固定源码中的两个例子说明这一区分。Codex Rust core 的 exec_command 先得出 Skip / NeedsApproval / Forbidden,再选择沙箱与执行;Skip 是无需普通审批,不等于必然无沙箱。执行策略 · 沙箱选择

OpenHands SDK 的局部路径则先记 ActionEvent,需要确认时停在 WAITING_FOR_CONFIRMATION;获准后工具才可能执行。确认闸门TerminalTool 使用 workspace 的 working_dir,但这只是工作目录来源;真正的隔离要看所选 workspace 和部署方式。TerminalTool

这两个例子不是安全性能评测,也不表示两套产品的授权模型完全可比。本文只建立阅读源码时的提问顺序:**先看谁能发起动作,再看谁能批准,再看执行环境可触达什么,最后检查副作用与结果。**任何一层的“通过”都不能替代后一层的验证。

图的文字说明 · codex-exec-approval

从左到右看第一行:模型提交 exec_command(cmd);Handler 验证环境、参数与权限;exec policy 产出三种决策。Forbidden 在执行前终止,NeedsApproval 要求审核并可能被拒绝,Skip 不要求普通审批,但不等于无沙箱。允许继续的请求汇合到沙箱选择与第一次执行;这里的路径是 ToolOrchestrator → UnifiedExecRuntime。第一次执行成功直接返回输出或进程会话;若出现沙箱拒绝,还须检查具体重试条件。不满足条件时返回拒绝;满足条件时可能追加审批,再进行第二次尝试。图中虚线表示有条件而非必经路径。网络审批、平台后端和 apply_patch 拦截不在图内展开。

本图只映射 openai/codex@c44deff7b1083e9660ac55d02122481f1cdf139b 的 Rust core 局部源码。代码路径及停止条件详见关键代码路径。它不是运行轨迹;不包含 apply_patch 拦截分支、平台沙箱实现和网络审批细节。


在线预览稿:书稿仍在校稿,系统篇以文内固定源码版本为准;静态阅读不等于运行验收。