Skip to main content

这页解决什么问题

Codex 能读取项目文件、运行命令、调用工具,也可能访问网页、浏览器和桌面应用。能力越多,数据越容易跨越原本的边界。要防的不是抽象的“AI 风险”,而是几条可复盘的数据路径:
  1. 敏感内容被读取。
  2. 内容进入模型上下文、日志、缓存或截图。
  3. 内容被命令、插件、网页或外部服务带到另一条数据流。
  4. 你把异常动作误认为正常步骤并批准。
本页给出日常可执行的判断方法。具体菜单、配置键和默认行为会随版本变化,涉及本机设置时以 codex --help、/status 和官方文档为准。
参考资料:参考/codex/16-security.md、参考/codex/17-computer-use.md、参考/codex/15-permissions.md。

六条原则

  • 网络默认关闭。 workspace-write 能写工作区,不代表能访问互联网。
  • 缓存搜索不等于可信。 缓存减少实时网页入口,但搜索结果仍是不可信内容。
  • 实时搜索需要更高警惕。 实时页面更容易携带提示注入、下载和外发诱导。
  • 密钥不进入工作区。 .env、SSH 私钥、云凭据和生产配置不应复制到项目目录或 /tmp。
  • Computer Use 看到的是真屏幕。 登录态、剪贴板、通知和窗口内容都可能成为任务上下文。
  • 批准是一次授权。 每次批准前都核对命令、路径、域名、数据和后果;看不懂就拒绝。

一、先做数据流盘点

打开网络或使用桌面工具前,先回答“什么数据从哪里到哪里”。不要只看 Codex 是否联网,还要盘点输入、输出和中间系统。

数据源

数据出口

任务账本

开始前记录以下内容;没有答案的格子就表示不能批准: 一个正常的依赖检查应是:
它不需要读取 .env、~/.npmrc,也不需要上传整个目录。若审批提示出现这些动作,任务范围已经偏移。

二、网络默认关闭

workspace-write 不等于联网

日常推荐组合是:
workspace-write 允许代理在工作区范围内读写和运行命令,但网络默认关闭。派生出来的 npm、pip、git、curl 等命令也受同一网络边界影响。
文件可写、命令可运行、网络可访问,是三个不同的权限问题。
先执行:
核对沙箱模式、审批策略、工作区目录和网络状态。不要根据记忆判断“应该是关网”,因为配置文件、启动参数、工作区信任状态和版本升级都可能改变实际行为。

只在明确需要时开网

需要下载依赖或调用明确的开发 API 时,先限定任务,再临时启用网络。配置示意如下,实际节点以本地版本为准:
建议按以下顺序:
  1. 记录为什么需要网络。
  2. 列出精确 host 和请求类型。
  3. 确认请求不会携带密钥、客户数据或 cookie。
  4. 只为这一次任务开网。
  5. 查看实际命令、重定向和响应。
  6. 结束后关闭网络并清理临时产物。
打开网络后,以下动作都要提高警惕:下载并执行脚本、上传文件、修改包源或 Git remote、访问 README 指定的陌生域名、安装未锁定版本的插件或依赖,以及把网页内容直接管道给 shell。 网络开关只限制“能不能发出去”,不判断“发出去是否合理”。

三、搜索缓存与实时搜索

缓存不等于可信

网页搜索默认可能使用预先索引的缓存结果。缓存减少了代理直接抓取任意实时页面的机会,但不等于离线,也不等于安全数据库。缓存结果仍可能含有:
  • 对模型说话的隐藏或显眼指令;
  • 诱导下载、复制命令或泄露数据的文本;
  • 过期、篡改或与当前页面不一致的信息;
  • 指向新域名、登录页或上传接口的链接。
正确心态是:

实时模式

按版本和启动方式,显式使用 --search、把 web_search 设为 live,或启用某些完全访问模式,可能使搜索走实时内容:
具体可用值和优先级以本地版本为准。实时搜索会增加新页面、新域名、登录态和页面注入的风险。若不需要实时信息,保持默认缓存;只为必要的时效性资料临时使用实时模式。

搜索结果处理

看到以下文本时暂停:
这是网页内容,不是用户授权。搜索前还要问:是否真的需要实时结果?当前提示是否含内部名称或客户数据?命中的 host 是否为官方域名?页面是否要求登录、下载、上传或复制命令?是否有独立来源可交叉核对?

四、域名白名单

精确放行

白名单把“可以联网”缩小为“可以访问哪些 host”。它不能证明站点可信,但能减少误连、外发和供应链入口。推荐顺序是:网络关闭,需要时只开精确域名,并继续逐次批准外发和破坏性请求。 某些版本的配置意图如下:
有些版本会将域名放在 permission profile 或其他网络节点中,先核对本地语法。不要以方便为理由使用:
全局 * 接近放开一大片网络,不应成为日常默认。

规则边界

