08. 权限、安全与审批¶
Codex 的权限模型建立在本地运行时上。模型只能提出工具调用,本地运行时决定工具是否执行、是否需要审批、是否进入沙箱、是否允许网络或文件写入。权限边界不依赖模型自觉遵守提示词。
权限系统负责副作用控制。编程智能体的工具会运行命令、修改文件、访问网络、调用外部服务;这些动作不能因为模型生成了一个看似合理的工具调用就直接发生。Codex 把能力上限、审批策略、命令风险、补丁安全、沙箱和守护复核拆成多道本地判断。
执行链路¶
以 shell 命令为例,模型输出的是 shell 工具调用。运行时随后解析参数,确认工具存在,检查当前权限配置、审批策略、命令风险、沙箱策略和额外权限请求。通过检查后,命令才会执行。
拒绝、审批失败、沙箱阻止和普通命令失败都会以结构化结果返回模型。
结构化结果会保留失败类型。普通命令失败表示工具成功执行但任务结果不满足预期;权限拒绝表示运行时没有执行动作;沙箱阻止表示隔离层阻止了动作;审批失败表示用户或守护复核未授予权限。模型后续策略依赖这些区别。
实现上,权限链路不是单个布尔判断,而是一组逐步收窄的决策。处理器先确认调用在语义上成立;执行策略或补丁安全判断动作风险;权限配置给出能力边界;审批策略决定交互方式;沙箱管理器将边界落实到执行环境;执行结果再被分类回填。
模型可见规则¶
Session 会将权限说明放入模型上下文。模型因此能够知道当前大致限制,例如文件系统是否可写、网络是否可用、何时需要请求权限。
这类说明用于引导模型减少无效请求。实际执行边界仍由处理器、权限配置、审批策略和沙箱落实。模型生成“已获得授权”之类文本不会改变运行时权限状态。
模型可见规则和本地权限状态是两条独立通道。规则说明进入提示词,权限状态存在于 Turn Context、审批 store 和沙箱运行时。只有本地通道发生变化,工具执行能力才会变化。
权限配置¶
权限配置定义本轮任务的能力边界。它描述文件系统读写范围、网络访问、执行限制和沙箱兼容策略。
只读模式限制写入,工作区可写模式允许工作区内受控写入,更高权限配置可以扩大执行能力。外部请求中的权限参数会被标准化和校验,互相冲突的配置不能同时作为有效现场存在。
权限配置是能力上限,不是审批交互策略。审批是否发生由审批策略决定。
权限配置还决定自动执行的安全范围。某些写入只有在沙箱能够强制限制时才适合自动批准;无法被沙箱约束的动作即使看起来在工作区内,也可能需要审批或拒绝。
审批策略¶
审批策略定义敏感动作的交互策略。禁止询问表示不主动询问,无法执行的动作直接失败;失败后询问表示先按当前限制尝试,失败后再考虑升级;按请求询问允许工具显式请求更高权限;细粒度审批支持更细粒度权限请求;非信任时审批更倾向于确认后执行。
审批通过不代表无限授权。批准通常绑定某次动作、某类动作或本 session 内的特定范围。工具执行仍受权限配置和沙箱限制。
审批结果会回到 Session 队列。工具等待审批期间,用户可能追加输入或中断任务;队列化处理保证审批结果不会绕过当前轮次状态直接执行过期动作。
沙箱¶
沙箱将权限策略落实为具体执行环境。命令可以在隔离环境中运行,文件写入和网络访问被限制在允许范围内。
命令失败需要区分普通失败和沙箱阻止。测试退出码非零是工具结果,表示代码或测试失败;沙箱阻止表示动作被隔离策略阻止。后者可能触发升级请求,但升级仍需符合审批策略并获得批准。
沙箱重试是第二次执行尝试,不是同一次执行的延续。运行时需要记录第一次沙箱尝试的失败原因,并在批准后以新的沙箱条件重新执行。未获批准时,拒绝结果进入模型上下文。
执行策略¶
执行策略(ExecPolicy)对 shell 命令进行风险判断。不同命令具有不同风险:测试命令、删除命令、网络下载、修改 git 配置、启动后台进程的安全含义不同。
执行策略将命令内容、当前目录、环境、已批准权限、额外权限请求和沙箱策略结合起来,决定命令是否需要审批、是否应拒绝或是否可在沙箱内尝试。
执行策略使 shell 工具摆脱“任意字符串执行器”的形态。模型仍能请求命令,但命令会被解释为具有风险等级的动作。删除、网络下载、权限修改、后台进程和测试命令在审批路径上可以表现不同。
补丁安全¶
补丁会修改文件,因此需要独立安全评估。运行时会检查补丁是否为空、修改哪些路径、路径是否在允许范围内、当前沙箱能否约束写入、是否需要审批,以及当前策略是否允许询问。
模型生成补丁只表示提出修改方案。只有本地安全评估通过后,补丁才会应用。越界写入、只读配置下写入和无法安全约束的写入会被拒绝或进入审批流程。
补丁安全还需要考虑空补丁和路径解析。空补丁不能作为成功修改处理,路径归一化错误可能绕过工作区边界,多个文件修改需要整体评估。补丁是工具动作,不是助手文本的一部分。
权限请求¶
模型可以通过权限请求工具请求额外权限。请求会被处理器解析和规范化,空请求或不合法请求会被拒绝。合法请求根据当前审批策略进入用户审批或守护复核。
批准后,授权会物化为本轮次或 session 可用的 grants。拒绝后,拒绝信息会写回模型上下文,模型需要使用受限方案或说明无法继续。
权限请求是模型与权限系统之间的协议化交互。模型表达需要什么权限,运行时将请求规范化并交给审批系统,审批结果再成为后续工具执行的输入条件。
守护复核¶
守护复核(guardian)在部分审批场景中承担自动复核角色。它接收压缩后的会话上下文和待审批动作,判断动作是否允许。超时、格式错误或判断异常按拒绝处理。
守护复核不扩大权限。它只影响审批结果,实际执行仍经过处理器、权限配置和沙箱。
守护复核的失败模式按拒绝处理。自动复核超时、输出格式不合法或判断异常不会默认为通过。该策略保证自动审批不会成为绕过人工确认的隐式放行通道。
典型结果¶
普通测试失败会作为 shell 输出回填模型,不触发权限升级。
沙箱阻止表示动作被隔离层阻止,运行时根据策略决定是否请求升级。
补丁越界会被拒绝或进入审批流程,不能因补丁内容合理而直接应用。
权限请求被拒后,拒绝结果进入历史,模型只能调整方案或说明限制。
普通失败:
工具已执行 -> 输出包含退出码/标准错误 -> 模型分析失败原因
权限拒绝:
工具未执行 -> 输出包含拒绝原因 -> 模型请求权限或换方案
沙箱阻止:
工具在隔离环境受阻 -> 可能请求升级 -> 批准后重新执行
补丁越界:
修改未应用 -> 输出包含路径/权限原因 -> 模型缩小修改范围
安全边界¶
Codex 将模型置于决策层,将运行时置于执行层。模型可以建议动作,本地运行时必须验证动作。权限配置、审批策略、沙箱、执行策略、补丁安全和守护复核共同构成执行边界。这让“模型想做什么”和“本地允许做什么”保持分离,是智能体能进入真实代码仓库的前提。