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

代理程式憑空捏造的套件

特拉維夫大學、以色列理工學院與 Intuit 的研究人員揭露了 HalluSquatting:攻擊者反覆試探編碼代理程式,直到摸清它會穩定捏造哪些套件名、儲存庫名或技能名,接著搶先註冊那些捏造出來的名稱,然後守株待兔。當你要求真正的資源時,代理程式反而抓取攻擊者的版本——而藏在其中的指示會劫持代理程式的 shell,安裝殭屍網路惡意程式。儲存庫名稱的捏造率最高達 85%,技能安裝最高達 100%。Bromure Agentic Coding 讓這整條抓取與執行的路徑跑在一次性的 Linux VM 裡,掃描猜測落地的套件登錄庫,只留給惡意程式可偷的誘餌。

你向編碼代理程式要一個眾所周知的套件。它打出一個看起來沒錯的名稱,執行了安裝,然後 繼續往下走。那個名稱是猜的——而有人早已把這個猜測一字不差地註冊下來,並塞滿了惡意 程式。沒有人打錯字。名稱是代理程式捏造的,而攻擊者就守在捏造落地的地方。

2026 年 7 月,一組來自特拉維夫大學、以色列理工學院與 Intuit 的研究人員——其中包括 Aya Spira、Stav Cohen、Ron Bitton、Avishai Wool 與 Ben Nassi——描述了一種他們稱為 HalluSquatting 的攻擊。它把大型語言模型最為人熟知的弱點之一——它們會憑空捏造,並把捏造當成事實陳述 ——變成一套供應鏈投遞系統,瞄準的不是你,而是替你工作的代理程式。

這套手法簡單得近乎乏味。要一個編碼代理程式為它從未見過的專案拉取套件、複製儲存庫或 安裝技能,它往往會猜測識別碼,而不肯承認自己不知道。HalluSquatting 就把這個猜測 武器化。

從打錯字到幻覺

搶註打錯字(typosquatting)由來已久:註冊 expressslodahs,等著某個人在終端機 按錯鍵。它仰賴人犯錯。搶註 AI 錯覺(slopsquatting)在 2025 年至 2026 年初浮現,把 錯誤移到了模型身上——代理程式幻覺出一個不存在的套件名,攻擊者搶先註冊,下一個幻覺出 同一名稱的代理程式便裝下了酬載。2026 年 1 月, Aikido 的 Charlie Eriksen 記錄了一個被幻覺出來的 npm 套件 react-codeshift,在無人察覺之前擴散到了 237 個 專案。從頭到尾沒有打錯字,所以任何搶註打錯字的防禦也從未觸發。

HalluSquatting 是 2026 年的升級,而升級之處在於:幻覺不再交由運氣決定。研究人員的 方法是一套四步驟的配方:

  1. 挑一個模型沒背下來的目標。 那些出現在訓練截止之後、正當紅的儲存庫與工具最為 理想:模型聽過它們,所以會嘗試,但它沒見過真正的名稱,所以會捏造一個。
  2. 摸清那個錯誤。 反覆試探代理程式,直到你知道它會穩定產出哪個假名稱。論文報告 被幻覺出的儲存庫名稱出現的頻率最高達 85%,技能安裝的情境最高達 100%—— 一致到足以下注。
  3. 佔下那個捏造的名稱。 把它註冊到 GitHub 或外掛商店,並用寫給代理程式閱讀的 指示填滿 README、資訊清單或 SKILL.md
  4. 等待。 當開發者要求真正的資源時,代理程式反而輸出攻擊者捏造的識別碼並抓取它。 隱藏的指示接著劫持代理程式自己的命令執行工具,把酬載裝上。

那個酬載不是概念驗證。研究人員把猜測串接到提示注入——Nassi 的團隊稱之為 promptware——最終導向遠端程式碼執行與殭屍網路惡意程式:受感染的開發者機器 會回撥並聽命行事。猜測把攻擊者的檔案端上代理程式的盤子,埋藏的指示把它變成命令, 命令則用開發者的筆電組出一張殭屍網路。

為什麼這是對代理程式的攻擊,而非對你

一語道破的,是報導裡那句話:HalluSquatting「把目標從人類移向 AI 代理程式,後者在 執行命令時,可能不會確認來源是否真實」。一個對套件名沒把握的人會停下來、查登錄庫、 瞄一眼星星數。自動執行模式下的代理程式不會停。它的工作就是繼續前進,而一個從它自己 權重裡蹦出來的名稱,帶著和你親手打出的名稱一樣的權威。它沒有理由懷疑自己。

