这页解决什么问题
Codex 能读取项目文件、运行命令、调用工具,也可能访问网页、浏览器和桌面应用。能力越多,数据越容易跨越原本的边界。要防的不是抽象的“AI 风险”,而是几条可复盘的数据路径:- 敏感内容被读取。
- 内容进入模型上下文、日志、缓存或截图。
- 内容被命令、插件、网页或外部服务带到另一条数据流。
- 你把异常动作误认为正常步骤并批准。
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 时,先限定任务,再临时启用网络。配置示意如下,实际节点以本地版本为准:- 记录为什么需要网络。
- 列出精确 host 和请求类型。
- 确认请求不会携带密钥、客户数据或 cookie。
- 只为这一次任务开网。
- 查看实际命令、重定向和响应。
- 结束后关闭网络并清理临时产物。
三、搜索缓存与实时搜索
缓存不等于可信
网页搜索默认可能使用预先索引的缓存结果。缓存减少了代理直接抓取任意实时页面的机会,但不等于离线,也不等于安全数据库。缓存结果仍可能含有:- 对模型说话的隐藏或显眼指令;
- 诱导下载、复制命令或泄露数据的文本;
- 过期、篡改或与当前页面不一致的信息;
- 指向新域名、登录页或上传接口的链接。
实时模式
按版本和启动方式,显式使用--search、把 web_search 设为 live,或启用某些完全访问模式,可能使搜索走实时内容:
搜索结果处理
看到以下文本时暂停:
四、域名白名单
精确放行
白名单把“可以联网”缩小为“可以访问哪些 host”。它不能证明站点可信,但能减少误连、外发和供应链入口。推荐顺序是:网络关闭,需要时只开精确域名,并继续逐次批准外发和破坏性请求。 某些版本的配置意图如下:* 接近放开一大片网络,不应成为日常默认。
规则边界
参考配置中deny 应压过 allow,越精确的规则越适合表达例外。但不要假设所有版本对通配符、子域名、重定向和 IP 解析的处理完全相同:
api.example.com不一定涵盖uploads.example.com;- 允许包源不代表允许安装脚本访问其他站点;
- HTTP 重定向可能到另一 host;
- 代理、DNS 和证书可能改变连接路径;
- 允许读接口不等于允许 POST、上传或删除。
五、API key、.env 与 SSH
凭据分类
.env 做法
- 提交只含变量名的
.env.example; - 将真实
.env加入.gitignore; - 不把真实值贴入对话,不复制到项目目录、
/tmp或构建产物; - 用最小环境变量子集启动命令;
- 诊断只输出是否存在,不输出完整环境;
- 结束后检查日志、报告、artifact 和 diff。
SSH 最小权限
优先使用目标仓库的只读 remote、受限 deploy key、SSH agent、短时测试账号和明确的 host key。不要让 Codex 读取私钥内容、导出 agent 密钥或修改~/.ssh/config。如果任务只需查看远程分支,就不应批准 cat ~/.ssh/id_ed25519。
API key 注入
密钥应由运行环境注入,而不是由代理搬运:echo "$TOKEN"、在错误信息中打印 header、把真实 key 写入 fixture,或让代理遍历主目录寻找凭据。无法确认命令只访问预期 API 时,改用一次性低权限 token 或手动执行。
六、脱敏与最小上下文
分类与替换
脱敏目标是保留诊断结构,移除能识别个人、系统、账户的信息。除了密码,还要处理邮箱、电话、URL、JWT、内部域名、IP、主机名、客户数据和可关联的时间戳。
保留错误码、字段结构、调用顺序和必要上下文,删除真实值;需要复现时优先生成合成数据。
脱敏验收
七、批准前检查
五秒检查法
- 对象:哪个文件、目录、应用或域名?
- 动作:读取、写入、上传、删除、安装、提交还是提权?
- 数据:哪些参数、请求体、日志或截图会越过边界?
- 原因:是否直接服务于刚才交代的目标?
- 后果:能否撤销,失败会影响谁?
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 权限和失败重试是否重复发送敏感请求。
十、批准后的验证
批准不是终点。完成后立即检查:十一、疑似泄露的应急流程
先止血
- 停止 Codex、脚本、浏览器自动化和相关 CI job。
- 关闭网络或撤销临时域名访问。
- 取消上传、部署和外部任务。
- 不要在同一会话粘贴更多秘密来“确认”。
- 记录时间、任务、域名、文件、动作和账号,保存最少必要证据。
轮换凭据
按影响范围撤销并重新发布 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。
最后再问: