学习精选 · AI 工具
Codex

Codex 把自己的安全文档当命令执行了:一次会话审计如何删掉了 HOME 下的符号链接

DEV Community2026-11-10约 4 分钟读完AI 整理查看原文

一位 Codex CLI 用户让 agent 审计自己的历史会话,本该只读的任务却出了破坏性事故:旧会话的 JSONL 日志被当作程序传给 Bash 登录 shell,日志里记录的'禁止执行的命令示例'被反引号触发为命令替换并真实执行。事故删掉了 HOME 下的 .codex 和 .claude 符号链接,GitHub issue 挂了三个多月仍未修复。

今天就能做

  • 检查自己的工作流里有没有把日志或数据文件路径直接传给 Bash 程序位置的写法,立即改掉
  • 开启系统级审计(Sysmon 或 process auditing),AI agent 出事故时才有证据可查
  • 用 danger-full-access 模式跑只读任务前,先确认 approval 策略没有同时设为 never

事故是怎么发生的

  • 用户环境:Codex CLI 0.146.0、Windows 10、Git Bash、danger-full-access 模式、approval policy 设为 never
  • 审计步骤把旧会话的 rollout JSONL 文件路径传进了 Bash 登录 shell 的程序位置,Git Bash 把文件内容当 shell 输入读取
  • 日志中保存的安全指令文本里有一行反引号引用的递归删除命令——本是模型'必须拒绝执行'的示例——被解释为命令替换并执行
  • 命令的退出状态被忽略、stderr 被丢弃,整个会话没有任何迹象表明出了问题

实际损失与取证局限

  • 可确认的损失是 HOME 下的 .codex 和 .claude 两个符号链接条目被删除
  • 真实数据存放在另一块盘上,删除操作没有跟随符号链接,所以内容幸存
  • 取证过程受限:process auditing 和 Sysmon 都没开,完整 trace 没有留存
  • 报告者没有做破坏性复现,只提出了非破坏性的合成测试方案,机制尚无维护者确认

这不是孤例,修复也没合并

  • issue 列出了五个更早的相关报告(#27131、#33624、#32684、#33557、#18509),说明这是一类反复出现的失败模式
  • issue 挂了三个多月,维护者只做了自动打标签,没有实质回应
  • 9 月 18 日有非维护者提出修复方案:阻止会话文件路径被当作程序运行或喂给 shell 的 -c/-lc,至今未合并

为什么这个案例值得记住

  • 危险不来自用户输入,而是把历史会话日志——包括模型自带的'禁止命令'清单——当成程序喂给了 shell
  • 本该记录'拒绝执行什么'的文档本身成了 payload
  • 严重度评为 4/中等:影响范围一人、可恢复性高(真实数据幸存)、但确实发生了
  • 底层 issue 的标题比实际取证记录更耸动,评估应基于已验证的事实

给普通用户的启示

  • 不要把会话日志、JSONL 等数据文件路径传给 shell 的程序位置或 -c 参数
  • 开启 process auditing 或 Sysmon 之类的审计工具,出事后才有 trace 可查
  • danger-full-access + approval never 的组合意味着出错时没有任何拦截,日常任务慎用
  • 关注 #36937 的修复进展,合并前避免让 Codex 审计自己的历史会话

原文:Codex executed its own safety text, deleted HOME symlinks

来源:DEV Community · 2026-11-10

查看原文

本文由 AI 阅读原文后整理,未经人工逐字核对,内容以原文为准。

登录后可以点赞、查看和发表评论