研究人員在開發者每天都會用到的工具上做了測試—— GitHub Copilot、Cursor、Windsurf、Cline、Google Gemini CLI,以及 OpenClaw 家族 ——並發現幻覺「可在不同的 LLM 模型與應用之間轉移」,對建立在 Anthropic、OpenAI 與 Google 模型之上的代理程式都有效。沒有哪一家廠商能靠修補把它消除,因為它騎乘在 編碼代理程式把請求變成動作的那套共通形態上:猜名稱、抓資源、讀它說什麼、照它說的做。

代理程式「加入套件 X」猜出一個名稱抓取捏造的名稱攻擊者已預先註冊README = 指示當成計畫來讀提示注入劫持 shell工具→安裝你的機器殭屍網路酬載安裝 · 聽命行事真實金鑰 · 權杖 · 工作階段都在磁碟上信標C2殭屍網路沒有人打錯字。代理程式自己的猜測就是那個地址,而攻擊者擁有它。
HalluSquatting 把人類從供應鏈裡拿掉。攻擊者試探代理程式,直到摸清模型會捏造哪個名稱,用一份布下陷阱的 README 或資訊清單註冊下那個確切名稱,然後等待。當你要求真正的資源時,代理程式輸出捏造的名稱、抓取攻擊者的版本、把嵌入的指示當成自己的計畫來讀,並裝下殭屍網路的酬載。在一般環境裡,這一切都跑在你的機器上。

為什麼「別再幻覺就好」從來不是解方

誘人的答案是讓模型自我查核——在抓取前先解析名稱、對 cloneinstallfetch 發出警示、把每個識別碼錨定到真實存在的東西上。這些都是好主意,研究人員也建議如此。 但它們全都住在同一個地方:一個讀取代理程式即將做什麼、盼著在它執行前攔下壞情況的 過濾器。HalluSquatting 正是針對那個讀取者而設計。名稱看來正當,因為它是模型產出的; README 看來像文件,因為 README 本就是那樣;而安裝命令,是編碼代理程式一整天做的最 稀鬆平常的事。

這正是代理程式安全其餘部分反覆撞上的那道牆。讀取命令的封鎖清單, 敗給改寫命令的 shell。 讀取套件的掃描器, 敗給不在套件裡的酬載。 搜尋技能的代理程式, 推薦它自己找到的惡意程式。 HalluSquatting 加上了迄今最鋒利的版本:那個惡意名稱根本不是來自網際網路。它來自模型。 你無法把自己代理程式的想像力列入黑名單。描述由攻擊者執筆,而執行是結果被決定的唯一 所在。

Bromure 在哪裡劃線

Bromure Agentic Coding 不試圖勸模型別再猜。它改變的是一個錯誤猜測所能觸及的範圍。 Bromure 執行的每一個代理程式——Claude Code、Codex、Grok Build——都跑在你 Mac 上一 台一次性的 Linux VM 裡,而非 macOS 本身。所以當代理程式輸出捏造的名稱、抓取攻擊者的 資源、並照研究人員所見那樣執行安裝時,有幾件事已然成立。

首先,對這類攻擊而言相當罕見的是,登錄庫這條路徑會被掃描。 當捏造的名稱是 npm、 PyPI 或 Cargo 套件時——搶註 AI 錯覺的情境、react-codeshift 的情境——它正好落進 Bromure 的供應鏈掃描裡,這道掃描會在套件從公開登錄庫被拉取時加以檢查。這是 HalluSquatting 中唯一一處,猜測解析成一個 Bromure 專為在被信任之前直接查看而打造的 東西。被幻覺出的相依套件仍然是相依套件,它從 Bromure 看守的正門走進來。

其次,酬載跑在一個你用完就丟的盒子裡。 假設捏造的名稱指向的是 GitHub 儲存庫或 外掛商店的技能,而非登錄庫套件,且殭屍網路的載入器執行了。它是在 VM 裡執行。沒有 持久的主機供它聽命:把設定檔重設回基準,投放的二進位檔、排定的工作、立足點——全都 沒了。一個在下次重設就消失的殭屍網路節點,算不上什麼節點。

第三,沒有真實憑證可供徵召。 一個翻遍環境與磁碟、尋找 API 金鑰、git 與雲端權杖、 以及 SSH 金鑰的殭屍網路惡意程式,找到的是誘餌:Bromure 把佔位值(brm_…、一份合成 的 ~/.kube/config、可拋棄的 ssh 與雲端權杖)注入 VM,只在主機上、在代理伺服器中、 在通往真正 API 的出口途中,才把真實的換回來。真實金鑰從不進入盒子。酬載送往其命令與 控制的,是一袋什麼都認證不了的字串。

