代理推薦了那個惡意軟體
Island 發現了 FakeGit:約 7,600 個惡意 GitHub 儲存庫,其中逾 800 個假冒 AI skill 與 MCP 伺服器,散播一個名為 SmartLoader 的 Windows 載入器,用以安裝 StealC 資訊竊取程式。新的地方在於投遞手法 AgentBaiting——Claude Code、Gemini 與 ChatGPT 會自行找到這些儲存庫,把攻擊者的 README 當作文件來讀,並把安裝步驟遞給你。在一次測試中,Claude Code 自己複製了儲存庫並執行了檔案。Bromure Agentic Coding 讓從推薦到執行的整條路徑都跑在一台用完即棄的 Linux VM 裡,在那裡 Windows 載入器毫無作用,能偷的憑證只有誘餌。
你要你的程式代理去找一個 skill。它搜尋了,讀了一份看起來像文件的 README, 然後叫你下載一個 ZIP 並執行它。沒有人寄給你一條壞連結。是代理自己找到了 惡意軟體並加以推薦——而且在一次測試執行中,它複製了儲存庫,替你執行了 那些檔案。
2026 年 7 月 21 日,Island 發表了一項研究,談的是它稱為 FakeGit 的行動——以及它命名為 AgentBaiting 的投遞手法。數字很龐大:橫跨約 6,600 個帳號的約 7,600 個惡意 GitHub 儲存庫,其中逾 800 個假冒 AI skill 或 MCP 伺服器——Gmail 與 WhatsApp 整合、Databricks、Jenkins 與 Docker 工具,正是開發者會叫程式代理去找的那種 能力。其中逾 600 個還被列在 LobeHub、Glama、MCP.so 與 MCP Market 這類公開的 AI 登錄檔上。到了七月,約 200 個儲存庫的子集,其發行資產已累積逾 1,400 萬 次下載。
酬載是一個名為 SmartLoader 的 Windows 載入器,它建立持久化並拉下 StealC, 一款資訊竊取程式。惡意軟體是尋常的部分。它如何抵達你,才是新的部分。
AgentBaiting:代理就是投遞管道
供應鏈攻擊過去需要一個誘餌——電子郵件裡的一條連結、你打錯字而輸入的仿冒 套件名、你點下去的一則搜尋結果。FakeGit 把人從這一步中抽走。Island 的發現, 用它自己的話說:「一個 AI 代理不需要被交予惡意連結。它可以自行發現一個 FakeGit 儲存庫,把 README 當成合法文件對待,並把攻擊者的指示遞交給使用者。」
他們拿真實的代理來測試:
- 要 Claude Code「找一個免費的電影感提示詞 skill」,它浮現出
adlaiponderous700/claude-skill-cinematic-prompt,並在部分執行中推薦了 下載並執行的步驟。 - 要 Gemini 一個「免費的 Walmart MCP 伺服器」,它把
DomingosNgongo/walmart-mcp當成首選結果回傳,附上直接的 GitHub 連結。 - ChatGPT 把同一個儲存庫列進選項,並把它點名為「最好的起點」。
沒有一個是被交予連結的。這些代理去找一項能力,透過尋常的搜尋與登錄檔瀏覽
找到了那場行動的儲存庫,並把攻擊者所寫的 README,如同讀任何文件那般——當成
事實——來讀。這些儲存庫正是為那樣的讀者所打扮的:
Mann1988/awesome-claude-skills 複製了真正的
ComposioHQ/awesome-claude-skills(逾 67,000 顆星),並用 63 顆星和 18 個
分叉來灌水,好讓自己顯得根基穩固。使用者名稱與某位知名維護者只差一個字元。
README 帶著讀者走過三個步驟:從 GitHub Releases 下載 ZIP、執行它、把任何
安全警告點掉、跟著安裝精靈走。
而在至少一次執行中,Island 報告說,Claude Code 沒有停在推薦——它「複製了 惡意儲存庫,並把惡意檔案下載到測試機器上」,直到指標裡的某些東西使它停下。 整個攻擊面就在一句話裡:代理,在做一件例行任務時,自己把酬載搬下到磁碟上。
實際落地的是什麼
那個 ZIP 不是原始碼。Island 對這個破綻直言不諱:「一個合法的 MCP 伺服器或
Skill 是帶著清單檔的原始碼,而不是一個裝著啟動指令碼、改名的執行環境,以及
偽裝成文字檔的酬載的 Windows ZIP。」在一個像 server_databricks_mcp_1.6.zip
的 FakeGit 發行版裡,你會拿到一個小小的 .cmd 或 .bat 啟動器、一個改名的
LuaJIT 式執行環境(luau.exe),以及一個約 300 KB、頂著資料檔名字的混淆
Lua 酬載——ico64.txt。啟動器執行 start luau.exe ico64.txt,主控台視窗
自行隱藏,接著 SmartLoader:
- 從存在Polygon 智慧合約裡的一個值解析出它的命令與控制位址——去中心化、 難以下架;
- 在
%LOCALAPPDATA%底下註冊排程工作,以熬過重新開機; - 從 GitHub 拉下加密的階段,並透過 PE 加密器把 StealC 注入另一個行程。
接著 StealC 做資訊竊取程式會做的事,還更惡劣一點:它拿走瀏覽器的密碼與 cookie、擴充功能資料、電子郵件與遠端存取的憑證、螢幕截圖、主機細節——還有 作用中的工作階段。Island 對最後這一點的註記很要緊:「StealC 拿走的是 即時工作階段,不只是密碼,所以光是重設密碼並不夠。」一枚被偷的工作階段 權杖,早已越過你的登入。
為什麼查核儲存庫從來就不是全部的答案
直覺是去抓那個壞儲存庫——為仿冒名標記、為 README 打分、把帳號列入封鎖清單。 Island 自己的建議指向更難的地方:「監看代理走的路徑,而不只是使用者走的 路徑。AgentBaiting 意味著一次下載、一次 git clone 或一條 shell 指令,都可能 源自一個正在完成例行任務的代理。」代理的搜尋,不是一條你能安上人為查核點的 路徑。它以機器的速度執行,橫跨數千個近乎相同的儲存庫,並把它找到的任何東西 都當成文件——因為那正是它的工作。
這是代理式資安其餘部分不斷撞上的同一堵牆。一份讀取指令的封鎖清單 敗給那條把它改寫掉的 shell。 一個讀取套件的掃描器敗給那個不在套件裡的酬載。 而一次為了找出惡意軟體的審查執行了它被派去找的那個惡意軟體。 FakeGit 又加上一個:一具把攻擊者的 README 當作真理的推薦引擎。它們每一個都 把過濾器放在壞東西被描述的地方,指望在壞東西執行之前抓住它。描述由 攻擊者來寫。執行才是結果被決定的唯一之處。
Bromure 在哪裡劃線
Bromure Agentic Coding 不試圖去猜贏代理的搜尋結果。它改變的是那唯一要緊的 時刻所發生的事——當被推薦的東西執行時。Bromure 所執行的每一個代理——Claude Code、Codex、Grok Build——都跑在你 Mac 上一台用完即棄的 Linux VM 裡,而非 macOS 本身之上。所以當代理複製了 FakeGit 儲存庫,並像 Island 看著 Claude Code 那樣執行 ZIP 時,已經有三件事為真。
第一,**酬載毫無作用。**SmartLoader 是一支 Windows 程式:一個 .bat
啟動器、一個 luau.exe 執行環境、一次 PE 加密器注入、%LOCALAPPDATA%
底下的排程工作。Bromure 的代理跑在 Linux 上。.cmd 啟動器沒有直譯器,
luau.exe 與被注入的 StealC PE 不會執行,也沒有 %LOCALAPPDATA%、沒有
Windows 工作排程器可供持久化攀附。一場為某個作業系統編譯的攻擊,跑在另一個
上頭,找不到任何它懂得怎麼做的事。
第二,**沒有真正的憑證可拿。**假設攻擊者出的是 Linux 版本。StealC 的全部
用意就是刮取瀏覽器儲存、即時工作階段與已存的憑證——但在 VM 裡,沒有登入的
瀏覽器、沒有 cookie 罐、沒有可撈起的工作階段。它能在磁碟與環境裡找到的
祕密都是誘餌:Bromure 把佔位值(brm_…、一份合成的 ~/.kube/config、
用完即棄的 ssh 與雲端權杖)注入 VM,只在主機上、在代理伺服器裡、在通往真正
API 的出口途中,才把真的換回來。真正的金鑰從不進入這個盒子。凡是抵達那個
由 Polygon 解析出的 C2 的,都是一袋什麼都認證不了的字串。
第三,**外流可見,盒子用完即棄。**C2 的解析、從 GitHub 取得加密階段、外傳的 信標——這些都會以你看得見的對外流量,出現在 Bromure 的安全記錄裡。而因為 VM 的家目錄是用完即棄的,那個排程工作與任何落地的二進位檔,都會在你下次把設定 檔重設回基底時消失。沒有一台持久的主機供 SmartLoader 保住立足點。
還有第四層,因為這場攻擊在是一場執行攻擊之前,先是一場閱讀攻擊。FakeGit 的
README 正是 Bromure 所看守的那類不可信權威——與一份流氓的 CLAUDE.md、
AGENTS.md 或 SKILL.md 屬同一類。Bromure 的裝置端提示注入偵測,會拿代理
當作文件吞入的內容,對照從不離開 Mac 的本機模型加以打分,另有一個針對隱形
Unicode 花招的確定性掃描器。一份告訴代理「下載這個 ZIP、執行它、把警告點掉」
的 README,正是那個偵測器存在要標記的案例。它單獨並不是一堵牆——但在 Bromure
裡,它坐落在隔離之上,所以就算漏接,仍會被一個裡頭沒有任何真東西的盒子
接住。
這劃線圈住的是什麼
隔離是圍堵,不是推薦過濾器。值得把 Bromure 在此改變什麼、不改變什麼說清楚。
代理仍然可以推薦那個儲存庫
Bromure 不查核 GitHub,不查核 MCP 登錄檔,也不查核代理的搜尋結果,更不會 阻止代理浮現一個 FakeGit 儲存庫或把它的安裝步驟遞給你。它的供應鏈掃描 涵蓋的是套件登錄檔——npm、PyPI、Cargo 等等——而不是仿冒儲存庫的 README。 改變的是被推薦的東西在哪裡執行、以及執行時它能觸及什麼。
擋下 Windows 酬載的是作業系統邊界,不是一條規則
SmartLoader 失敗,是因為代理跑在 Linux 上,而不是因為 Bromure 為它做了 指紋辨識。一個 Linux 原生的竊取程式會執行——卻仍然空手而回,因為 VM 裡 沒有登入的瀏覽器、沒有即時工作階段,憑證是誘餌,家目錄用完即棄。
替換涵蓋的是你所設定的祕密
誘餌替換保護的是你放進設定檔的憑證:模型金鑰、git 與雲端權杖、受託管的 資料庫端點、ssh 金鑰。你在盒子裡手動建立的工作階段,或某支腳本在執行途中 寫進檔案的祕密,都只是資料。把祕密放在代理處理器裡,別放在工作區裡。
偵測是一張網,不是一堵牆
裝置端的注入打分,多半能標記出一份要你安裝並執行的 README,但意志堅定的 作者能把誘餌的措辭調成溜過單一掃描器。把偵測器當成一層;當偵測器漏接時 撐住的,是那份圍堵——一個裝著假金鑰、外流被記錄的用完即棄盒子。
Island 的收尾一句最值得靜下來咀嚼:「AI 能力已成為軟體進入企業的一條途徑, 而 FakeGit 不會是最後一場利用它的行動。」你的代理會去找 skill 與伺服器,而它 找到的一部分,會是為了被找到而打扮過的。問題不在於它會不會有天推薦錯的 儲存庫——在 7,600 個儲存庫與 1,400 萬次下載的規模下,有時候就是會。問題在於 它這麼做時,執行的是什麼:是你的機器、你的瀏覽器工作階段與你真正的金鑰,還是 一個你可以連同裡頭一把誘餌一起扔掉的 Linux 盒子。Bromure 讓它是後者。