← 返回所有文章
发布于 · 作者 Renaud Deraison

每次逃逸四万美元

10 月 6 日在 Pwn2Own Ireland,Ikotas Labs 只用一个参数注入漏洞就把 OpenAI Codex 带出了它的沙箱,赢得 40,000 美元。编程代理如今已是 Pwn2Own 的常设类别:5 月在柏林,Codex 三次失守,另有三支队伍对 Claude Code 发起了漏洞利用。规则写明了怎样才算获胜:代理在沙箱开启的情况下打开参赛者的仓库、网页或文件,而代码在沙箱之外运行。在 Bromure Agentic Coding 中,代理沙箱之外仍然是一台 Linux 虚拟机,里面只有替身密钥,它的出口、push 对话框和追踪记录都在 Mac 上。

Pwn2Own 为在编程代理沙箱之外运行的代码支付 40,000 美元。在笔记本上,沙箱之外 就是你的账户、你的密钥和你的仓库。

10 月 6 日星期二晚上 6 点,Ikotas Labs 在科克登上 Pwn2Own Ireland 2026 的舞台,目标是 OpenAI Codex。Zero Day Initiative 的结果条目只有一行:Ikotas “used a single argument injection bug to exploit OpenAI Codex. They win $40,000 and 4 more Master of Pwn points.” BleepingComputer 和 Infosecurity Magazine 第二天早上报道了此事,列在第一天的 32 个零日漏洞之中。

ZDI 要 90 天后才会公开这个漏洞,这是 Pwn2Own 给厂商发布修复的期限。漏洞利用必须 做到什么,比赛规则写得很清楚。

怎样才算获胜

编程代理在 Pwn2Own 有自己的类别。 Ireland 2026 规则 列出两个目标:Anthropic Claude Code 和 OpenAI Codex,各 40,000 美元,都运行在 Windows 11 上。条件很严格:

  • 沙箱和隔离功能以默认配置启用,且不启用任何不安全的执行模式(例如 --dangerously-skip-permissions 或同等选项)。
  • 参赛作品“必须与参赛者控制的资源交互(例如网页、仓库、媒体文件)”,而攻击 “必须是编程代理的常见使用场景”。
  • 它必须在代理“预期的沙箱和权限边界”之外实现任意代码执行,或者获取“通常无法 从应用沙箱访问”的敏感信息。

规则列出了三种起点。代理已经在受信任的文件夹中运行,攻击发生在单个会话内。或者 代理在参赛者的仓库中启动,此时还没有人信任它。或者桌面应用打开参赛者的项目。 这正是开发者整天在做的三件事:工作、克隆新东西、打开新东西。

规则还排除了一串不算数的手法:说服模型去做、环境中配置的凭据、不安全的模式、 第三方 MCP 服务器。奖金只为一件事买单:突破代理自己的边界。

五个月,两场比赛

Ireland 是第二场把编程代理列为目标的 Pwn2Own。 5 月在柏林, Compass Security 在第一天用“a single CWE-150 bug”攻破 Codex,拿下 40,000 美元。 Doyensec 同一天用一个厂商已知的漏洞攻破了它,第三天 Ikotas Labs 的 Satoki Tsuji 又通过一个外部控制漏洞再次攻破,在目标上弹出了计算器。 Security Affairs 这样总结对 Codex 的三次胜利:“Each exploit used a different technique, meaning the attack surface is not a single narrow flaw but something broader.”

Claude Code 在柏林遭遇三次漏洞利用,分别来自 Viettel Cyber Security、Compass Security 和 Out of Bounds。三次都是撞洞:漏洞在台上成功了,但 Anthropic 早已知晓。 撞洞的奖金更少,因为研究人员不是第一个发现的,但漏洞利用仍然在比赛安装的版本上 运行成功了。

然后是五个月后的 Ireland,Codex 又因为一个漏洞失守。

ZDI 还没有描述 Ireland 的漏洞,但参数注入在编程代理中是一个熟悉的类别。代理的 权限层按名称批准命令:git、rg、find 是只读的,不经询问就运行。攻击者通过 仓库中的文件名、分支名或配置值提供参数,于是“只读”工具拿到了一个会执行程序的 选项。Git 的 --upload-pack、ripgrep 的 --pre 和 find 的 -exec 都接受一个 命令。7 月,Pillar Security 报告称 Codex 的安全命令列表 仅凭名称就信任 git show, 而它实际发出的调用并不是只读的。

这些漏洞利用每一个都击败了位于代理内部的检查,由代理厂商编写、随代理更新发布。 厂商逐个修复,比赛就找到下一个,因为解析 shell 命令的权限层是个很大的目标,而 40,000 美元的奖金让优秀的队伍一直在找。

在笔记本上,逃逸能拿到什么

