← 返回所有文章
發佈於 · 作者 Renaud Deraison

每次逃脫四萬美元

10 月 6 日在 Pwn2Own Ireland,Ikotas Labs 只用一個引數注入漏洞就把 OpenAI Codex 帶出了它的沙箱,贏得 40,000 美元。程式碼代理如今已是 Pwn2Own 的常設類別:5 月在柏林,Codex 三度失守,另有三支隊伍對 Claude Code 發動了漏洞利用。規則說明了怎樣才算獲勝:代理在沙箱開啟的情況下打開參賽者的儲存庫、網頁或檔案,而程式碼在沙箱之外執行。在 Bromure Agentic Coding 裡,代理沙箱之外仍然是一台 Linux VM,裡面只有替身金鑰,它的出口、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,由贊助商決定漏洞利用必須取得哪些「敏感資訊」,評審在乾淨的測試機上 驗證。在開發者的筆電上,沒有人需要挑選旗標。代理沙箱之外就是你的使用者帳號, 而你的帳號裡有:

  • ~/.ssh/id_ed25519,以及 known_hosts 裡的每一台主機
  • ~/.aws/credentials、~/.config/gcloud、~/.kube/config
  • 一個具 push 權限的 gh token,以及每個 checkout 裡的 .env 檔案
  • 代理自己的 OAuth token 與工作階段歷史
  • 磁碟上的其他所有儲存庫,以及旁邊的瀏覽器設定檔

競賽也排除了真實攻擊者每天在用的途徑。說服代理執行指令的提示注入不算數。為了 擺脫詢問而用 --yolo 模式工作的開發者也不算。在真實世界裡,這些途徑全都通往 和沙箱逃脫相同的地方:一個以你的身分執行的程序。

筆電上:只有一道邊界,而且屬於代理入侵途徑攻擊者的儲存庫、網頁或檔案+一個沙箱漏洞(Pwn2Own)提示注入競賽不計入不安全模式或 yolo 模式競賽不計入代理自己的沙箱筆電上你的帳號~/.ssh/id_ed25519~/.aws/credentials ~/.kube/config具 push 權限的 gh token每個 checkout 的 .env代理 OAuth token、歷史其他儲存庫、瀏覽器設定檔網路:任何主機、任何連接埠、無紀錄漏洞利用需要的一切都已在此,出路也是。
在筆電上,代理的沙箱是唯一的防線。Pwn2Own 式的逃脫、提示注入或不安全模式,最後都落在同一個地方:一個擁有開發者帳號、金鑰和網路的程序。

同樣的逃脫,發生在 Bromure 機器裡

在 Bromure Agentic Coding 中,Codex 和 Claude Code 在你 Mac 上的 Linux VM 裡執行, 每台機器一個 VM。代理自己的沙箱仍在,也仍然盡它的職責。在它底下還有第二道邊界, 不是代理廠商寫的,儲存庫也無法設定:Apple 的 Virtualization.framework,另一側是 主機。

在一台機器裡重演 Ikotas Labs 的漏洞利用。代理打開參賽者的儲存庫,引數抵達一個 不該接受它的指令,程式碼在 Codex 的沙箱之外執行。它以 VM 使用者的身分執行。從那 裡,它逐一搜尋筆電清單上的每一項,找到的都是 VM 的版本。

檔案是這台機器的檔案

VM 有自己的系統磁碟,是一份已簽署 Ubuntu 映像的寫入時複製(copy-on-write) 複本,也有自己的家目錄。你 Mac 的家目錄、鑰匙圈、瀏覽器設定檔和其他專案都不在 裡面。它唯一看得到的 Mac 資料夾,是你在該機器的 Folders 面板中分享給它的 那些,而用來跑不受信任程式碼的機器一個都不需要:把儲存庫複製到 VM 的家目錄即可。

金鑰是替身

VM 裡沒有任何檔案、環境變數或程序含有真正的 API 金鑰、OAuth token、AWS 密鑰或 SSH 私鑰。VM 持有的是格式正確的假貨,例如 ANTHROPIC_API_KEY=sk-ant-api03-brm-… 或一個 GitHub 會拒絕的 ghp_ token。請求離開 VM 之後,Mac 上的代理伺服器才換上 真值,而且只針對該憑證所屬的主機。

~/.ssh 裡沒有私鑰可以複製。SSH_AUTH_SOCK 是一座經由 vsock 通往 Mac 上 ssh-agent 的橋,它依要求簽章,從不交出金鑰。為某把金鑰開啟 Ask before use, 每次簽章都會在 Mac 上跳出對話框。

替身也是絆線。當漏洞利用把找到的東西打包送回家時,代理伺服器會看到一個假 token 正前往一個並非為它簽發的主機。它回應 HTTP 451、什麼都不轉送、暫停 VM,並在 Mac 上 開啟 This environment may have been compromised,列出該 token、它所屬的主機, 以及它被送往的主機。

出路經過 Mac

VM 開啟的每一條連線,不論連接埠或協定,都會經過主機上的虛擬交換器和代理伺服器。 機器的 Guardrails 面板有一道出站防火牆:依主機、IP 範圍、協定和連接埠設定規則, 以及一個可設為 Allow 或 Deny 的 Unmatched traffic 選項。用來跑陌生人 程式碼的機器,可以允許它的模型供應商、套件登錄庫和 GitHub,拒絕其餘一切。漏洞 利用往外的連線就永遠連不上。

