在前文中,我们已经学习了 `exec` 命令的基本用法,也短暂提到了三种沙箱模式:`ask`、`full-auto` 和 `yolo`。但这三种模式到底有什么区别?它们各自的安全边界在哪里?在什么场景下应该使用哪种模式?

沙箱模式详解 —— `--full-auto`、`--yolo`、安全边界与文件权限

简介

在前文中,我们已经学习了 exec 命令的基本用法,也短暂提到了三种沙箱模式:askfull-autoyolo。但这三种模式到底有什么区别?它们各自的安全边界在哪里?在什么场景下应该使用哪种模式?

本文将深入剖析 Codex CLI 的沙箱安全体系。这不仅仅是一份功能文档,更是一份安全指南——了解 AI 被允许做什么、被禁止做什么,以及你如何在不同场景下调整安全策略。

一、沙箱模式全景图

Codex CLI 提供三种沙箱模式,代表了三种不同的安全-效率权衡:

text
┌──────────────────────────────────────────────────────────────┐
│                    沙箱模式安全光谱                            │
│                                                              │
│  ←────────── 更安全                        更高效 ──────────→ │
│                                                              │
│  ┌──────────┐    ┌──────────────┐    ┌──────────────────┐   │
│  │   ask    │ →  │  full-auto   │ →  │      yolo        │   │
│  │  (默认)   │    │  (全自动)     │    │  (极限模式)       │   │
│  └──────────┘    └──────────────┘    └──────────────────┘   │
│                                                              │
│  每步确认          沙箱内全自动           放宽更多限制          │
│  最安全            平衡安全与效率          最高效率             │
│  适合新手          适合日常开发            适合受信任任务       │
│                                                              │
└──────────────────────────────────────────────────────────────┘
模式 权限级别 交互程度 适用场景
ask 受限 每步需要确认 首次使用、敏感操作、学习环境
full-auto 沙箱内完全自动 无需确认 日常开发、批量任务
yolo 放宽限制 无需确认 受信任任务、快速原型

二、`ask` 模式:默认的安全之选

2.1 工作原理

ask 模式是 Codex CLI 的默认沙箱模式。在这种模式下,AI 在执行以下关键操作之前,会暂停并征求你的同意:

  • 创建或修改文件
  • 执行 shell 命令
  • 安装软件包
  • 删除文件
  • 网络请求
bash
codex --sandbox ask "创建一个服务器并安装 express"

执行输出示例

text
🤖 Codex is working...