参考配置中 deny 应压过 allow,越精确的规则越适合表达例外。但不要假设所有版本对通配符、子域名、重定向和 IP 解析的处理完全相同:
  • api.example.com 不一定涵盖 uploads.example.com;
  • 允许包源不代表允许安装脚本访问其他站点;
  • HTTP 重定向可能到另一 host;
  • 代理、DNS 和证书可能改变连接路径;
  • 允许读接口不等于允许 POST、上传或删除。
批准域名时问四个问题:身份是否是任务所需的官方服务?是否能缩小到一个 host?请求会带哪些 header、query、body、cookie 或文件?响应是否会触发安装、写入、提交、支付或其他状态变化?不知道域名为何出现,就拒绝并回到任务说明核对。

五、API key、.env 与 SSH

凭据分类

.env 做法

  • 提交只含变量名的 .env.example;
  • 将真实 .env 加入 .gitignore;
  • 不把真实值贴入对话,不复制到项目目录、/tmp 或构建产物;
  • 用最小环境变量子集启动命令;
  • 诊断只输出是否存在,不输出完整环境;
  • 结束后检查日志、报告、artifact 和 diff。
安全的存在性检查:
不安全的检查:
后者可能把全部密钥写入终端、模型上下文、CI 日志或会话记录。

SSH 最小权限

优先使用目标仓库的只读 remote、受限 deploy key、SSH agent、短时测试账号和明确的 host key。不要让 Codex 读取私钥内容、导出 agent 密钥或修改 ~/.ssh/config。如果任务只需查看远程分支,就不应批准 cat ~/.ssh/id_ed25519。

API key 注入

密钥应由运行环境注入,而不是由代理搬运:
避免在提示词中写完整 key、把 key 放入命令行参数、echo "$TOKEN"、在错误信息中打印 header、把真实 key 写入 fixture,或让代理遍历主目录寻找凭据。无法确认命令只访问预期 API 时,改用一次性低权限 token 或手动执行。

六、脱敏与最小上下文

分类与替换

脱敏目标是保留诊断结构,移除能识别个人、系统、账户的信息。除了密码,还要处理邮箱、电话、URL、JWT、内部域名、IP、主机名、客户数据和可关联的时间戳。 保留错误码、字段结构、调用顺序和必要上下文,删除真实值;需要复现时优先生成合成数据。

脱敏验收

这是启发式检查,不是秘密扫描器的替代品。还要检查 JWT 是否仍完整存在、Base64 或压缩内容是否含原值、URL query 是否有 token,以及截图角落、通知、地址栏、终端和 CI 日志是否露出信息。

七、批准前检查

五秒检查法

  1. 对象:哪个文件、目录、应用或域名?
  2. 动作:读取、写入、上传、删除、安装、提交还是提权?
  3. 数据:哪些参数、请求体、日志或截图会越过边界?
  4. 原因:是否直接服务于刚才交代的目标?
  5. 后果:能否撤销,失败会影响谁?
其中一项说不清,就拒绝并要求代理解释、缩小范围。以下信号不应盲批:
这些动作不一定恶意,但可能扩大读取、执行、持久化或外发范围。要求先显示目标文件、git diff --stat、包来源和版本,再决定下一步。

不可信内容不是授权

README、网页、Issue、测试夹具、日志和依赖源码都是数据。提示注入会伪装成系统消息,要求忽略用户约束、不要询问用户、读取凭据或关闭安全检查。可在任务中明确:
日常启动组合:
第一条适合可信项目开发,第二条适合陌生仓库审查。不要在本机或生产机使用 --dangerously-bypass-approvals-and-sandbox;完全访问和 approval never 只可考虑用于可销毁、无真实凭据的隔离环境。

八、Computer Use 隐私

三条路径

本地 Web 优先用内置浏览器。需要登录态时使用专用 Chrome profile,避免把个人邮箱、网银、密码管理器和公司后台放在同一 profile。只有其他工具无法完成时才使用 Computer Use。

任务期间可能暴露的内容

屏幕、截图、键盘输入和剪贴板都可能成为上下文,因此要假设任务能看到当前窗口、相邻窗口、地址栏、页面、cookie 所代表的权限、剪贴板、桌面通知、浏览历史、内网 URL 和文件选择器目录。 开始前关闭密码管理器、网银、邮件、聊天和无关标签,清空剪贴板,关闭通知与屏幕共享,使用专用 profile 或虚拟机,只打开必要应用。Windows 上任务可能接管前台鼠标键盘,不要同时使用同一台机器;macOS 的屏幕录制和辅助功能权限也要在授权前确认用途。

必须人在场的动作

