跳转到内容

Agent 审批与安全

身份 非官方简体中文镜像
翻译状态 AI 翻译 / AI 审校
来源版本 官方未提供
同步日期 2026-07-31
官方原文 learn.chatgpt.com

如需完整文档索引,请参阅 llms.txt。文档页面的 Markdown 版本可通过在页面后追加 .md 来获取 URL。

Codex 有助于保护你的代码和数据,并降低滥用风险。

本页介绍如何安全地操作 Codex ,包括沙箱、审批、 以及网络访问。如果你在寻找 Codex Security,即用于 扫描已连接 GitHub 代码仓库的产品,请参阅 Codex Security

默认情况下,Agent 运行时会关闭网络访问。在本地, Codex 使用一个由 OS强制执行的沙箱来限制它可以接触的内容(通常限于当前工作区),并配合审批策略来控制它在执行操作前何时必须停止并询问你。

如需了解沙箱如何在 ChatGPT 桌面应用、 Codex CLI和 IDE 扩展中工作的高层说明,请参阅 沙箱。 如需更全面的企业安全概览,请参阅 Codex 安全白皮书

Codex 的安全控制来自两个协同工作的层面:

  • 沙箱模式:Codex 执行模型生成的命令时,在技术层面能够执行的操作(例如可以在哪里写入,以及是否能够访问网络)。
  • 审批策略:Codex 在执行操作前必须向你询问的时机(例如离开沙箱、使用网络或运行受信任集合之外的命令)。

Codex 会根据运行位置使用不同的沙箱模式:

  • Codex cloud:在隔离的 OpenAI托管容器中运行,防止访问你的主机系统或无关数据。使用两阶段运行时模型:设置阶段在 Agent 阶段之前运行,并且可以访问网络来安装指定依赖;随后 Agent 阶段默认离线运行,除非你为该环境启用互联网访问。为云环境配置的密钥仅在设置阶段可用,并会在 Agent 阶段开始前移除。
  • Codex CLI / IDE 扩展: OS级机制会强制执行沙箱策略。默认设置包括无网络访问,并且写入权限仅限于活动工作区。你可以根据自己的风险承受能力配置沙箱、审批策略和网络设置。

Auto 预设中(例如 --sandbox workspace-write --ask-for-approval on-request),Codex 可以自动读取文件、进行编辑,并在工作目录中运行命令。

Codex 会在编辑工作区外的文件,或运行需要网络访问的命令时请求审批。如果你想在不进行更改的情况下聊天或制定计划,请使用 read-only 命令切换到 /permissions 模式。

Codex 还可以对声明具有副作用的应用(连接器)工具调用触发审批,即使该操作不是 shell 命令或文件更改。当工具声明了破坏性注解时,破坏性的 app/MCP 工具调用始终需要审批,即使它同时声明了其他提示(例如只读提示)。

交互内容: ElevatedRiskBadge 的动态演示请参阅页面顶部的官方原文链接。

对于 Codex cloud,请参阅 代理互联网访问,以启用完整的互联网访问或域名允许列表。

对于 ChatGPT 桌面应用、Codex CLI 或 IDE extension,默认的 workspace-write 沙箱模式会保持网络访问关闭,除非你在配置中启用网络访问:

[sandbox_workspace_write]
network_access = true

网络访问通过目标规则控制,这些规则适用于脚本、 程序,以及由命令生成的子进程。当命令网络访问 已启用时,开启 network_proxy 功能以将该流量限制 在你配置的网络策略内。

[features.network_proxy]
enabled = true
domains = { "api.openai.com" = "allow", "example.com" = "deny" }

对于一次性的 CLI 会话,如果只需要 开关,请使用布尔简写;如果还要设置策略选项,请使用表格形式:

Terminal window
codex \
-c 'features.network_proxy=true' \
-c 'sandbox_workspace_write.network_access=true'
codex \
-c 'features.network_proxy.enabled=true' \
-c 'features.network_proxy.domains={ "api.openai.com" = "allow", "example.com" = "deny" }' \
-c 'sandbox_workspace_write.network_access=true'