Security Timeline 會記錄防火牆的判定,不論你有沒有設定規則。它永遠開啟、適用 每一台機器,而連往專案從未需要過的主機的連線,會出現在建立它的工作階段旁邊。

push 與寫入要等一次點擊

筆電清單上最糟的戰利品是 gh token,因為 push 權限會把一台被入侵的機器變成一個 被入侵的套件。在新機器上,每個受保護的服務都使用 Prompt before write。透過 HTTPS 的 git push 屬於寫入,因此代理伺服器會攔住它,macOS 則顯示 Allow write on "github.com" from workspace "…"?,附上線路上實際出現的操作。 同樣的政策也涵蓋雲端 API、Kubernetes、登錄庫和資料庫。對話框是在 Mac 上依代理 伺服器讀到的內容繪製的,所以 VM 裡的程式碼既無法回答它,也無法改動它的文字。

追蹤記錄留下來龍去脈

引數注入始於一個看似例行的工具呼叫。在預設的追蹤等級 AI request details 下, 代理伺服器會保存與模型供應商的每一次往來,在 Mac 上加密,而 Trace Inspector 會把 每一次解析成工具呼叫、shell 指令和檔案讀取。等 ZDI 在 1 月公開漏洞,你就可以在 追蹤記錄中搜尋觸發它的指令與引數,而你搜尋的紀錄是在 Mac 上寫下的,VM 裡執行過的 任何東西都碰不到。

清理只涉及一台機器

如果漏洞利用在家目錄寫了東西,Rewind home… 會把它還原到先前某次開機時建立的 檢查點。被入侵偵測器標記的機器會拒絕啟動,直到你選擇 Wipe and Launch,它會 重建磁碟與家目錄,並保留你的設定和 Mac 上的真實憑證。對於只想看一次的程式碼, bromure-cli vm run --rm 會啟動一台停止時連同磁碟一起刪除的機器。

在 Bromure 中:逃脫落進 VM,出口在 Mac 上機器 VM(Ubuntu)Codex 沙箱:被一個引數突破程式碼以 VM 使用者身分執行它找到的東西ANTHROPIC_API_KEY=sk-ant-api03-brm-…GH_TOKEN=ghp_… (替身)~/.ssh:沒有私鑰只有這台機器的家目錄沒有 Mac 家目錄、沒有其他專案交換器 + 代理伺服器,在 Mac 上防火牆:未知主機 → 拒絕判定記入 Security Timeline替身送往範圍外 → 451,暫停 VM追蹤:每個工具呼叫與指令,在 Mac 上加密macOS 對話框:Allow write on …?POST /acme/app.git/git-receive-pack網際網路模型供應商套件登錄庫github.com攻擊者的主機:從未連上留在 Mac 上,在 VM 之外API 金鑰與 OAuth token · git 與雲端憑證 · SSH 私鑰 · 你的家目錄 · 其他專案 · 追蹤記錄
同樣的逃脫發生在 Bromure 機器裡。代理的沙箱照樣被突破,但程式碼落進一台擁有自己家目錄、替身憑證、沒有任何私鑰的 VM。它的出口、寫入對話框和追蹤記錄都在 Mac 上。

不論開的是哪一扇門

Pwn2Own 的規則排除提示注入、不安全模式和已儲存的憑證,是為了讓勝利只衡量一件事: 代理自己的邊界。對競賽來說,這是正確的測試。但在你的筆電上,攻擊者三條被排除的 途徑都會用。

VM 邊界不取決於程式碼是怎麼離開代理的。一個引數注入漏洞、一份說服模型執行指令的 有毒 README、一個下載植入程式的測試檔、一個凌晨 2 點關掉詢問的開發者:每一種最後 都是以 VM 使用者身分執行的程式碼,面對同樣的替身、同樣的防火牆和 Mac 上同樣的 對話框。OpenAI 會依自己的時程推出 Ireland 漏洞的修補,在那之前,這個漏洞和其他 漏洞一樣,會撞上 VM 邊界。

逃脫落進 VM

逃出代理沙箱的程式碼以 VM 使用者身分執行,只有該機器的家目錄和你分享給它的 資料夾。你 Mac 的家目錄、鑰匙圈和其他專案都不在裡面。

金鑰是替身

真正的 API 金鑰、git token 和雲端密鑰都在 Mac 上加密保存,SSH 金鑰透過一座橋 簽章。送往範圍外的替身會得到 451,並使機器暫停。

push 需要在 Mac 上點擊

在新機器預設的 Prompt before write 下,git push 或具破壞性的雲端呼叫會等待一個 VM 無法回答的 macOS 對話框。

紀錄留在主機上

出站防火牆、Security Timeline 和追蹤記錄全都在 Mac 上執行。漏洞公開時,每個 工作階段的歷史都在那裡等你搜尋。

下一個一定會來

Pwn2Own 春天會再舉辦,程式碼代理也會再次列入目標,因為程式碼代理在開發者的機器上 執行指令,擁有和開發者一樣的觸及範圍。總會有隊伍帶來一個沒人見過的漏洞。廠商會 在 90 天內修補,下一場競賽又從零開始計算。

持續更新你的代理,並在這樣的機器裡執行它們:代理沙箱後面的戰利品,只是一台裝著 替身金鑰的 VM。想進一步了解為什麼這道邊界位於主機上,請閱讀 守衛與 shell 各說各話 和 十一項測試通過。