跳转至

08. 权限、安全与审批

Codex 的权限模型建立在本地运行时上。模型只能提出工具调用,本地运行时决定工具是否执行、是否需要审批、是否进入沙箱、是否允许网络或文件写入。权限边界不依赖模型自觉遵守提示词。

权限系统负责副作用控制。编程智能体的工具会运行命令、修改文件、访问网络、调用外部服务;这些动作不能因为模型生成了一个看似合理的工具调用就直接发生。Codex 把能力上限、审批策略、命令风险、补丁安全、沙箱和守护复核拆成多道本地判断。

flowchart TD Call[模型工具调用] --> Handler[处理器参数解析] Handler --> Risk[执行策略 / 补丁安全 / 工具风险] Risk --> Profile[权限配置] Profile --> NeedApproval{需要审批?} NeedApproval -->|否| Sandbox[选择沙箱 attempt] NeedApproval -->|是| Approval[用户审批或守护复核] Approval -->|拒绝| Denied[拒绝结果写回模型] Approval -->|批准| Sandbox Sandbox --> Run[执行工具] Run --> Outcome{结果类型} Outcome -->|成功/普通失败| Output[工具输出写回历史] Outcome -->|沙箱阻止| Retry{策略允许升级?} Retry -->|否| Denied Retry -->|是| Approval

执行链路

以 shell 命令为例,模型输出的是 shell 工具调用。运行时随后解析参数,确认工具存在,检查当前权限配置、审批策略、命令风险、沙箱策略和额外权限请求。通过检查后,命令才会执行。

模型提出命令
  -> 处理器解析参数
  -> 执行策略判断命令风险
  -> 审批策略判断审批策略
  -> 权限配置限定能力边界
  -> 沙箱落实隔离执行
  -> 输出回填模型上下文

拒绝、审批失败、沙箱阻止和普通命令失败都会以结构化结果返回模型。

结构化结果会保留失败类型。普通命令失败表示工具成功执行但任务结果不满足预期;权限拒绝表示运行时没有执行动作;沙箱阻止表示隔离层阻止了动作;审批失败表示用户或守护复核未授予权限。模型后续策略依赖这些区别。

实现上,权限链路不是单个布尔判断,而是一组逐步收窄的决策。处理器先确认调用在语义上成立;执行策略或补丁安全判断动作风险;权限配置给出能力边界;审批策略决定交互方式;沙箱管理器将边界落实到执行环境;执行结果再被分类回填。

模型可见规则

Session 会将权限说明放入模型上下文。模型因此能够知道当前大致限制,例如文件系统是否可写、网络是否可用、何时需要请求权限。

这类说明用于引导模型减少无效请求。实际执行边界仍由处理器、权限配置、审批策略和沙箱落实。模型生成“已获得授权”之类文本不会改变运行时权限状态。

模型可见规则和本地权限状态是两条独立通道。规则说明进入提示词,权限状态存在于 Turn Context、审批 store 和沙箱运行时。只有本地通道发生变化,工具执行能力才会变化。

权限配置

权限配置定义本轮任务的能力边界。它描述文件系统读写范围、网络访问、执行限制和沙箱兼容策略。

只读模式限制写入,工作区可写模式允许工作区内受控写入,更高权限配置可以扩大执行能力。外部请求中的权限参数会被标准化和校验,互相冲突的配置不能同时作为有效现场存在。

权限配置是能力上限,不是审批交互策略。审批是否发生由审批策略决定。

权限配置还决定自动执行的安全范围。某些写入只有在沙箱能够强制限制时才适合自动批准;无法被沙箱约束的动作即使看起来在工作区内,也可能需要审批或拒绝。

审批策略

审批策略定义敏感动作的交互策略。禁止询问表示不主动询问,无法执行的动作直接失败;失败后询问表示先按当前限制尝试,失败后再考虑升级;按请求询问允许工具显式请求更高权限;细粒度审批支持更细粒度权限请求;非信任时审批更倾向于确认后执行。

审批通过不代表无限授权。批准通常绑定某次动作、某类动作或本 session 内的特定范围。工具执行仍受权限配置和沙箱限制。