该功能会改变已启用网络访问的执行方式;它本身不会授予 网络访问。请将 sandbox_workspace_write.network_accessworkspace-write 配置一起使用,以决定命令是否拥有网络访问:

  • 网络关闭 + network_proxy 开启:网络保持关闭,该功能不起作用。
  • 网络开启 + network_proxy 关闭:网络保持开启,并具有不受限制的直接 出站访问。
  • 网络开启 + network_proxy 开启:网络保持开启,出站流量 受配置的网络策略限制。

管理员管理的 experimental_network 要求独立于用户 功能开关。它们可以在没有 features.network_proxy的情况下配置并启动沙箱网络,但当活动 沙箱保持网络关闭时,它们不会开启网络访问。请参阅 托管配置 了解管理员侧的 requirements.toml 形式。

域名规则以允许列表优先:

  • 精确主机仅匹配其自身。
  • *.example.com 会匹配诸如 api.example.com这样的子域名,但不匹配 example.com
  • **.example.com 会同时匹配根域和子域名。
  • 全局 * 允许规则会匹配任何未被拒绝的公共主机。请将 * 视为宽泛的网络访问,并尽可能优先使用限定范围的规则。
  • deny 始终优先于 allow,并且全局 * 仅对允许规则有效。

默认情况下, allow_local_binding = false 会阻止环回、链路本地和 私有目标:

  • 特定例外:添加精确的本地 IP 字面量或 localhost 允许规则 ,当命令需要一个本地目标时。
  • 更广泛的访问:仅在你有意 allow_local_binding = true 希望获得更宽泛的 访问范围时,才设置 local/private 。
  • 通配符:通配符规则不算作显式本地例外。
  • 解析后的地址:解析到 local/private IPs 的主机名会保持被阻止 ,即使它们匹配允许列表。

在允许某个主机名之前, Codex 会执行尽力而为的 DNS 和 IP 分类检查:

  • 失败或超时的查询会被阻止。
  • 解析到非公共地址的主机名会被阻止。
  • 该检查会降低 DNS 重绑定风险,但无法消除它。要完全防止 重绑定,需要固定解析后的 IPs 并贯穿传输 层。

如果恶意 DNS 属于威胁范围,还应在更低层级强制执行出站控制。

以下两个设置会有意扩大信任边界:

  • dangerously_allow_non_loopback_proxy = true 可以将代理监听器暴露到 环回之外。
  • dangerously_allow_all_unix_sockets = true 会绕过 Unix 套接字允许列表。

仅在严格受控的环境中使用它们。当 Unix 套接字代理 启用时,即使请求了非环回绑定,监听器也会保持仅限环回, 因此沙箱网络不会成为通向本地守护进程的远程桥接。

默认情况下,network_proxy 处于关闭状态。启用后:

设置 默认值 行为
enabled false 仅当命令网络访问已开启时,才启动沙箱网络。
domains 未设置 使用允许列表行为,因此在你添加 allow 规则之前,不允许访问任何外部目标。支持精确主机、限定范围的通配符,以及全局 * 允许规则; deny 始终优先。
unix_sockets 未设置 在你添加显式 allow 规则之前,不允许任何 Unix 套接字目标。
allow_local_binding false 阻止本地和私有网络目标,除非你添加精确的本地 IP 字面量或 localhost 允许规则,或明确选择更广泛的 local/private 访问。
enable_socks5 true 在策略允许时暴露 SOCKS5 支持。
enable_socks5_udp true 允许 UDP 通过 SOCKS5 使用,当 SOCKS5 可用时。
allow_upstream_proxy true 让沙箱网络遵循环境中的上游代理。
dangerously_allow_non_loopback_proxy false 除非你有意将监听端点暴露到 localhost 之外,否则会将其保持在环回上。
dangerously_allow_all_unix_sockets false 除非你有意绕过该保护,否则会让 Unix 套接字访问保持基于允许列表。

你还可以控制网页搜索工具,而无需授予已启动命令完整的网络访问权限。Codex 默认使用网页搜索缓存来访问结果。该缓存是 OpenAI 维护的网页结果索引,因此缓存模式会返回预先建立索引的结果,而不是获取实时页面。这可以减少任意实时内容带来的提示注入风险,但你仍应将网页搜索结果视为不受信任的内容。如果你使用 --yolo 或其他完整访问沙箱设置,网页搜索默认使用实时结果。使用 --search 或将 web_search = "live" 设置为允许实时浏览,或将其设置为 "disabled" 以关闭该工具:

web_search = "cached" # default
# web_search = "disabled"
# web_search = "live" # same as --search

当外部网页访问应由 web_search = "indexed" 搜索索引门控时,设置 。在 Codex中启用网络访问或网页搜索时请谨慎。 提示注入可能导致 Agent 获取并遵循不可信指令。

  • 启动时,Codex 会检测文件夹是否受版本控制,并给出建议:
    • 受版本控制的文件夹:Auto(工作区写入 + 按请求审批)
    • 不受版本控制的文件夹:read-only
  • 根据你的设置,Codex 也可能先以 read-only 模式启动,直到你明确信任工作目录(例如通过引导提示或 /permissions)。
  • 工作区包括当前目录和 /tmp 等临时目录。使用 /status 命令查看哪些目录位于工作区中。
  • 要接受默认设置,请运行 codex
  • 你可以显式设置:
    • codex --sandbox workspace-write --ask-for-approval on-request
    • codex --sandbox read-only --ask-for-approval on-request

在默认的 workspace-write 沙箱策略下,可写根目录仍包含受保护路径:

  • <writable_root>/.git 无论以目录还是文件形式出现,都会作为只读受到保护。
  • 如果 <writable_root>/.git 是一个指针文件(gitdir: ...),解析出的 Git 目录路径也会作为只读受到保护。
  • <writable_root>/.agents 当它作为目录存在时,会作为只读受到保护。
  • <writable_root>/.codex 当它作为目录存在时,会作为只读受到保护。
  • 保护是递归的,因此这些路径下的所有内容都是只读的。

在不显示审批提示的情况下运行

Section titled “在不显示审批提示的情况下运行”

你可以使用 --ask-for-approval never 或简写形式 -a never 禁用审批提示。

此选项适用于所有 --sandbox 模式,因此你仍然可以控制 Codex 的自主程度。Codex 会在你设定的约束范围内尽力运行。

如果你需要 Codex 在不显示审批提示的情况下读取文件、进行编辑并使用网络访问运行命令,请使用 --sandbox danger-full-access(或 --dangerously-bypass-approvals-and-sandbox 标志)。使用前请谨慎评估。

作为折中方案,approval_policy = { granular = { ... } } 允许你保留特定审批提示类别的交互式确认,同时自动拒绝其他类别。细粒度策略涵盖沙箱审批、execpolicy-rule 提示、MCP 提示、request_permissions 提示和技能脚本审批。

默认情况下,审批请求会转交给你:

approvals_reviewer = "user"

当审批是交互式时,例如 approval_policy = "on-request" 或细粒度审批策略,自动审批审查会生效。设置 approvals_reviewer = "auto_review" 可在 运行请求之前,通过审查 Agent 路由符合条件的审批请求 Codex :

approval_policy = "on-request"
approvals_reviewer = "auto_review"

如需完整的审查器生命周期、触发条件、配置优先级 和失败行为,请参阅 自动审查

审查器只评估已经需要审批的操作,例如沙箱 提权、被阻止的网络请求、 request_permissions 提示,或 具有副作用的应用和 MCP 工具调用。保持在沙箱内的操作 会继续执行,不会增加额外的审查步骤。

审查器策略会检查数据外泄、凭据探测、持久性 安全削弱,以及破坏性操作。当策略允许时,低风险和中风险操作 可以继续执行。该策略会拒绝严重风险操作。 高风险操作需要足够的用户授权,并且没有匹配的拒绝规则。 提示构建、审查会话和解析失败会失败关闭。超时会 单独显示,但操作仍不会运行。

默认审查器策略 位于开源 Codex 代码仓库中。企业可以将其 租户特定部分替换为 guardian_policy_config ,在托管要求中使用。 也支持本地 [auto_review].policy 文本,但托管要求 优先。有关设置详情,请参阅 托管配置

