錯誤報告執行了那道命令
由 Tenet Security 於 2026 年 6 月揭露的 agentjacking,既不需要惡意軟體,也不需要存取你的基礎設施。攻擊者用一把公開的唯寫金鑰在你的 Sentry 專案中登錄一則假錯誤,把指令藏在其中,然後等待。當你請你的程式設計代理修正這個問題時,它會把攻擊者的文字當成指引來讀,並用你的憑證去執行。Tenet 發現至少 2,388 個外露的專案,以及在 Claude Code、Cursor 與 Codex 上 85% 的成功率。Bromure Agentic Coding 把這整條先讀取再執行的路徑放進一台用完即棄的 Linux VM 裡跑,在代理行動前先評分擷取到的文字,只留給憑證竊賊一堆誘餌。
你請你的程式設計代理修正一個錯誤。它打開議題追蹤器,讀了最上面那一則結果,並照著上面所寫的做了。 問題在於,那則錯誤網路上任何人都能寫——而你的代理讀到的那一則,是為了被服從而寫的。沒有惡意軟體 落地。沒有伺服器被攻破。一則錯誤報告在你的機器上執行了一道命令。
2026 年 6 月 12 日,Tenet Security 的研究人員——Ron Bobrov、Barak Sternberg 與 Nevo Poran——透過 Cloud Security Alliance 的 AI Safety Initiative,公開了一種他們稱為 agentjacking 的攻擊。它不用釣魚郵件、不用被下毒的套件,也不用偷來的密碼。它用的是一則錯誤報告。更確切地說, 它利用的是這個事實:一個被要求「修正打開的 Sentry 議題」的程式設計代理,會讀一則錯誤報告,並把 它的內容當成指令。
這套佈局始於大多數 Web 應用程式刻意發放的東西。一個 Sentry DSN——網站用來把自己的當機回報給錯誤 追蹤平台 Sentry 的那把金鑰——是一種公開的唯寫憑證。它隨頁面的用戶端 JavaScript 一起送出,而 Sentry 的擷取端點在設計上就接受對它的未經驗證 POST 請求。這正是你的 瀏覽器分頁不必登入就能回報當機的方式。它也意味著,任何能讀到你頁面原始碼的人,都能把事件送到你的 Sentry 專案。Tenet 掃描尋找這些金鑰,並 在前一百萬個網站中找到 71 個可注入的 DSN,以及在整個網際網路上至少 2,388 個外露 DSN 的組織。
一則當機報告如何變成一道命令
攻擊者拿一個找到的 DSN,向它 POST 一則精心製作的錯誤事件。這則事件看起來像一次普通的當機,只是 訊息欄位與情境鍵是用 markdown 寫的——標題、程式碼區塊、一段讀起來像「解決方案」的段落——排版成 在視覺上與語法上都與 Sentry 自家的診斷範本無從分辨。它就躺在專案的議題清單裡,和任何其他未解決的 錯誤一樣。
然後攻擊者等你。當一位開發者請他的程式設計代理去調查未解決的 Sentry 議題時,代理便查詢 Sentry ——通常透過 Sentry 的 MCP 伺服器,也就是讓代理能從外部工具 拉取資料的那個標準連接器——並取回該事件。如 Tenet 所言,代理「收到回應並據以行動,就和開發者會做的 一模一樣」。這則回應不帶任何訊號,表明其內容是由攻擊者、而非應用程式自己的執行環境所寫。那段 「解決方案」說要執行一道命令。代理就用開發者自己的權限、在開發者自己的機器上,執行了它。
Tenet 回報在他們測試的各個代理上——Claude Code、Cursor 與 Codex, 也就是多數開發者會伸手去用的工具——都有 85% 的成功率。他們的概念驗證命令捲走了環境變數、 AWS 憑證、GitHub 與 GitLab 的 OAuth 權杖、npm 登錄檔權杖、Docker 設定、Kubernetes 叢集權杖,以及 CI/CD 流水線的機密。Sentry 在 6 月 3 日被告知這個缺陷後,拒絕修正底層行為——用他們的話說,這在 技術上無從防守——只加了一個全域內容過濾器,封鎖某一段特定的酬載字串。
為什麼每一道既有防禦都從它旁邊走過
Agentjacking 之所以重要,不在於酬載有多巧妙,而在於一個正常的安全堆疊裡什麼都不會觸發。磁碟上 沒有惡意軟體讓端點代理去攔截。沒有異常登入讓身分監控去標記。沒有一個本不該連外的行程發出連外 連線——代理本來就該和 Sentry 對話,而開發者的憑證本來就該有效。這條鏈上的每一步,都是以正當 存取執行的、獲授權的動作。如 Tenet 所言,這場攻擊不違反任何政策,也不越過任何異常門檻。
這正是代理式安全的其他部分一再撞上的同一堵牆。命令封鎖清單 敗給了改寫命令的 shell。你信任的工作區 敗給了它悄悄啟動的伺服器。代理替你跑的 一次安全審查反倒變成了攻擊你的東西。Agentjacking 是這樣一個版本:被下毒的輸入,經由一個你有理由信任的工具抵達,帶著你有充分理由去讀的資料。 Sentry 的 MCP 伺服器把自己的工作做得完美無缺。問題在於,「擷取錯誤並據以行動」和「擷取攻擊者的 指令並據以行動」,對代理來說是同一句話。
Tenet 自己的建議指向了修正的形狀:把代理放進一個對外網路出口受限的沙箱裡跑,把 MCP 伺服器回傳的 一切都當成潛在的敵對輸入,並停止讓一段擷取到的字串在中間毫無邊界的情況下變成一道命令。這些描述的 是一套架構,不是一個修補程式。
Bromure 在哪裡劃下界線
Bromure Agentic Coding 不試圖去教代理該相信哪些錯誤報告。它改變的是一則被相信的報告能觸及什麼。 Bromure 跑的每一個代理——Claude Code、Codex、Grok Build——都在你 Mac 上一台用完即棄的 Linux VM 裡運行,而不是在 macOS 本身。所以當代理拉取那則被下毒的 Sentry 事件,並做出 Tenet 目睹這些代理 所做的一模一樣的事時,有幾件事早已成立。
第一,擷取到的文字在變成計畫之前,會先被一個偵測器讀過。 Agentjacking 在成為執行攻擊之前,
先是一場閱讀攻擊:整個漏洞利用都繫於代理把攻擊者的「解決方案」吸收進來,並把它當成指引。那正是
Bromure 所盯防的不可信權威——與惡意的 CLAUDE.md 或被下毒的 AGENTS.md 屬於同一類。Bromure 的
裝置端提示注入偵測,會把代理讀到的內容,對照永不離開 Mac 的本機模型加以評分,另外再用一個
決定性掃描器來對付不可見的 Unicode 花招。一則「修正」是一道會讀取你權杖的 shell 命令的當機報告,
正是這個偵測器存在的目的所在。
第二,命令跑在一個你會丟掉的盒子裡。 假設那個誘餌措辭得夠好,滑過了評分器,命令跑了起來。 它跑在 VM 裡。Tenet 威脅模型中的「持久後門存取」,沒有任何可供其留存之處:把設定檔重設回基準, 那個被放下的腳本、那把被加入的 SSH 金鑰、那個被排定的工作——全都不見了。命令所做的一切,沒有一樣 撐得過視窗關閉。
第三,沒有真正的憑證可偷。 概念驗證的整張戰利品清單——AWS 金鑰、GitHub 與 GitLab 的權杖、
npm 與 Docker 的憑證、Kubernetes 與 CI/CD 的機密、環境變數——正是 Bromure 一開始就擋在盒子外的
東西。Bromure 把佔位值(brm_…、一份合成的 ~/.kube/config、用完即棄的雲端與登錄檔權杖)注入
VM,只在主機上、在代理伺服器裡、在通往真正 API 的出口途中,才把真的換回來。命令翻遍環境與磁碟,
找到的是誘餌。它不論送什麼到攻擊者的伺服器,都是一袋什麼都認證不了的字串。
第四,外洩是看得見的。 Tenet 的攻擊以被偷的權杖離開機器作結。Bromure 把 VM 的流量經由一個 主機代理伺服器繞送,於是通往攻擊者伺服器的那條連線,會在安全記錄裡以你看得見的連外流量出現—— 而不是一台你以為乾淨的筆電發出的一次安靜回呼。Tenet 建議的「受限的對外網路出口」,正是代理早已 棲身之處。
這條界線圍住的是什麼
隔離與評分是圍堵,不是治好一個易信代理的解藥。值得把 Bromure 在這裡改變了什麼、又沒改變什麼, 說清楚。
報告仍然會抵達
Bromure 不會修正 Sentry 的 DSN 設計,也不會阻止攻擊者登錄一則被下毒的當機——那把公開的唯寫 金鑰是 Sentry 該劃的邊界,而他們已經拒絕去劃。Bromure 改變的,是代理讀了報告之後會發生什麼: 命令在哪裡跑,以及它能觸及什麼。
偵測是一張網,不是一堵牆
裝置端的注入評分,多半能標記出「執行這個來修」式的解決方案,但一位用心的作者可以把誘餌措辭成 滑過單一掃描器。把偵測器當成其中一層;圍堵——一個裝著假金鑰、且對外流量有記錄的用完即棄盒子—— 才是在偵測器漏掉時撐得住的東西。
替換涵蓋的是你所設定的機密
誘餌對換所保護的,是你放進設定檔的憑證:模型金鑰、git 與雲端權杖、登錄檔與叢集權杖、SSH 金鑰。 一個腳本在執行途中寫到磁碟上的權杖,或你在盒子裡親手建立的一個工作階段,都只是資料而已。把機密 留在代理仲介裡,別留在工作區裡。
隔離不是把一切都自動執行的理由
用完即棄的 VM 縮小了爆炸半徑;它不會讓審查變得多餘。對於觸及盒子之外的動作——開一個 pull request、推送到遠端——確認這一步依然值得它的位置。圍堵降低了一個錯誤的賭注;它並不刪除賭注。
Tenet 的發現,不是某一個平台有一個 bug。而是底下那套信任機制——一個把擷取到的字串當成事實、把 「解決方案」當成計畫的代理——被每一個把代理接上外部世界的工具所共享,而它這一季不會被修補。Sentry 只是信差;下一個會是一張 Jira 工單、一則 Linear 留言、一位陌生人留下的程式碼審查。你的代理終將 讀到某個攻擊者寫的東西,而在 85% 的成功率下,它有時會照著上面所說的做。問題不在於它會不會有一天 被騙。問題在於當那發生時,跑起來的是什麼:你的機器、你真正的權杖,以及一個留下來的立足點——還是 一個你可以丟掉的 Linux 盒子,裡頭裝著誘餌,對外流量留在紀錄上。Bromure 讓它成為後者。