审批结果会回到 Session 队列。工具等待审批期间,用户可能追加输入或中断任务;队列化处理保证审批结果不会绕过当前轮次状态直接执行过期动作。

沙箱

沙箱将权限策略落实为具体执行环境。命令可以在隔离环境中运行,文件写入和网络访问被限制在允许范围内。

命令失败需要区分普通失败和沙箱阻止。测试退出码非零是工具结果,表示代码或测试失败;沙箱阻止表示动作被隔离策略阻止。后者可能触发升级请求,但升级仍需符合审批策略并获得批准。

沙箱重试是第二次执行尝试,不是同一次执行的延续。运行时需要记录第一次沙箱尝试的失败原因,并在批准后以新的沙箱条件重新执行。未获批准时,拒绝结果进入模型上下文。

执行策略

执行策略(ExecPolicy)对 shell 命令进行风险判断。不同命令具有不同风险:测试命令、删除命令、网络下载、修改 git 配置、启动后台进程的安全含义不同。

执行策略将命令内容、当前目录、环境、已批准权限、额外权限请求和沙箱策略结合起来,决定命令是否需要审批、是否应拒绝或是否可在沙箱内尝试。

执行策略使 shell 工具摆脱“任意字符串执行器”的形态。模型仍能请求命令,但命令会被解释为具有风险等级的动作。删除、网络下载、权限修改、后台进程和测试命令在审批路径上可以表现不同。

补丁安全

补丁会修改文件,因此需要独立安全评估。运行时会检查补丁是否为空、修改哪些路径、路径是否在允许范围内、当前沙箱能否约束写入、是否需要审批,以及当前策略是否允许询问。

模型生成补丁只表示提出修改方案。只有本地安全评估通过后,补丁才会应用。越界写入、只读配置下写入和无法安全约束的写入会被拒绝或进入审批流程。

补丁安全还需要考虑空补丁和路径解析。空补丁不能作为成功修改处理,路径归一化错误可能绕过工作区边界,多个文件修改需要整体评估。补丁是工具动作,不是助手文本的一部分。

权限请求

模型可以通过权限请求工具请求额外权限。请求会被处理器解析和规范化,空请求或不合法请求会被拒绝。合法请求根据当前审批策略进入用户审批或守护复核。

批准后,授权会物化为本轮次或 session 可用的 grants。拒绝后,拒绝信息会写回模型上下文,模型需要使用受限方案或说明无法继续。

权限请求是模型与权限系统之间的协议化交互。模型表达需要什么权限,运行时将请求规范化并交给审批系统,审批结果再成为后续工具执行的输入条件。

守护复核

守护复核(guardian)在部分审批场景中承担自动复核角色。它接收压缩后的会话上下文和待审批动作,判断动作是否允许。超时、格式错误或判断异常按拒绝处理。

守护复核不扩大权限。它只影响审批结果,实际执行仍经过处理器、权限配置和沙箱。

守护复核的失败模式按拒绝处理。自动复核超时、输出格式不合法或判断异常不会默认为通过。该策略保证自动审批不会成为绕过人工确认的隐式放行通道。

典型结果

普通测试失败会作为 shell 输出回填模型,不触发权限升级。

沙箱阻止表示动作被隔离层阻止,运行时根据策略决定是否请求升级。

补丁越界会被拒绝或进入审批流程,不能因补丁内容合理而直接应用。

权限请求被拒后,拒绝结果进入历史,模型只能调整方案或说明限制。

普通失败:
  工具已执行 -> 输出包含退出码/标准错误 -> 模型分析失败原因

权限拒绝:
  工具未执行 -> 输出包含拒绝原因 -> 模型请求权限或换方案

沙箱阻止:
  工具在隔离环境受阻 -> 可能请求升级 -> 批准后重新执行

补丁越界:
  修改未应用 -> 输出包含路径/权限原因 -> 模型缩小修改范围

安全边界

Codex 将模型置于决策层,将运行时置于执行层。模型可以建议动作,本地运行时必须验证动作。权限配置、审批策略、沙箱、执行策略、补丁安全和守护复核共同构成执行边界。这让“模型想做什么”和“本地允许做什么”保持分离,是智能体能进入真实代码仓库的前提。