在 ChatGPT 桌面应用中,这些审查会显示为自动审查项,并带有 “正在审查”、“已批准”、“已拒绝”、“已中止”或“已超时”等状态。它们还可以 包含被审查 请求的风险级别和用户授权评估。

自动审查会使用额外的模型调用,因此可能增加 Codex 用量。管理员 可以使用 allowed_approvals_reviewers对其进行限制。

意图 标志 / 配置 效果
自动(预设) 无需标志--sandbox workspace-write --ask-for-approval on-request Codex 可以读取文件、进行编辑,并在工作区中运行命令。 Codex 需要审批才能编辑工作区之外的内容或访问网络。
安全的只读浏览 --sandbox read-only --ask-for-approval on-request Codex 可以读取文件并回答问题。 Codex 需要审批才能进行编辑、运行命令或访问网络。
只读非交互式(CI) --sandbox read-only --ask-for-approval never Codex 只能读取文件;从不请求审批。
自动编辑,但运行不受信任的命令前请求审批 --sandbox workspace-write --ask-for-approval untrusted Codex 可以读取和编辑文件,但在运行不受信任的命令前会请求审批。
自动审查模式 --sandbox workspace-write --ask-for-approval on-request -c approvals_reviewer=auto_reviewapprovals_reviewer = "auto_review" 沙箱边界与标准的按需请求模式相同,但符合条件的审批请求会由自动审查来审查,而不是呈现给用户。
危险的完全访问权限 --dangerously-bypass-approvals-and-sandbox (别名: --yolo

交互内容: ElevatedRiskBadge 的动态演示请参阅页面顶部的官方原文链接。 无沙箱;无审批 (不推荐) |

对于非交互式运行,请使用 codex exec --sandbox workspace-write;Codex 会将旧版 codex exec --full-auto 调用保留为已弃用的兼容路径,并显示警告。

使用 --ask-for-approval untrusted时, Codex 只会自动运行已知安全的读取操作。可能改变状态或触发外部执行路径的命令(例如破坏性的 Git 操作或 Git output/config-override 标志)需要审批。

有关更广泛的配置流程,请参阅配置基础高级配置配置参考

# Always ask for approval mode
approval_policy = "untrusted"
sandbox_mode = "read-only"
allow_login_shell = false # optional hardening: disallow login shells for shell-based tools
# Optional: Allow network in workspace-write mode
[sandbox_workspace_write]
network_access = true
# Optional: granular approval policy
# approval_policy = { granular = {
# sandbox_approval = true,
# rules = true,
# mcp_elicitations = true,
# request_permissions = false,
# skill_approval = false
# } }

你还可以将预设保存为配置文件,然后使用 codex --profile profile-name 选择它们:

~/.codex/full_auto.config.toml
approval_policy = "on-request"
sandbox_mode = "workspace-write"
~/.codex/readonly_quiet.config.toml
approval_policy = "never"
sandbox_mode = "read-only"

要了解命令在 Codex 沙箱中运行时的情况,请使用以下 Codex CLI 命令:

Terminal window
# macOS
codex sandbox macos [--permissions-profile <name>] [--log-denials] [COMMAND]...
# Linux
codex sandbox linux [--permissions-profile <name>] [COMMAND]...
# Windows
codex sandbox windows [--permissions-profile <name>] [COMMAND]...

sandbox 命令也可通过 codex debug 使用,并且平台辅助工具提供了别名(例如 codex sandbox seatbeltcodex sandbox landlock)。

Codex 会根据你的 OS以不同方式强制执行沙箱:

  • macOS 使用 Seatbelt 策略,并通过 sandbox-exec 配合某个配置文件(-p)来运行命令,该配置文件对应你选择的 --sandbox 模式。当受限读取访问启用平台默认值时, Codex 会附加一项精选的 macOS 平台策略(而不是宽泛允许 /System),以保持常用工具兼容性。
  • Linux 默认使用 bwrapseccomp
  • WindowsWindows Subsystem for Linux 2(WSL2)中运行时使用 Linux 沙箱实现。 WSL1 曾通过 Codex 0.114受支持;从 0.115开始,Linux 沙箱迁移到 bwrap,因此 WSL1 不再受支持。在 Windows 原生运行时, Codex 使用 Windows 沙箱 实现。

如果你在 Windows 上使用 Codex IDE extension,它可以直接支持 WSL2。请在 VS Code 设置中添加以下配置,以便在 WSL2 可用时始终让代理在其中运行:

{
"chatgpt.runCodexInWindowsSubsystemForLinux": true
}

这确保 IDE 扩展在命令、审批和文件系统访问方面继承 Linux 沙箱语义,即使主机 OS 是 Windows。请在 WSL 指南中了解更多。

在 Windows 原生运行时,请在 config.toml 中配置原生沙箱模式:

[windows]
sandbox = "unelevated" # or "elevated"
# sandbox_private_desktop = true # default; set false only for compatibility

详情请参阅 Windows 设置指南

当你在 Docker 等容器化环境中运行 Linux 时,如果主机或容器配置阻止了 bwrap所需的命名空间、setuid seccomp 或 Codex 操作,沙箱可能无法工作。

在这种情况下,请配置你的 Docker 容器以提供所需的隔离,然后在容器内使用 codex 运行 --sandbox danger-full-access (或使用 --dangerously-bypass-approvals-and-sandbox 标志)。

如果你的主机无法直接运行 Linux 沙箱,或者你的组织已经统一采用容器化开发,请使用 Dev Containers 运行 Codex,并让 Docker 提供外层隔离边界。此方式适用于 Visual Studio Code Dev Containers 和兼容工具。

请将 Codex 安全 devcontainer 示例作为参考实现。该示例会安装 Codex、常用开发工具、bubblewrap 以及基于防火墙的出站控制。

Devcontainer 提供了大量保护,但不能阻止所有 攻击。如果你在容器内使用 Codex 或 --sandbox danger-full-access 运行 --dangerously-bypass-approvals-and-sandbox ,恶意的 项目可能会窃取 devcontainer 内可用的任何内容,包括 Codex 凭据。仅对受信任的仓库使用此模式,并像在任何其他提权环境中一样 监控 Codex 活动。

参考实现包含:

  • 一个 Ubuntu 24.04 基础镜像,其中安装了 Codex 和常用开发工具;
  • 基于允许列表的出站访问防火墙配置;
  • VS 用于在容器中重新打开工作区的 Code 设置和扩展建议;
  • 用于命令历史记录和 Codex 配置的持久挂载;
  • bubblewrap,因此当容器授予所需能力时, Codex 仍可使用其 Linux 沙箱。

尝试使用:

  1. 安装 Visual Studio Code 和 Dev Containers 扩展
  2. 将 Codex 示例中的 .devcontainer 设置复制到你的代码仓库,或直接从 Codex 代码仓库开始。
  3. 在 VS Code 中运行 Dev Containers: Open Folder in Container…,然后选择 .devcontainer/devcontainer.secure.json
  4. 容器启动后,打开终端并运行 codex

你还可以通过 CLI 启动容器:

Terminal window
devcontainer up --workspace-folder . --config .devcontainer/devcontainer.secure.json

该示例包含三个主要部分:

  • .devcontainer/devcontainer.secure.json 控制容器设置、能力、挂载、环境变量和 VS Code 扩展。
  • .devcontainer/Dockerfile.secure 定义基于 Ubuntu 的镜像和已安装的工具。
  • .devcontainer/init-firewall.sh 应用出站网络策略。

参考防火墙有意设计为起点。如果你依赖域名允许列表来实现隔离,请根据你的环境实施 DNS rebinding 和 DNS 刷新保护,例如支持 TTL 的刷新机制或 DNS 感知型防火墙。

在容器内,选择以下模式之一:

  • 如果 Dev Container 配置文件授予了 Codex创建内部沙箱所需的能力,请保持 bwrap 的 Linux 沙箱启用。
  • 如果容器是你预期的安全边界,请在容器内使用 Codex 运行 --sandbox danger-full-access ,这样 Codex 就不会尝试创建第二层沙箱。

Codex 最适合配合版本控制工作流使用:

  • 在功能分支上工作,并在委托前保持 git status 干净。这能让 Codex 补丁更容易隔离和回滚。
  • 优先使用基于补丁的工作流(例如 git diff/git apply),而不是直接编辑已跟踪文件。频繁提交,这样你可以按小增量回滚。
  • 像对待任何其他 Codex 建议一样对待 PR:运行有针对性的验证、审查差异,并在提交消息中记录决策以便审计。

Codex 支持通过 OpenTelemetry (OTel) 选择性启用监控,帮助团队审计使用情况、调查问题并满足合规要求,同时不削弱本地安全默认设置。遥测默认关闭;请在配置中明确启用。

  • Codex 默认关闭 OTel 导出,以保持本地运行自包含。
  • 启用后, Codex 会发出结构化日志事件,涵盖聊天、 API 请求、 SSE/WebSocket 流活动、用户提示(默认已脱敏)、工具审批决策和工具结果。
  • Codex 会用 service.name (发起者)、 CLI 版本和环境标签标记导出的事件,以区分 dev/staging/prod 流量。

向你的 [otel] 配置添加一个 Codex 块(通常是 ~/.codex/config.toml),选择导出器以及是否记录提示文本。

[otel]
environment = "staging" # dev | staging | prod
exporter = "none" # none | otlp-http | otlp-grpc
log_user_prompt = false # redact prompt text unless policy allows
  • exporter = "none" 会使检测保持启用,但不会将数据发送到任何位置。
  • 要将事件发送到你自己的收集器,请选择以下选项之一:
[otel]
exporter = { otlp-http = {
endpoint = "https://otel.example.com/v1/logs",
protocol = "binary",
headers = { "x-otlp-api-key" = "${OTLP_TOKEN}" }
}}
[otel]
exporter = { otlp-grpc = {
endpoint = "https://otel.example.com:4317",
headers = { "x-otlp-meta" = "abc123" }
}}

Codex 会批量处理事件,并在关闭时刷新。Codex 仅导出其 OTel 模块生成的遥测数据。

代表性事件类型包括:

  • codex.conversation_starts (模型、推理设置、 sandbox/approval 策略)
  • codex.api_request (尝试、 status/success、时长和错误详情)
  • codex.sse_event (流事件类型、 success/failure、时长,以及 response.completed上的 token 计数)
  • codex.websocket_requestcodex.websocket_event (请求时长以及每条消息的 kind/success/error)
  • codex.user_prompt (长度;除非明确启用,否则内容会被脱敏)
  • codex.tool_decision (approved/denied,来源:配置与用户)
  • codex.tool_result (时长、成功状态、输出片段)

关联的 OTel 指标(计数器与持续时间直方图成对出现)包括 codex.api_requestcodex.sse_eventcodex.websocket.requestcodex.websocket.eventcodex.tool.call(以及对应的 .duration_ms 指标)。

有关完整事件目录和配置参考,请参阅 Codex 上的配置文档 GitHub

  • 保持 log_user_prompt = false ,除非策略明确允许存储提示内容。提示可能包含源代码和敏感数据。
  • 仅将遥测路由到你控制的收集器;应用与你的合规要求一致的保留期限和访问控制。
  • 将工具参数和输出视为敏感内容。尽可能优先在收集器或 SIEM 处进行脱敏。
  • 如果你不希望 history.persistence / history.max_bytes将会话转录保存到 Codex 下,请审查本地数据保留设置(例如 CODEX_HOME)。请参阅 高级配置配置参考
  • 如果你在关闭网络访问的情况下运行 CLI , OTel 导出无法连接到你的收集器。要导出,请在 workspace-write 模式下允许访问 OTel 端点,或从 Codex cloud 导出,并将收集器域名加入你的批准列表。
  • 定期审查事件,检查 approval/sandbox 变更和意外的工具执行。

OTel 是可选功能,旨在补充而非替代上述沙箱和审批保护措施。

企业管理员可以在 Codex 托管配置 中为其工作区配置安全设置。请参阅该页面了解设置和策略详情。