在 Pwn2Own,由赞助商决定漏洞利用必须获取哪些“敏感信息”,评委在干净的测试机上 验证。在开发者的笔记本上,没人需要挑选 flag。代理沙箱之外就是你的用户账户,而你 的账户里有:

  • ~/.ssh/id_ed25519,以及 known_hosts 中的每一台主机
  • ~/.aws/credentials、~/.config/gcloud、~/.kube/config
  • 一个具有 push 权限的 gh 令牌,以及每个 checkout 中的 .env 文件
  • 代理自己的 OAuth 令牌和会话历史
  • 磁盘上的其他所有仓库,以及旁边的浏览器配置文件

比赛还排除了真实攻击者每天都在用的途径。说服代理运行命令的提示注入不算数。为了 摆脱询问而用 --yolo 模式工作的开发者也不算。在现实中,这些途径全都通往和沙箱 逃逸相同的地方:一个以你的身份运行的进程。

笔记本上:只有一道边界,而且属于代理入侵途径攻击者的仓库、网页或文件+一个沙箱漏洞(Pwn2Own)提示注入比赛不计入不安全模式或 yolo 模式比赛不计入代理自己的沙箱笔记本上你的账户~/.ssh/id_ed25519~/.aws/credentials ~/.kube/config有 push 权限的 gh 令牌每个 checkout 的 .env代理 OAuth 令牌、历史其他仓库、浏览器配置文件网络:任意主机、任意端口、无记录漏洞利用需要的一切都已在这里,出路也是。
在笔记本上,代理的沙箱是唯一的防线。Pwn2Own 式的逃逸、提示注入或不安全模式,最终都落在同一个地方:一个拥有开发者账户、密钥和网络的进程。

同样的逃逸,发生在 Bromure 机器里

在 Bromure Agentic Coding 中,Codex 和 Claude Code 在你 Mac 上的 Linux 虚拟机里 运行,每台机器一个虚拟机。代理自己的沙箱仍在,也仍然尽它的职责。在它下面还有第二 道边界,不是代理厂商写的,仓库也无法配置:Apple 的 Virtualization.framework,另一 侧是宿主机。

在一台机器里重演 Ikotas Labs 的漏洞利用。代理打开参赛者的仓库,参数到达一个不该 接受它的命令,代码在 Codex 的沙箱之外运行。它以虚拟机用户的身份运行。从那里,它 逐一搜寻笔记本清单上的每一项,找到的都是虚拟机的版本。

文件是这台机器的文件

虚拟机有自己的系统盘,是一份已签名 Ubuntu 镜像的写时复制(copy-on-write)克隆, 也有自己的主目录。你 Mac 的主目录、钥匙串、浏览器配置文件和其他项目都不在里面。 它唯一能看到的 Mac 文件夹,是你在该机器的 Folders 面板中共享给它的那些,而 用来运行不可信代码的机器一个都不需要:把仓库克隆到虚拟机的主目录即可。

密钥是替身

虚拟机里没有任何文件、环境变量或进程包含真正的 API 密钥、OAuth 令牌、AWS 密钥或 SSH 私钥。虚拟机持有的是格式正确的伪造品,例如 ANTHROPIC_API_KEY=sk-ant-api03-brm-… 或一个 GitHub 会拒绝的 ghp_ 令牌。请求 离开虚拟机之后,Mac 上的代理服务器才换上真实值,而且只针对该凭据所属的主机。

~/.ssh 里没有可复制的私钥。SSH_AUTH_SOCK 是一座经由 vsock 通往 Mac 上 ssh-agent 的桥,它按请求签名,从不交出密钥。为某把密钥开启 Ask before use, 每次签名都会在 Mac 上弹出对话框。

替身也是绊线。当漏洞利用把找到的东西打包发回去时,代理服务器会看到一个伪造令牌 正发往一个并非为它签发的主机。它返回 HTTP 451、什么都不转发、暂停虚拟机,并在 Mac 上打开 This environment may have been compromised,列出该令牌、它所属的主机, 以及它被发往的主机。

出路经过 Mac

虚拟机打开的每一条连接,无论端口或协议,都会经过宿主机上的虚拟交换机和代理服务器。 机器的 Guardrails 面板有一道出站防火墙:按主机、IP 范围、协议和端口设置规则, 以及一个可设为 Allow 或 Deny 的 Unmatched traffic 选项。用来运行陌生人 代码的机器,可以允许它的模型提供商、软件包仓库和 GitHub,拒绝其余一切。漏洞利用 往外的连接就永远连不上。

Security Timeline 会记录防火墙的判定,无论你是否设置了规则。它始终开启、适用于 每一台机器,而连往项目从未需要过的主机的连接,会出现在发起它的会话旁边。

push 和写入要等一次点击