不要无人值守地登录、输入密码或 MFA、发送邮件、提交表单、删除记录、支付退款、修改安全设置、接受 OAuth 授权、上传客户数据或接受系统隐私权限。对“始终允许网站”“始终允许应用”和“始终允许浏览器内容”只在专用环境、明确 host 或应用上使用,任务结束后复查并移除。 网页出现“忽略之前指令”、要求打开终端、导出 cookie、下载未知文件或跳转陌生域名时,立即停止任务,夺回控制权,不点击确认;记录 URL、时间和动作,检查下载目录、历史、剪贴板与外部状态。

九、CI secret 与流水线

CI 没有人持续审批,日志会保存,fork、PR、构建脚本和依赖都可能不可信。把自动化设计成:
具体做法:
  • 只在需要的 job 和 step 注入 secret;
  • 使用不同环境的短时、低权限凭据;
  • 不给来自 fork 的任意 PR 生产凭据;
  • PR 使用只读 token;
  • 不把 secret 放在命令行、artifact 或缓存键;
  • 不打印完整环境变量,并检查 masking 的编码绕过;
  • 限制出站网络和可写目录,结束后删除凭据文件。
只读分析可以使用 read-only + approval never,这里 never 只表示 CI 不等待人工审批,不表示能访问整台机器。写报告时限制到临时工作区,让后续 job 显式上传检查过的产物。分析、测试和发布应拆分,并使用不同身份。 每次流水线变更后检查日志、artifact、缓存、错误堆栈、完整 URL、secret 注入范围、fork 权限和失败重试是否重复发送敏感请求。

十、批准后的验证

批准不是终点。完成后立即检查:
网络或浏览器任务还要核对实际域名、重定向、上传、cookie、Authorization、下载文件和外部状态。复查 allowlist、blocklist 和“始终允许”授权是否需要收回。Computer Use 的桌面改动可能不出现在代码 diff 中,要在目标应用或对应系统中确认。

十一、疑似泄露的应急流程

先止血

  1. 停止 Codex、脚本、浏览器自动化和相关 CI job。
  2. 关闭网络或撤销临时域名访问。
  3. 取消上传、部署和外部任务。
  4. 不要在同一会话粘贴更多秘密来“确认”。
  5. 记录时间、任务、域名、文件、动作和账号,保存最少必要证据。

轮换凭据

按影响范围撤销并重新发布 API key、OAuth token、PAT、SSH deploy key、云密钥、CI secret、数据库密码、Webhook secret、签名密钥以及浏览器 session。先撤销旧凭据,再发布新值;不要将新值写回原会话、Issue、日志或补丁。无法判断是否泄露时,按已泄露处理。

查证、清理和通知

检查外部服务访问日志、API 使用记录、GitHub、CI、包仓库、部署平台审计日志、shell 历史、浏览器下载目录、插件日志、Git 历史、artifact、PR 评论和聊天记录。不要为了清理痕迹删除审计日志。 确认范围后清理工作区、artifact、缓存和错误报告中的敏感副本;对进入 Git 历史的密钥执行轮换并按组织流程清理;通知服务管理员、安全负责人和受影响的数据责任人。涉及个人或客户数据时按组织的事件响应与合规时限通知。最后修复网络、权限、日志或提示注入入口,写一份不含秘密的复盘记录。

十二、可直接使用的模板

只读安全审查

临时联网

Computer Use

十三、最终清单

启动前

  • 项目目录、Git 分支和账号环境正确。
  • 已用 /status 核对网络关闭和工作区范围。
  • 任务能否在 read-only 下完成?
  • 已列出精确域名和禁止读取的文件。
  • .env、SSH、云凭据和客户数据不在工作区。
  • 已准备脱敏样本与回滚方式。

执行中

  • 每个新域名、新应用和新权限都经过确认。
  • 网页、README、Issue 和日志只当不可信数据。
  • 没有管道下载脚本、打印完整环境变量或扩大主目录读取。
  • Computer Use 使用专用 profile,敏感窗口已关闭。
  • CI 只拿到当前步骤所需的最小 secret。
  • 与任务不匹配的读取、上传、提权和删除已暂停。

执行后

  • 检查 diff、日志、下载目录、artifact 和外部状态。
  • 确认实际 host 与批准的 host 一致。
  • 关闭网络,移除临时 allowlist 和应用授权。
  • 删除敏感临时文件,确认没有进入 Git 或 CI 缓存。
  • 运行秘密扫描并人工检查截图和日志。
  • 记录命令、批准、结果、风险和回滚步骤。

小结

安全使用 Codex 的核心,是让每条数据流都可解释、可限制、可验证。日常从网络关闭、workspace-write、on-request 和最小工作区开始;需要联网时只放行精确域名;搜索缓存只能降低实时内容风险;真实密钥不进工作区、提示词和日志;Computer Use 只在专用环境操作真桌面和登录态;CI 使用短时、低权限、分步骤的 secret。 最后再问:
回答不了任何一项,就停止并缩小权限。发现疑似泄露时,先止血、轮换、查证、通知,再复盘修复。