⚡ Action: Create file 'server.js'
   Content preview:
   ┌─────────────────────────────────┐
   │ const express = require('express');│
   │ const app = express();           │
   │ const PORT = process.env.PORT... │
   │                                  │
   │ app.get('/', (req, res) => {    │
   │   res.send('Hello World!');      │
   │ });                              │
   │                                  │
   │ app.listen(PORT, () => {         │
   │   console.log(`Server running...`│
   │ });                              │
   └─────────────────────────────────┘
   Approve? [Y/n/d(details)/e(edit)]:

2.2 交互选项详解

当 AI 请求批准时,你可以输入:

输入 含义 说明
Y / 回车 批准 允许 AI 执行该操作
n 拒绝 跳过该操作,AI 会尝试其他方案
d 查看详情 显示完整的操作细节
e 编辑 手动修改操作内容后再批准
Yall 全部批准 批准当前操作及后续同类操作
text
Approve? [Y/n/d/e]: d

📋 详细信息:
   操作类型: 创建文件
   文件路径: /sandbox/server.js
   文件大小: 245 bytes
   文件权限: 644
   影响范围: 新建文件

Approve? [Y/n/d/e]: e

✏️ 编辑模式:
   请修改文件内容后保存...
   (会打开临时编辑器)

2.3 `ask` 模式的最佳使用场景

bash
# ✅ 适合 ask 模式的场景

# 1. 首次使用 Codex CLI 时
codex "帮我创建一个项目"

# 2. 执行可能破坏性的操作时
codex "删除所有 node_modules 目录"

# 3. 处理生产环境代码时
codex "修改数据库连接配置"

# 4. 学习 AI 的工作方式时
codex "解释这段代码并优化它"

2.4 批量批准技巧

如果你信任 AI 的方向,但又不想切换到全自动模式,可以使用批量批准:

bash
# 使用 Yall 批准所有同类操作
codex "创建一个包含 20 个组件的 React 项目"

# 当第一个组件被创建时,输入 Yall
Approve? [Y/n/d/e]: Yall

# 后续所有文件创建操作将自动批准,但仍会在不同类型操作时询问

三、`--full-auto` 模式:沙箱内的全自动驾驶

3.1 什么是 `full-auto`?

full-auto 模式是 Codex CLI 的全自动沙箱模式。在这种模式下:

  • ✅ AI 在沙箱内执行任何操作都 不需要 你的确认
  • ✅ AI 可以自主创建、修改、删除文件
  • ✅ AI 可以运行任何 shell 命令
  • ✅ AI 可以在沙箱内安装软件包
  • ❌ AI 仍然不能 突破沙箱的安全边界(访问沙箱外的文件系统、执行特权操作等)
bash
codex --sandbox full-auto "创建一个完整的 Express REST API,包含用户认证、CRUD 操作和单元测试"

3.2 `full-auto` vs `ask` 行为对比

bash
# ask 模式 —— 交互式
codex --sandbox ask "安装 lodash 并创建一个使用它的工具函数"
# 输出: ⚡ Action: Run command 'npm install lodash'
# 输出: Approve? [Y/n]: Y        ← 需要你确认
# 输出: ⚡ Action: Create file 'utils.js'
# 输出: Approve? [Y/n]: Y        ← 需要你确认

# full-auto 模式 —— 全自动
codex --sandbox full-auto "安装 lodash 并创建一个使用它的工具函数"
# 输出: 📝 Step 1/3: 安装依赖
# 输出: ✓ npm install lodash completed
# 输出: 📝 Step 2/3: 创建工具函数
# 输出: ✓ utils.js created
# 输出: 📝 Step 3/3: 验证
# 输出: ✓ 所有测试通过

3.3 `full-auto` 的安全边界

很多人担心:全自动模式会不会让 AI 为所欲为?答案是否定的。即使在全自动模式下,AI 的行为仍然受到沙箱的严格限制:

text
┌───────────────────────────────────────────────────────┐
│                   安全边界示意图                        │
│                                                       │
│  ┌─────────────────────────────────────────────────┐  │
│  │              沙箱内部 (full-auto 允许)            │  │
│  │                                                 │  │
│  │  ✅ 读写工作目录文件                               │  │
│  │  ✅ 运行代码和命令                                 │  │
│  │  ✅ 安装软件包                                    │  │
│  │  ✅ Git 操作                                     │  │
│  │  ✅ 网络请求(有限制)                              │  │
│  │                                                 │  │
│  └──────────────┬──────────────────────────────────┘  │
│                 │  🛑 安全边界                          │
│                 │                                      │
│  ┌──────────────▼──────────────────────────────────┐  │
│  │              沙箱外部 (始终禁止)                   │  │
│  │                                                 │  │
│  │  ❌ 访问 ~/.ssh/ 等敏感目录                       │  │
│  │  ❌ 修改系统配置                                  │  │
│  │  ❌ 执行 sudo / 特权操作                          │  │
│  │  ❌ 访问工作目录外的文件                            │  │
│  │  ❌ 持久化改变宿主机状态                            │  │
│  │                                                 │  │
│  └─────────────────────────────────────────────────┘  │
│                                                       │
└───────────────────────────────────────────────────────┘

3.4 `full-auto` 的适用场景

bash
# ✅ 适合 full-auto 的场景

# 1. 日常开发任务
codex --sandbox full-auto "添加一个用户登录页面"

# 2. 批量代码重构
codex --sandbox full-auto "将所有回调函数转换为 Promise"

# 3. 代码生成
codex --sandbox full-auto "生成 50 个测试用例"

# 4. 数据处理
codex --sandbox full-auto "解析这个 JSON 文件并生成报告"

# 5. 在 CI/CD 中
codex --sandbox full-auto "运行测试并修复失败的用例"

四、`--yolo` 模式:极限自由模式

4.1 什么是 `yolo`?

yolo 模式(You Only Live Once)是 Codex CLI 最激进的沙箱模式。名字本身就说明了它的态度——放手让 AI 去做,不要管它。

相比 full-autoyolo 模式进一步放宽了限制:

text
┌─────────────────────────────────────────────────────────┐
│               full-auto vs yolo 对比                     │
├──────────────────────┬──────────────────────────────────┤
│     full-auto        │            yolo                  │
├──────────────────────┼──────────────────────────────────┤
│ 沙箱内完全自动        │ 放宽更多沙箱限制                  │
│ 不允许访问外部网络    │ 可能允许更多网络访问              │
│ 严格限制命令执行      │ 更宽松的命令执行权限              │
│ 适合日常开发          │ 适合完全受信任的任务              │
│ 保留安全底线          │ 在受控环境下追求最大效率          │
└──────────────────────┴──────────────────────────────────┘
bash
codex --sandbox yolo "创建一个完整的 Web 应用,包含前端、后端、数据库,并部署到本地服务器"

4.2 `yolo` 模式的额外权限

yolo 模式相比 full-auto,可能允许以下额外操作(具体取决于版本实现):

操作 full-auto yolo
沙箱内文件操作
沙箱内命令执行
网络访问 有限 更宽松
访问工作目录外文件 可能允许(取决于配置)
安装系统级包 可能允许
执行长时运行命令 受限 允许

4.3 何时使用 `yolo`?

bash
# ✅ 适合 yolo 的场景

# 1. 快速原型验证
codex --sandbox yolo "用最快速度搭建一个博客系统"

# 2. 完全隔离的测试环境
codex --sandbox yolo "在一个空目录中创建一个完整的全栈应用"

# 3. 竞赛或黑客松
codex --sandbox yolo "在 30 分钟内创建一个功能完整的 CRUD 应用"

# 4. 你已经完全信任 AI 的方向
codex --sandbox yolo "继续重构剩下的所有文件"

4.4 ⚠️ `yolo` 模式的风险警告

text
┌─────────────────────────────────────────────────┐
│                    ⚠️ 警告                        │
│                                                 │
│  yolo 模式放宽了安全限制,使用前请确认:           │
│                                                 │
│  1. 你在工作目录中没有敏感文件                     │
│  2. 你已备份重要数据                              │
│  3. 你理解 AI 可能执行的任何操作                   │
│  4. 你已准备好 git checkout 来回滚更改             │
│                                                 │
│  使用 yolo 模式 = 你承担所有风险                   │
│                                                 │
└─────────────────────────────────────────────────┘

安全建议

bash
# 使用 yolo 模式前的安全检查清单

# 1. 检查当前目录状态
git status
# 确保没有未提交的更改,或者先提交

# 2. 创建备份分支
git checkout -b backup-before-yolo
git checkout -

# 3. 在独立目录中执行
mkdir -p ~/codex-yolo-experiment
cd ~/codex-yolo-experiment
git init
codex --sandbox yolo "你的任务"

# 4. 执行后检查
git diff --stat
git log --oneline

五、安全边界详解

5.1 沙箱隔离的层次

Codex CLI 的沙箱安全不是单一维度的,而是多层次的防御体系:

text
┌───────────────────────────────────────────────────────────┐
│                    多层次安全防御                            │
│                                                           │
│  Layer 1: 文件系统隔离                                      │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  • 沙箱使用独立的文件系统命名空间                        │  │
│  │  • 工作目录通过 bind mount 映射到沙箱                    │  │
│  │  • 其他系统目录不可见                                  │  │
│  └─────────────────────────────────────────────────────┘  │
│                                                           │
│  Layer 2: 进程隔离                                          │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  • 沙箱内的进程在独立的 PID 命名空间中                    │  │
│  │  • 无法看到或影响宿主机进程                             │  │
│  │  • 资源使用受限(CPU、内存、磁盘)                       │  │
│  └─────────────────────────────────────────────────────┘  │
│                                                           │
│  Layer 3: 网络隔离                                          │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  • 网络访问受防火墙规则控制                             │  │
│  │  • 仅允许特定的出站连接                                 │  │
│  │  • 本地端口绑定受限                                    │  │
│  └─────────────────────────────────────────────────────┘  │
│                                                           │
│  Layer 4: 权限隔离                                          │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  • 沙箱内以非特权用户运行                               │  │
│  │  • 无 sudo / root 权限                               │  │
│  │  • 设备访问受限                                      │  │
│  └─────────────────────────────────────────────────────┘  │
│                                                           │
└───────────────────────────────────────────────────────────┘

5.2 被明确禁止的操作

无论在哪个模式下,以下操作始终被禁止:

bash
# ❌ 这些操作在沙箱中始终被阻止

# 访问敏感目录
cat /etc/shadow          # ❌ 密码文件
cat ~/.ssh/id_rsa        # ❌ SSH 私钥
cat ~/.env               # ❌ 环境变量文件

# 特权操作
sudo rm -rf /            # ❌ 危险命令
chmod 777 /              # ❌ 修改系统权限

# 进程操作
kill -9 1                # ❌ 杀死 init 进程
ps aux | grep ssh        # ❌ 查看系统进程

# 网络攻击
curl http://localhost:6379  # ❌ 扫描本地端口
nmap localhost              # ❌ 网络扫描

# 设备访问
cat /dev/sda1          # ❌ 直接访问磁盘设备
ls /dev/               # ❌ 查看设备文件

5.3 安全测试验证

你可以通过以下命令验证沙箱的安全边界:

bash
codex --sandbox yolo "尝试以下操作并报告结果:
1. 读取 /etc/passwd
2. 读取 /etc/shadow
3. 查看当前进程列表
4. 尝试写入 /tmp
5. 访问宿主机 IP
6. 检查是否以 root 运行"

预期结果:

text
1. /etc/passwd:可能可以读取(沙箱内的副本,非真实系统文件)
2. /etc/shadow:❌ 被阻止 — 权限不足
3. 进程列表:只能看到沙箱内的进程
4. 写入 /tmp:✅ 可以(沙箱内的 /tmp)
5. 宿主机 IP:❌ 网络受限
6. root 检查:❌ 以非特权用户运行

六、文件权限管理

6.1 沙箱中的文件权限

Codex CLI 在沙箱中创建文件时遵循以下默认权限:

文件类型 默认权限 说明
普通文件 644 (rw-r--r--) 所有者可读写,其他人只读
可执行脚本 755 (rwxr-xr-x) 所有者可执行,其他人可读可执行
目录 755 (rwxr-xr-x) 所有者可进入和修改,其他人可进入

6.2 权限继承

bash
codex "创建以下目录结构并设置权限:
- src/ (755)
- src/models/ (755)
- src/models/User.js (644)
- scripts/ (755)
- scripts/deploy.sh (755)
- .env (600)"

6.3 权限变更的安全性

bash
# ❌ 这些权限变更会被沙箱阻止
codex "chmod 777 /"
codex "chown root:root /sandbox/file"

# ✅ 这些权限变更在沙箱内允许
codex "chmod +x scripts/deploy.sh"
codex "chmod 600 .env"

6.4 Git 权限追踪

Git 只追踪可执行位(execute bit),不追踪完整的权限设置:

bash
# Git 会追踪的变化
chmod +x script.sh    # ✅ Git 会记录这个变化
chmod -x script.sh    # ✅ Git 会记录这个变化

# Git 不会追踪的变化
chmod 644 file.txt    # ❌ Git 忽略(除非是可执行位变化)
chmod 600 file.txt    # ❌ Git 忽略

这意味着 Codex CLI 在沙箱中修改文件权限后,同步到你的工作目录时,只有可执行位会被 Git 追踪。

七、配置沙箱策略

7.1 通过配置文件设置默认模式

json
{
  "sandbox_mode": "full-auto",
  "auto_approve_commands": [
    "npm install",
    "npm test",
    "git status",
    "ls",
    "cat"
  ],
  "blocked_commands": [
    "rm -rf /",
    "sudo",
    "curl",
    "wget"
  ]
}

7.2 通过环境变量覆盖

bash
# 临时设置沙箱模式
export CODEX_SANDBOX_MODE=full-auto
codex "你的任务"

# 或者在命令中直接指定
CODEX_SANDBOX_MODE=yolo codex "快速原型开发"

7.3 白名单和黑名单

你可以在配置中设置命令白名单和黑名单:

json
{
  "allowed_commands": [
    "npm",
    "node",
    "python",
    "git",
    "ls",
    "cat",
    "echo",
    "mkdir",
    "touch"
  ],
  "blocked_commands": [
    "rm -rf",
    "sudo",
    "curl",
    "wget",
    "nc",
    "nmap",
    "ssh"
  ]
}

八、模式选择决策树

text
                    你信任 AI 吗?
                    /            \
                  否              是
                 /                  \
           使用 ask 模式         任务敏感吗?
                                /          \
                              是            否
                             /                \
                       使用 ask 模式       需要最大效率?
                                          /          \
                                        是            否
                                       /                \
                                 使用 yolo 模式    使用 full-auto 模式

实用建议

bash
# 新手阶段:始终使用 ask
codex --sandbox ask "任何任务"

# 熟悉后:日常开发用 full-auto
codex --sandbox full-auto "添加用户注册功能"

# 快速迭代:在隔离环境中用 yolo
mkdir -p /tmp/codex-experiment && cd /tmp/codex-experiment && git init
codex --sandbox yolo "创建一个完整的应用"

# 混合使用:敏感操作 ask,常规操作 full-auto
codex --sandbox ask "修改数据库密码"
codex --sandbox full-auto "添加新的 API 端点"

总结

本文深入剖析了 Codex CLI 的沙箱安全体系:

  1. 三种沙箱模式ask(默认安全)、full-auto(全自动)、yolo(极限自由)
  2. 安全边界:多层防御体系(文件系统、进程、网络、权限隔离)
  3. 始终禁止的操作:敏感文件访问、特权操作、网络攻击等
  4. 文件权限管理:默认权限、权限继承、Git 追踪规则
  5. 策略配置:通过配置文件和环境变量自定义安全策略
  6. 模式选择:基于信任度和任务敏感度的决策指南

理解并合理使用这些沙箱模式,是安全高效地使用 Codex CLI 的关键。

下篇预告

下一篇我们将探讨 Git 要求与临时仓库。你将学习:

  • 为什么 Codex CLI 必须 在 Git 仓库中运行?
  • git init scratch 模式是什么?
  • 如何为每次 Codex 任务创建干净的临时仓库?
  • Git 在 Codex CLI 中的角色:版本控制、上下文提供、回滚保障

敬请期待!