笔记本清单上最糟的战利品是 gh 令牌,因为 push 权限会把一台被入侵的机器变成一个 被入侵的软件包。在新机器上,每个受保护的服务都使用 Prompt before write。通过 HTTPS 的 git push 属于写入,因此代理服务器会拦住它,macOS 则显示 Allow write on "github.com" from workspace "…"?,附上线路上实际出现的操作。 同样的策略也覆盖云 API、Kubernetes、镜像仓库和数据库。对话框是在 Mac 上根据代理 服务器读到的内容绘制的,所以虚拟机里的代码既无法回答它,也无法改动它的文字。

追踪记录留下来龙去脉

参数注入始于一次看似例行的工具调用。在默认的追踪级别 AI request details 下, 代理服务器会保存与模型提供商的每一次往来,在 Mac 上加密,而 Trace Inspector 会把 每一次解析为工具调用、shell 命令和文件读取。等 ZDI 在 1 月公开漏洞,你就可以在 追踪记录中搜索触发它的命令和参数,而你搜索的记录是在 Mac 上写下的,虚拟机里运行过 的任何东西都碰不到。

清理只涉及一台机器

如果漏洞利用在主目录里写了东西,Rewind home… 会把它恢复到之前某次启动时创建的 检查点。被入侵检测器标记的机器会拒绝启动,直到你选择 Wipe and Launch,它会重建 磁盘和主目录,并保留你的设置以及 Mac 上的真实凭据。对于只想看一次的代码, bromure-cli vm run --rm 会启动一台停止时连同磁盘一起删除的机器。

在 Bromure 中:逃逸落进虚拟机,出口在 Mac 上机器虚拟机(Ubuntu)Codex 沙箱:被一个参数突破代码以虚拟机用户身份运行它找到的东西ANTHROPIC_API_KEY=sk-ant-api03-brm-…GH_TOKEN=ghp_… (替身)~/.ssh:没有私钥只有这台机器的主目录没有 Mac 主目录、没有其他项目交换机 + 代理服务器,在 Mac 上防火墙:未知主机 → 拒绝判定记入 Security Timeline替身发往范围外 → 451,暂停虚拟机追踪:每次工具调用和命令,在 Mac 上加密macOS 对话框:Allow write on …?POST /acme/app.git/git-receive-pack互联网模型提供商软件包仓库github.com攻击者的主机:从未连上留在 Mac 上,在虚拟机之外API 密钥和 OAuth 令牌 · git 和云凭据 · SSH 私钥 · 你的主目录 · 其他项目 · 追踪记录
同样的逃逸发生在 Bromure 机器里。代理的沙箱照样被突破,但代码落进一台拥有自己主目录、替身凭据、没有任何私钥的虚拟机。它的出口、写入对话框和追踪记录都在 Mac 上。

无论开的是哪一扇门

Pwn2Own 的规则排除提示注入、不安全模式和已存储的凭据,是为了让胜利只衡量一件事: 代理自己的边界。对比赛来说,这是正确的测试。但在你的笔记本上,攻击者三条被排除的 途径都会用。

虚拟机边界不取决于代码是怎样离开代理的。一个参数注入漏洞、一份说服模型运行命令的 有毒 README、一个下载植入程序的测试文件、一个凌晨 2 点关掉询问的开发者:每一种最终 都是以虚拟机用户身份运行的代码,面对同样的替身、同样的防火墙和 Mac 上同样的对话框。 OpenAI 会按自己的节奏发布 Ireland 漏洞的修复,在那之前,这个漏洞和其他漏洞一样, 会撞上虚拟机边界。

逃逸落进虚拟机

逃出代理沙箱的代码以虚拟机用户身份运行,只有该机器的主目录和你共享给它的 文件夹。你 Mac 的主目录、钥匙串和其他项目都不在里面。

密钥是替身

真正的 API 密钥、git 令牌和云密钥都在 Mac 上加密保存,SSH 密钥通过一座桥签名。 发往范围外的替身会收到 451,并使机器暂停。

push 需要在 Mac 上点击

在新机器默认的 Prompt before write 下,git push 或破坏性的云调用会等待一个虚拟机 无法回答的 macOS 对话框。

记录留在宿主机上

出站防火墙、Security Timeline 和追踪记录全都在 Mac 上运行。漏洞公开时,每个 会话的历史都在那里供你搜索。

下一个一定会来

Pwn2Own 春天会再次举办,编程代理也会再次列入目标,因为编程代理在开发者的机器上 运行命令,拥有和开发者一样的触及范围。总会有队伍带来一个没人见过的漏洞。厂商会在 90 天内修复,下一场比赛又从零开始计数。

持续更新你的代理,并在这样的机器里运行它们:代理沙箱后面的战利品,只是一台装着 替身密钥的虚拟机。想进一步了解为什么这道边界位于宿主机上,请阅读 守卫与 shell 各说各话 和 十一项测试通过。