代理人信任了標點符號
Agent Data Injection 是首爾大學、UIUC 與 Largosoft 於 2026 年 7 月發表的概念驗證,它不把指令藏在提示裡。它偽造代理人用來區分可信欄位與不可信文字的標點——一個彎引號、一個轉義引號,甚至一個走失的錢字號——好讓攻擊者的 GitHub 留言被讀成維護者自己的修正,一份偽造的 CI 記錄被讀成一次乾淨的建置。它在 GPT-5.2、Claude 與 Gemini 上,最多有一半的時候繞過了專門打造的提示注入防禦。Bromure Agentic Coding 在文字成為計畫之前先把偽造的分隔符正規化,鎖住那些伸出盒外的「執行這個」「合併這個」動作,並把整件事跑在一台裝著誘餌憑證的拋棄式 Linux VM 上。
你的程式代理人靠著讀取周圍的標點,來決定該服從哪段文字——那些說著「這一段是 維護者,那一段是陌生人的留言」的引號與大括號。一種新的攻擊偽造那個標點。它 不寫一條更巧妙的指令。它寫一個彎引號,於是陌生人的留言便開始戴上維護者的 名字。
2026 年 7 月 6 日,首爾大學、伊利諾大學厄巴納-香檳分校與 Largosoft 的研究者 ——由 Woohyuk Choi 與 Byoungyoung Lee 教授領銜——發表了一篇標題直白的論文: Agent Data Injection Attacks are Realistic Threats to AI Agents。 它描述了一類攻擊,Agent Data Injection(ADI),它坐在提示注入的旁邊而非 其中,並在古典提示注入近乎零分之處, 最多有一半的時候繞過了專門打造的注入防禦。 OpenAI、Google 與 Anthropic 都證實它有效。發表時尚未回報任何修正。
它之所以對任何跑著程式代理人的人都要緊,是因為它攻擊一件代理人忍不住要信任 的東西:它取得的資料,與那份資料到來時所帶的結構,兩者之間的邊界。
分隔符就是安全邊界
代理人的脈絡是一堆來自眾多來源的文字——你的指令、一個檔案、一個網頁、某人在 議題下留的一則留言。為了明智地行動,模型必須記住哪一塊是哪一塊:這是維護者 的名字,那是某個陌生人寫的留言正文。它以文字所允許的唯一方式做這件事——用 標點。引號與大括號、標籤、方括號、換行。分隔符標出一個可信欄位在何處結束, 不可信內容又在何處開始。
嚴格的解析器照字面對待這些分隔符:引號就是引號,留言中間的一個字元就只是一個 字元。語言模型不然。照論文的說法,它靠猜測讀取標點——它從那些字元看起來像 什麼意思,推想出結構。這正是全部的破口。一個掌控低信任欄位——一則產品評論、 一則 GitHub 議題留言、檔案裡的一行——的攻擊者,把像標點的字元撒進去,模型便 讀出一個從不存在的結構。
令人不安的細節,是它需要的手藝有多麼少。研究者把這技法稱為機率式分隔符注入, 並發現那假的標點「甚至不必是對的」。一個轉義引號、一個彎引號,甚至一個走失的 錢字號,都能冒充一道真正的欄位邊界並騙過模型。嚴格的解析器本會把它們每一個都 讀成尋常文字。
它對程式代理人做了什麼
ADI 的網頁代理人版本很容易想像:偽造頁面元素上的識別碼,一個替你購物的代理人 就會在它本想點「閱讀更多」之處點下「立即購買」。瞄準開發者的版本更糟,因為它 偽造的可信欄位,是誰說了那段程式碼是安全的。
在一次示範中,攻擊者在一則 GitHub 議題下留言,並偽造作者歸屬,好讓代理人把它 讀成來自專案的維護者。當開發者稍後請代理人「套用維護者的修正」時, Claude Code、OpenAI 的 Codex 與 Google 的 Gemini CLI 正是照做——它們執行攻擊者的命令,因為就模型所能判斷,是維護者要求的。在另一次 示範中,一個惡意的拉取請求偽造了它自己已完成 CI 檢查的記錄。代理人在脈絡裡看見 一次乾淨的建置,憑那份捏造的證據判斷程式碼安全,於是合併了真正的惡意軟體。
在團隊測試的六個模型——GPT-5.2、GPT-5-mini、Claude Opus 4.5 與 Sonnet 4.5、 Gemini 3 Pro 與 Flash——之間,這些數字不是捨入誤差。結構化資料的成功率為 31 至 43%;網頁資料則從 33% 一路到 100%。而面對專為阻擋提示注入而建的防禦, ADI 仍然最多有一半的時候穿過去,在那些相同防禦冷冷擋下古典注入之處。兩種 緩解措施在實驗室裡奏效,兩者都付出了代價:以隨機、猜不到的 ID 標記頁面元素 (如 ChatGPT 的 Atlas 瀏覽器所為)把成功率從約 49% 砍到 29%,而嚴格的資料來源 追蹤把攻擊逼到零——同時把代理人完成正常任務的能力壓到約三分之一。
為何尋常的過濾器會漏掉它
一個提示注入過濾器受過訓練,去注意藏在資料裡的指令——「忽略你先前的指示」、 「執行這個命令」,那種喬裝成內容的命令的可辨形狀。ADI 不需要那個形狀。惡意的 文字讀起來可以像一則尋常的維護者備註。載著攻擊的是它周圍的標點,而一個為 可疑措辭而讀的過濾器,會從一個彎引號旁一路航過。這正是為何論文自己那道奏效的 防禦,不是更聰明的分類器,而是更嚴格的解析器——一種拒絕去猜欄位在何處結束的 來源追溯。
這正是代理式安全的其餘部分不斷重新學到的教訓。一份命令拒絕清單 敗給了改寫命令的 shell。 一個受信任的 MCP 工具 交回攻擊者寫的資料。 一個你信任的工作區 啟動了你不想要的伺服器。 ADI 是那個版本,被下毒的既不是指令也不是資料,而是那道框——那個告訴代理人 該相信哪段文字的分隔符。你無法靠比對樣式脫出一個彎引號。
Bromure 在哪裡畫線
Bromure Agentic Coding 不試著把模型變成一個更會猜欄位在何處結束的猜測者。它做 兩件模型做不到的事,然後確保當兩者都錯時,損害落在某個可拋棄之處。
首先,偽造的分隔符在文字成為計畫之前就被正規化。 Bromure 的裝置端提示注入
偵測,不只是一個讀取意圖的本地模型;它與一個決定式掃描器配對——就是那個逮住
隱形 Unicode 與同形字花招的掃描器。彎引號摺回直引號,易混淆與零寬字元被剝除,
而分隔符不合正典結構的欄位會被標記。這正是研究者發現能擊敗 ADI 的那股嚴格解析
本能,作為一層施加在代理人取得的不可信文字上——與惡意的 CLAUDE.md 或被下毒的
留言同一類的輸入——而這一切都留在你的 Mac 上。
其次,ADI 真正想要的那兩個動作,仍然停在一道邊界前。 看看這攻擊試圖觸發 什麼:執行維護者的修正,以及合併那個拉取請求。 兩者都是伸出代理人沙箱之外 的動作——一道 shell 命令、一次推送到遠端。Bromure 所跑的每個代理人——Claude Code、Codex、Grok Build——都跑在一台拋棄式 Linux VM 之中,而離開那盒子的步驟, 正是 Bromure 呈上來請你確認的。一次偽造的歸屬得不到自動執行一道命令,一份偽造 的 CI 記錄得不到自動合併一條分支,因為「維護者這麼說」正是確認步驟存在來覆核的 那個判斷。
第三,若一道命令真的跑了,它跑在一個你丟掉的盒子裡。 假設某個分隔符新到能 溜過正規化器,又有說服力到能通過審查。命令在 VM 之中執行。把設定檔重置回基底, 它所丟下的一切——一個腳本、一把 SSH 金鑰、一個排程工作——都不見了。它所做的 沒有一樣熬得過視窗關上。
第四,沒有真正的憑證可供它取走。 一個在環境與磁碟中搜刮權杖的「修正」,找到
的是 Bromure 的誘餌——合成的 AWS 金鑰、一份可拋棄的 ~/.kube/config、佔位的
git 與登錄檔權杖(brm_…)。真正的機密只在主機上、在代理程式裡、在通往真正
API 的出口途中才被換上。命令送出盒外的一切,是一袋什麼都認證不了的字串,而送出
它的那條連線,會在安全記錄裡現身為一筆你看得見的外送流量。
這替什麼畫下界線
正規化與確認是圍堵,不是替一個靠猜測讀結構的模型治病。值得精確說清 Bromure 改了什麼、又沒改什麼。
留言仍舊被種下
Bromure 不阻止攻擊者留下一則偽造的 GitHub 留言,也不阻止他偽造一份 CI 記錄,更不修正底下那個事實——語言模型會推想欄位在何處結束。那些是模型與 平台該解的。Bromure 改的是代理人讀了偽造文字之後所發生的事:它被正規化, 而它試圖觸發的動作被查核。
正規化是一張網,不是一堵牆
摺回彎引號、剝除易混淆字元、標記不相符的分隔符,逮住研究者示範的那些 ADI 花招與更多,但一個新奇的分隔符可以被措辭成溜過單一掃描器。把它當成一層; 那個裝著誘餌金鑰、外送有記錄的拋棄式盒子,才是掃描器漏掉時撐住的東西。
確認守的是邊界,不是每一次編輯
確認步驟在離開盒子的動作上——執行一道命令、推送、合併——掙得它的位置。一條 只在 VM 內編輯一個檔案的偽造指令,由隔離與誘餌逮住,而非由提示。把邊界動作 上鎖;那正是一句偽造的「維護者這麼說」值得再看一眼之處。
替換涵蓋你所設定的機密
誘餌替換保護的是你放進設定檔的憑證:模型金鑰、git 與雲端權杖、登錄檔與叢集 權杖、SSH 金鑰。一個腳本在執行途中寫進磁碟的權杖,或你在盒中親手開的一個 工作階段,就只是資料。把機密留在中介裡,別留在工作區。
研究者的重點,不是六個模型共用一個臭蟲。重點是,代理人區分可信欄位與不可信 內容的方式——它靠猜測讀的標點——在代理人與外界相遇的每個地方都一樣,而它這一季 不會被修好。今天,偽造的分隔符住在一則 GitHub 留言裡。明天,它是一個 Jira 欄位、一行 commit trailer、一個取來頁面上的標頭。你的代理人終將讀到一道由攻擊者 畫下的邊界,而最多有一半的時候它會相信。問題不在標點會不會有一天騙倒它。問題 在於它被騙倒時什麼會跑起來:你的機器、你真正的權杖,以及一道把自己推上 main 的 命令——還是一個拋棄式的 Linux 盒子,先把那引號正規化,把合併扣下來看一眼,裡頭 除了誘餌別無他物。Bromure 讓它是後者。