他們把你的代理加進了名單
Gen Digital 在 9 月 8 日公布的研究顯示,八個常見的資訊竊取木馬家族如今開始蒐集 AI 編碼代理的本機資料:存取權杖與更新權杖、MCP 設定、對話資料庫、提示詞歷史、專案痕跡。這與 Claude、Cursor 或 Codex 的任何瑕疵都無關。竊取木馬帶著遠端管理的蒐集規則,所以把你代理的資料夾加進去,只是向那些早已被感染的機器推送一次設定更新而已。Bromure Agentic Coding 把那個資料夾搬進 VM,用 brm- 假貨把它填滿,並把更新權杖留在主機上,客體永遠拿不到它。
你的編碼代理沒有任何等著被人找到的漏洞。有人注意到它把檔案放在哪裡,然後向 幾十萬台早已被攻陷的機器推送了一行新的設定。
9 月 8 日,帶領 Gen Digital 威脅研究團隊的 Jan Rubín 發表了一篇短文, 講了一個毫不炫目的發現。八個不同的常見資訊竊取惡意軟體家族,如今開始蒐集 AI 編碼 代理的本機資料。它們複製檔案。整套手法就這些。
被點名的目標讀起來像一份關於開發者今年裝了什麼的問卷:Claude、Cline、Codex、 Continue、Cursor、OpenCode、Kilo。Amatera 衝著 Cline 和 Continue 去。Remus 衝著 Claude、Cursor 和 OpenCode 去。CallbackBeaver 加上了 Cursor 和 Claude, Gen 在三十天的窗口裡數到它的樣本超過 5,000 個。BeeStealer、STG Stealer、 HydraStealer、APEX Stealer 和 Otter Stealer 都在做同一件事的某個版本。 在 macOS 上這個變種叫 Djinn Stealer,它的清單最長:Claude、Codex、Gemini、 Cline、OpenCode、Kilo。
Rubín 對自己在描述什麼很謹慎。「這些活動並不指向 Claude、Cursor 或 Codex 中新發現的 瑕疵,」他寫道,「它顯示的是犯罪分子在改造既有的竊取木馬,去蒐集那些放在可預測的 本機資料夾裡的有價值檔案。」
名單長了一行
這次改動幾乎沒讓作者付出什麼。
現代的竊取木馬不會把拿什麼寫死在程式碼裡。它們隨身帶著遠端管理的蒐集規則:一份 設定資料區塊,列出資料夾、檔名、資料庫檔案、副檔名與搜尋上限,從營運者的基礎設施 取回。加一個新目標,按照 Cyber Press 的整理, 就是營運者「透過更新路徑、檔名或資料庫規則,把新近流行的 AI 工具加進惡意軟體的 蒐集清單,而不必重新建置惡意軟體」。
這是一個產品決策。有人看了看現在哪些資料夾裡裝著值錢的東西,往設定裡寫了幾條路徑, 於是那些本來就在跑這些家族之一的機器,在下一次回連時開始上傳代理的資料。營運者 沒有重新感染任何東西。磁碟上的二進位檔沒變,偵測特徵碼也就沒變。
Gen 記錄到,2026 年上半年有 330 萬名不重複的受保護使用者被偵測到資訊竊取木馬, 每月總量超過 50 萬。光是 Amatera 和 Remus 兩家,三個月裡就出現在數萬名使用者身上。 那就是營運者把新規則推送過去的人群。
那個資料夾裡有什麼
Gen 對規則蒐集內容的盤點很具體:「存取權杖與更新權杖、存放在 MCP 設定裡的憑證、 提示詞歷史、對話資料庫、帳號細節,以及一名開發者一直在做的那些專案的痕跡。」
這份清單把兩種性質不同的損失放在了同一個名字底下。
第一種是存取權。一個存取權杖買到一次工作階段。一個更新權杖買到多次工作階段, 只要它還有效就一直買得到,因為有人就是把它設計成比它出身的那次工作階段活得更久。 正是這個性質讓它值得被偷,也正因如此,撤銷一次工作階段並不能把竊賊從原地趕走。就在 同一個資料夾裡緊挨著它的,是你 MCP 設定裡的憑證,而它們打開的是另一樣東西:一個 內部服務、一套工單系統、一個藏在 HTTP MCP 伺服器背後的資料庫。
第二種損失是情報,而且更新鮮。你的提示詞歷史,是一趟關於你雇主基礎設施的導覽。 Cyber Press 說得很直白:被偷走的提示詞歷史會揭露「儲存庫名稱、內部主機名稱、基礎 設施細節、安全控制措施、API 機密與商業計畫」。某個週二,你敲進服務的名字、叢集的 名字、遷移卡住的原因,然後貼上那段帶著連線字串的片段,問它為什麼老是失敗。你從來 沒有為自己的聊天記錄寫過一份威脅模型。
它是從一條搜尋結果裡來的
把竊取木馬放上機器同樣不需要零日漏洞。五月,EclecticIQ 記錄了一場
把假冒安裝頁面排到真頁面之上
的行動:claudecode.co.com 和 geminicli.co.com,模仿廠商文件模仿得夠像,一眼掃
過去看不出來。頁面遞給你一行 PowerShell 讓你複製。你一執行,就拿到了想要的工具,
明明白白裝好,同時第二條藏起來的指令把一個無檔案的竊取木馬直接拉進記憶體。它進來的
路上關掉 ETW 和 AMSI,然後收割瀏覽器、Slack、Teams、Discord、VPN 用戶端、SSH 金鑰
與雲端儲存路徑。同一個組織對 Node.js、Chocolatey、KeePassXC 和 Monero 用過同樣的招。
於是受害者,就是那個搜尋編碼代理並點了第一條結果的開發者。四個月之後,這位開發者 連代理的權杖與對話歷史也一併交了出去,因為蒐集規則長了一行。
同一次清掃,發生在 Bromure 工作區裡
Bromure Agentic Coding 把每一個編碼代理都放進你 Mac 上一台硬體虛擬化的 Linux VM 裡跑,並把每一份真正的機密都留在這條邊界的主機一側。把 Gen 的蒐集清單一項一項拿 出來,對著一個工作區跑一遍。假設竊取木馬在主機上贏了,讀到了規則,然後逐一去取。
存取權杖與更新權杖。 如果你用的是 Claude 或 ChatGPT 的訂閱而不是 API 金鑰,
登入根本不會發生在你的工作 VM 裡。Bromure 會啟動一台一次性的註冊 VM,不掛載任何
工作區資料夾,也不帶憑證替換表,在裡面執行真正的 claude login,在主機上捕獲拿到
的 OAuth 權杖,加密保存,然後銷毀這台 VM。從那以後,客體在 API 金鑰模式下執行,
手裡拿的是一份確定性的假憑證:給 Claude 的是假的 ANTHROPIC_API_KEY,給 Codex 的是
一個 ~/.codex/auth.json,裡面種著一個到期時間遠在未來的假 JWT,好讓用戶端永遠
不會自己去更新。更新是主機做的,大約在到期前五分鐘,為每一台執行中的 VM 各做一次。
手冊把結果說得很直白:客體永遠不持有更新權杖。
存放在 MCP 設定裡的憑證。 MCP 的 bearer 得到同樣的待遇,設定面板上就這麼寫著。
HTTP 傳輸的 MCP 伺服器,真正的權杖留在主機上,代理讀到的設定裡是一個 brm-mcp_…
佔位值,代理伺服器會在線路上把真值換進去,範圍嚴格限定為該伺服器主機的完全相符或
子網域相符,別處一概不行。MCP 面板裡的這個欄位帶著說明
絕不送進 VM——由代理替換。
其他所有看起來像金鑰的東西。 你設定的每一份憑證,在 VM 內部都會被一個保持結構的
假貨替換掉,它由真值加上每次安裝獨有的鹽推導而來,因此保留著驗證器期待的形狀,並在
不同工作階段之間保持穩定:sk-ant-api03-brm-…、sk-brm-…、xai-brm-…、
brm-k8s-…、brm-docker-…、brm-db-…。替換通道只朝一個方向流動。主機可以把假貨
寫進客體;不存在任何讓客體反過來索要真值的呼叫,而 VM 內的代理會拒絕寫入任何不帶
brm- 前綴的憑證。
對話資料庫、提示詞歷史、專案參照、快取的原始碼。 這些都是真的,而且是持久的, 因為寫程式這件事需要持久的狀態。它們住在工作區 VM 自己的持久家目錄裡,一個工作區 一份,在 hypervisor 的另一邊,而不在蒐集規則點名的那個 macOS 家目錄裡。一條寫著 「從使用者設定檔裡複製代理的設定目錄」的規則,找到的是一個裡面沒有代理的使用者 設定檔。
主機自己的儲存。 主機保存的東西,用每次安裝獨有的 256 位元主金鑰以 AES-GCM
靜態加密,那把金鑰存放在 macOS 的 Data Protection 鑰匙圈裡,限定於應用程式的簽章
身分,並關閉了 iCloud 同步。這個應用程式不上傳也不同步任何東西。把
Application Support 資料夾整個複製走,或者還原它的一份 Time Machine 備份,沒有
這台 Mac 的鑰匙圈項目,你拿到的只是密文。
當清掃發生在 VM 內部
竊取木馬也可以從另一頭進來:由代理自己拉進來,經由一個相依套件或者一段被下毒的 指令,然後在工作區內部執行。那樣清掃就成功了,而它蒐集到的是假貨。真正翻車的是 上傳那一步。
每一個假貨都只有一個合法的目的地家族,也就是它被鑄造時對應的主機範圍,所以代理 伺服器會掃描每一個外送請求的標頭與內文,用一個便宜到可以對所有流量都跑的 Aho-Corasick 自動機,尋找跑向不屬於自己的地方的假貨。一旦命中,它就以 HTTP 451 拒絕該請求,一個位元組也不轉發,當場把 VM 暫停,並拋出一則警示,提供關機、 保留以供調查(先把磁碟、家目錄與共用資料夾匯出以便鑑識)或者自負風險的 繼續。這個事件會作為一列紅色的 Credential brokering 記錄落在 Security Timeline 裡,應用程式把該工作區標記為已受損,下一次啟動需要抹除並啟動。
代理伺服器還會標記外送流量裡未被替換、看起來像真的機密:帶有 sk-ant-、ghp_ 或
AKIA 這類已知前綴的 Bearer 與 x-api-key 值,以及二十個字元以上的不透明權杖。
它們會出現在 Trace Inspector 和 bromure-cli trace leaks 裡。它們通常意味著有人手動
把一份真正的機密貼進了 VM,而那是唯一能從內部拆掉這條邊界的辦法。
可達性是第三道檢查。每個工作區都帶著一份有序的出口防火牆,涵蓋動作、通訊協定、 主機或 CIDR、連接埠,對於 web 流量還涵蓋到個別 HTTP 動詞,並為未匹配的流量提供一個 分段控制項。新工作區會放行所有沒被規則匹配到的流量。把它設為拒絕,列出工作 真正需要的東西,竊取木馬的 C2 主機就不在這份清單上。客體之外的兩個元件負責執行: 虛擬網路交換器依目的 IP 與從 DNS 裡竊聽到的主機名稱比對每一條流,代理伺服器再依 TLS 伺服器名稱比對一次。你對規則的修改無需重開就能到達執行中的工作階段。
如果你是靠複製貼上裝代理
查一查你是從哪裡拿到的。EclecticIQ 追蹤的那場行動把 claudecode.co.com 和
geminicli.co.com 排到了真頁面之上,遞給訪客一行 PowerShell,它一邊裝上正版
工具,一邊把竊取木馬拉進記憶體。如果這描述的正是你做過的某次安裝,就把整台機器
當作已經暴露:撤銷訂閱的工作階段,而不是只輪替一把金鑰;把 MCP 設定裡的權杖
全部輪替;再用攻擊者的眼光重讀一遍自己的提示詞歷史。裡面的主機名稱與儲存庫
名稱,是你輪替不掉的那部分。
縮小標的的兩個設定
透過工作區編輯器註冊你的 Claude 或 ChatGPT 訂閱,這樣 OAuth 權杖會在主機上被
捕獲,客體跑的是一把假金鑰。然後打開 Guardrails,把未匹配的流量設為
拒絕,並列出工作真正需要的東西:allow web api.github.com、
allow web registry.npmjs.org、default deny。一次工作階段之後執行
bromure-cli trace hostnames my-workspace,就能看到代理接觸過的每一個主機
以及次數。
戰利品跟著普及走
竊取木馬學習資料夾的順序是可以預料的。先是瀏覽器設定檔,然後是加密貨幣錢包, 然後是 Discord 與 Slack 的權杖,然後是 VPN 設定檔。每一樣都是在它所屬的那個東西 變得稀鬆平常之後一兩年,才進入蒐集規則的。這段落差,就是要等到足夠多的機器都有 那個資料夾,寫下那一行設定才划算所需的時間。
編碼代理今年越過了那道門檻,入場價是一次設定更新,橫跨八個家族,就在一個季度 之內。沒有修補程式能補上這件事,因為什麼都沒壞。資料夾就在它該在的地方,裝著它 該裝的東西,而那台機器上同時還跑著你的瀏覽器與你的郵件。
能改變結局的,是讓那個資料夾不值得別人費力去複製。把代理的狀態放到 hypervisor 的 另一邊,用形狀正確、數值錯誤的值填滿它的憑證檔案,把真的留在主機上,讓更新在那裡 發生。
你的編碼代理是一個普通的應用程式,把普通的檔案放在普通的地方,而這正是它被加進 名單的原因。在下一個家族更新它的設定之前,先決定這些檔案被允許值多少錢。 安裝 Bromure Agentic Coding,讓他們去複製誘餌吧。