AREX Feed Article
研究人员披露 Codex 沙箱逃逸 Heapjack 与 Overpatch:可在宿主机执行命令,OpenAI 8 天内修复
Accomplish AI 研究员 Oren Yomtov 公开披露了两个从 OpenAI Codex 沙箱里逃出的漏洞,并命名为 Heapjack 与 Overpatch。据 ,其中更严重的 Heapjack 能在 Codex 最严格的只读(read-only)模式下逃出沙箱,在宿主机上执行未沙箱(unsandboxed)命令;另一个 Overpatch 让补丁工具把写权限从工作区放大到整块磁盘。两个漏洞都在 8 月 12 日报告给 OpenAI,并在 8 天内完成修复。
两个漏洞的技术拆解《Escaping the OpenAI Codex sandbox, twice》由 Yomtov 撰写,9 月 15 日发布在 上。
Heapjack:从只读模式拿到未沙箱的命令执行
Codex 以命令行工具和桌面应用两种形态提供,模型的动作被沙箱隔离,以免不可信代码碰到系统其余部分。按拆解的描述,Heapjack 的入口是 Codex Desktop 安装时写进全局配置 ~/.codex/config.toml 的一个 [mcp_servers.node_repl] 配置块:它默认启用,没有 opt-in(主动选择加入的步骤),也没有能关掉它的设置;由于它写在共享配置里,只用 codex CLI 的人也会继承同一个工具,且不会收到任何询问。
node_repl 是一个运行在沙箱外的原生 Rust 程序:能打开应用、连接 Unix 套接字、写配置文件。它通过 Codex 沙箱启动一个 Node 进程,所有 JavaScript 都在沙箱内运行;这一个 Node 进程里有两个 V8 vm context(隔离的 JavaScript 执行上下文):可信的那个跑 OpenAI 自己的代码并持有令牌,不可信的那个跑 agent(智能体)的代码。两者共享同一个 V8 isolate(隔离的 V8 实例)和同一块堆,令牌就是堆里的一个字符串。
Yomtov 在 X 的中写道,OpenAI 把有特权的可信 JS context 和不可信 context 放在同一个 Node.js 进程里运行,并假设 V8 的 VM context 能充当安全边界,「但他们忘了,这些 context 共享同一块内存堆」。
利用方式由此展开:不可信代码用 v8.getHeapSnapshot() 转储堆,逐个尝试 UUID(通用唯一识别码)形状的字符串。猜错了返回「not authorized」;令牌正确而参数错误时,返回的是真正的验证错误,这等于确认令牌有效。随后,不可信代码把伪造的 JSON 请求写进两个 context 共用的同一根管道(fd 1,即 stdout);沙箱外的父进程读到请求、校验令牌,然后照做。
概念验证调用系统 open 命令,由 launchd 在 Codex 进程树之外启动应用;同一个令牌还能连接任意 Unix 套接字(Docker 守护进程套接字是显眼的目标),并调用编辑全局配置文件的工具。所有动作都发生在只读模式(agent 本不该写入任何东西的地方),Codex 没有请求过任何批准。落到具体场景:在只读模式下打开别人的仓库、就代码提问,仓库作者就能在宿主机上执行未沙箱命令,没有提示,屏幕上也没有任何显示。
Overpatch:一条指向 /tmp 的补丁,把写权限扩到整块磁盘
第二个漏洞在开源的 Codex CLI 里。工作区写入(workspace-write)模式下,agent 只能往工作区里写,指向 $HOME 的 shell 命令会被拒绝;研究者让 Codex 自己的补丁工具 apply_patch 绕开了这个限制。
关键在于权限的推导方式。apply_patch 会给补丁中点名的每个路径的父目录授予写权限,点名 /tmp,得到的写权限就是 /,也就是磁盘根目录。落地的补丁有两条改动:一条经工作区内的符号链接,往 $HOME/.zshrc 追加一行;另一条点名 /tmp、什么也不写,它本身会失败(不能拿文件覆盖一个目录),作用只是撑大授权范围。抽掉这一条,写入会被拒绝。
写进 .zshrc 的那一行,会在开发者下一次打开终端时以未沙箱方式执行。
同一处结构问题:约束机制位于被约束的对象内部
两个漏洞拆开来看,形状一样:apply_patch 从攻击者提供的输入里推导自己的权限;node_repl 把区分可信与不可信代码的密钥,放在不可信代码能读到的同一块内存里。BleepingComputer 的概括是:两起案例里,放行指令都来自沙箱内部。
在 Yomtov 的帖文下,有评论者写道,V8 的 context 隔离的是全局对象、不是内存,所以沙箱其实是「一个堆从未同意过的承诺」;另有人把这道信任边界形容为「房间隔断」。
同类问题并不新鲜。据 BleepingComputer 报道,2026 年 7 月,Pillar Security 研究人员在 Cursor、Codex、Gemini CLI 和 Google 的 Antigravity 上演示过同一思路:留在沙箱内的 agent 写下一个文件,沙箱外的可信工具稍后执行它。
受影响版本与修复版本
拆解中的对比表给出受影响范围:Overpatch 影响 codex-cli 0.148.0 及更早版本,修复于 Codex CLI 0.149.0;Heapjack 影响 Codex Desktop 26.623.141536 及更早版本,修复于 Codex Desktop 26.818.21641。BleepingComputer 给出的建议是升级到这两个修复版本或更新版本。
开源仓库能看到修复补丁,闭源桌面端只能核对版本号
在开源的 openai/codex 仓库里,Overpatch 的修复以 的形式在 8 月 20 日合并:在从补丁目标推导父目录权限之前,先跳过已被当前文件系统沙箱策略覆盖的目标;回归测试覆盖了工作区目录、已可写父目录,以及指向工作区外的符号链接。该改动包含在同一天发布的 里。
与 node_repl 令牌处理相关的另一项公开改动,是 8 月 18 日合并的 :把 NODE_REPL_AUTH_TOKEN 列入模型可触达子进程不可继承的环境变量,并在 shell 环境策略覆盖之后及显式配置的子进程环境里,再次按大小写不敏感地移除该变量。相比之下,Codex Desktop 是闭源组件,Heapjack 的最低修复版本号来自研究者的披露。
General Analysis 在 9 月 15 日的里写道:它没有复现这两个漏洞,也没有独立检查闭源桌面组件的完整修复;而且仅移除环境变量本身,并不能说明共享内存里的令牌读取问题是怎样被修复的。
BleepingComputer 表示在发稿前联系了 OpenAI 寻求置评,其报道中没有出现 OpenAI 的回应。