第四,promptware 是對著偵測器被讀取的。 HalluSquatting 在成為執行攻擊之前,先是 一場閱讀攻擊——整個利用手法都懸繫於代理程式吞下攻擊者的 README、資訊清單或 SKILL.md,並把它當成自己的計畫。那正是 Bromure 看守的、不可信的權威:與一份惡意的 CLAUDE.mdAGENTS.md 同一類。Bromure 的裝置端提示注入偵測,會拿代理程式當作 文件閱讀的內容,對著從不離開 Mac 的本機模型評分,再加上一套針對隱形 Unicode 花招的 決定論式掃描器。一份被抓取的資訊清單裡埋著「現在執行這個安裝腳本」的指示,正是那個 偵測器存在的理由。

而在這一切之下,外送流量是可見的。 殭屍網路的信標、階段酬載的抓取、外洩的嘗試—— 它們會以你看得見的外送流量出現在 Bromure 的安全記錄裡,而不是來自一台你信任的機器的 一通悄無聲息的回撥。

一次性 Linux VM捏造的名稱代理程式抓取並在此安裝供應鏈掃描npm / PyPI / Cargo在門口攔下殭屍網路想徵召的東西promptware 由裝置端偵測器評分ANTHROPIC_API_KEY = brm_9f2a…(假)git / AWS / ssh = 誘餌 · 盒子會重設信標(已記錄)C2 收到誘餌一個會消失的節點真實機密留在主機的代理伺服器上在傳輸時才換入代理程式照樣猜、照樣安裝。它只是在某個用完就丟的地方做這件事,用的是並不真實的金鑰。
同樣的猜測、同樣的抓取、同樣的安裝——換了機器。在 Bromure 裡,代理程式跑在一次性的 Linux VM 上:被幻覺出的登錄庫套件在正門被供應鏈掃描攔下,殭屍網路的酬載跑在某個用完就丟的地方,它翻找到的憑證是誘餌、只在主機的代理伺服器上才換成真實的,被抓取資訊清單裡的 promptware 由裝置端偵測器評分,信標則被記錄下來。猜測照樣發生。只是沒有東西可供徵召。

這劃出的界線圈住了什麼

隔離與掃描是圍堵,不是幻覺的解藥。值得把 Bromure 在此處改變了什麼、沒改變什麼講清楚。

代理程式照樣捏造名稱

Bromure 不會阻止模型幻覺出一個識別碼,也不會阻止它抓取那個名稱解析到的東西。把 代理程式的猜測錨定住,是模型與框架的問題。Bromure 改變的,是被抓取的東西在哪裡 執行,以及它執行時能觸及什麼。

登錄庫掃描涵蓋登錄庫

被幻覺出的 npm、PyPI 或 Cargo 套件,正是供應鏈掃描所檢查的——一次貨真價實的正門 攔截。被幻覺出的 GitHub 儲存庫或外掛商店技能不是登錄庫套件;那條路徑靠的是隔離、 注入偵測器與誘餌撐住,而非登錄庫掃描。

替換涵蓋你設定的機密

誘餌替換保護的是你放進設定檔的憑證:模型金鑰、git 與雲端權杖、受管資料庫端點、ssh 金鑰。一個腳本在執行途中寫到磁碟的權杖,或你在盒子裡親手建立的工作階段,就只是 資料而已。把機密放在中介,而非工作區裡。

偵測是一張網,不是一堵牆

裝置端的注入評分,在多數情況下會標出一份安裝並執行的資訊清單,但一位謹慎的作者能 把誘餌措辭得溜過單一掃描器。把偵測器當成一層;當偵測器失手時撐住局面的,是圍堵 ——一個裝著假金鑰、外送流量被記錄的一次性盒子。

研究人員以一句值得記住的話作結:「攻擊只會愈來愈好,從不會變差。」他們的成功率是 地板,不是天花板,而底層那套信任機制——一個把自己的猜測當事實、把抓取到的檔案當 計畫的代理程式——這一季不會被修補。你的代理程式終將為某個它一知半解的東西捏造一個 名稱,而那些捏造名稱中,有些早已被人佔下。問題不在於它會不會有一天抓到錯的那個。在 85% 的幻覺率下,它有時就是會。問題在於,那一刻究竟是什麼在執行:是你的機器、你真實 的金鑰,以及一個會留下的立足點——還是一個你能丟棄的 Linux 盒子,裡頭裝著誘餌,登錄庫 也在入口處查過。Bromure 讓它成為後者。