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

你的編碼代理觸發了那道為入侵者而建的警報

Sophos 檢視了一週的端點遙測資料,發現 AI 編碼代理觸發了那些用來抓攻擊者的同一批規則。被攔截活動中超過一半是憑證存取——代理解密瀏覽器儲存的密碼、掏空 Windows 憑證保險庫、殺掉瀏覽器行程以讀取其儲存。無論由誰發起,這種行為都有風險。它之所以能碰到那些儲存,只是因為代理跑在你的機器上、以你的身分、帶著你的觸及範圍。把代理挪到一個 hypervisor 之外,端點上就沒有任何東西可供它觸及了。

Sophos 擷取了一週的端點遙測資料,發現編碼代理觸發了那些為抓入侵者而建 的規則。被攔截活動中的百分之五十六是憑證存取——代理解密瀏覽器儲存的 密碼、掏空 Windows 憑證保險庫、終止瀏覽器行程以讀取其儲存。這些代理 身上沒有任何惡意。它們能碰到那些儲存,是因為它們跑在你的機器上、以你的 身分、帶著你所能觸碰的一切。

一位開發者打開 Claude Code,讓它查點東西,然後去倒咖啡。回來的路上, 端點代理給這次工作階段打了標記:某個行程剛剛用一個 Windows 系統 API 解密了 瀏覽器儲存的憑證 blob。那是教科書式的資訊竊取器動作。而這一次,它也正是 編碼代理在做別人交代它的事——用實用的方式讀取一個登入後才可見的頁面, 解鎖瀏覽器早已儲存好的那個密碼。

Sophos X-Ops 花了 2026 年 6 月的一週來清點這些碰撞。他們從 Windows 端點上 的行為引擎裡取出攔截型與靜默型的規則命中,按唯一機器計數,並按 MITRE ATT&CK 戰術 排序。圖景毫不含糊。在攔截型規則中,憑證存取占了 56.2%執行占 28.8%。單條最大的憑證規則——占該組的 42.6%——在某個行程使用 Windows 資料保護 API(即 DPAPI,那個解鎖程式先前存下的機密的作業系統服務) 時觸發。那正是資訊竊取器把瀏覽器加密的密碼檔案還原成明文時所做的呼叫。 如今它也是編碼代理在某個技能需要一個已登入頁面時所做的呼叫。

攻擊者的行為,善意的意圖,同一份遙測

Sophos 捕捉到的這條鏈上,每一步都是開發者能認出的工具。一個叫 GStack 的 「技能包」——一捆你裝進代理的現成能力——附帶一個 /browse 技能。當代理用它時, 行程樹跑的是 bash → browse.exe → node → PowerShell,而那個 PowerShell 載入 System.Security,對瀏覽器儲存的資料呼叫 DPAPI 的 Unprotect。 Sophos 捕捉到這條鏈在 Claude Code 之下執行。那一週的其他地方還有: 用 cmdkey /list 列舉 Windows 認證管理員,按 PID 對瀏覽器行程用 taskkill 好讓它們的憑證檔案可被自由讀取,用 certutilbitsadmin ——兩個簽署過的 Windows 公用程式——去取一個 Python 安裝程式,以及 PowerShell 往啟動資料夾裡寫一個指令碼,好讓它在下次登入時執行。

把「編碼代理」這幾個字去掉再讀這份清單,那就是一次入侵。憑證竊取、 就地取材(living-off-the-land)二進位檔——攻擊者借用的那些簽署過的作業 系統工具,好讓沒有任何陌生東西冒出來——以及一個持久化立足點。行為引擎對 這一切觸發是對的。Sophos 對結論很謹慎:這是「第一遍、一次簡短的訊號傾印」, 不是普查,偵測也不意味著這些代理是惡意的。它們所意味的更窄也更持久。這些 動作中有一些,無論由誰發起都有風險,用他們的話說,「由一個 AI 代理來做, 並不會讓它們變得安全」。

被攔截的端點活動 · 一週 · 按 MITRE 戰術憑證存取56.2%執行28.8%干擾 (AAP)4.1%其餘每種戰術各<4%憑證組內部DPAPI 瀏覽器解密占憑證命中的 42.6% · 單條規則還有:cmdkey /list(憑證保險庫)taskkill 瀏覽器 PID,然後讀取儲存
一週的 Windows 端點遙測,按攔截型規則中的 MITRE 戰術劃分。憑證存取占主導:代理透過 DPAPI 解密瀏覽器儲存的密碼、用 cmdkey 掏空 Windows 憑證保險庫、殺掉瀏覽器行程以讀取其儲存。這些規則是為抓入侵者而建的;它們觸發在做正當工作、卻擁有與入侵者相同觸及範圍的編碼代理身上。

問題在於觸及範圍,而非意圖

同一條規則既抓賊又抓助手,原因在於:在正常配置裡,它們站在同一個位置。 代理以你的使用者帳戶、在你的機器上執行。那個帳戶能打開瀏覽器儲存的密碼, 因為是你儲存的。它能讀 Windows 認證管理員,因為那個保險庫是你的。它能往 啟動資料夾裡寫、能呼叫 certutil,因為你執行的每一個程式都能。代理一啟動, 就繼承了你全部的環境權限——每一個機密、每一個簽署工具、磁碟上每一個可寫的 角落。於是一次提示注入、一個被下毒的技能,或一個過於賣力的正當任務,就有了 這一切可供施展。

正因如此,Sophos 把難點定位為政策,而非偵測:「應該允許代理在端點上做什麼? 應該強制哪些邊界?」他們的調校建議把規則一分為二。有些應當學習代理的 已知良性簽章,好不再狼來了地亂叫。另一些「應當繼續觸發,因為它們抓到的活動, 無論由人還是代理發起都有風險」——DPAPI 解密和憑證保險庫傾印就在其中。而這就 把防禦者留在了真正的兩難裡。為讓代理安靜而抑制憑證規則,你就會對做出相同 呼叫的資訊竊取器失明。讓它繼續觸發,你的佇列就會被自家開發者裝的一個工具 填滿。兩種選擇都不好,因為兩者都假定代理必須住在端點上、緊挨著機密。

挪走代理,那個保險庫就不在那兒等著被打開

只有當代理住在機密旁邊時,這個兩難才成立。 Bromure Agentic Coding 讓每個編碼代理在一台一次性的 Linux 虛擬機裡執行,離你的 Mac 一個 hypervisor 之遠。代理的世界就是那台 虛擬機。你的 macOS Keychain 不在其中。你儲存密碼的那個瀏覽器設定檔不在 其中。沒有 Windows 認證管理員,沒有主機的啟動資料夾,沒有可供終止和翻查的 主機瀏覽器行程。當某個技能像 GStack 的 /browse 那樣去搆儲存密碼的儲存時, 這一搆,落進的是一台從未持有過那些密碼的全新虛擬機。呼叫可以執行;它找不到 任何值得拿走的東西。

剩下的是代理幹活確實需要的憑證——模型的 API 金鑰、推送分支用的 GitHub 權杖、部署用的 AWS 機密。把它們交給虛擬機,只會把你剛搬離的那個保險庫 重建出來。Bromure 不交給它。主機上的一個中間人代理,坐在虛擬機與外部世界 之間的線路上。在虛擬機內部,代理只握著假貨——本該是真金鑰的地方,是一個 brm_… 的預留位置字串。當代理向 api.anthropic.comgithub.com 發出 請求時,代理在出去的路上把假貨換成真值,在回來的路上再換回來。真正的機密 只在需要它的那一跳裡存在,從不進入虛擬機的記憶體。一個把自己環境裡能找到的 一切都解密的代理,最後帶走的只是預留位置。

主機上的代理 · 以你的身分編碼代理在你的使用者帳戶中執行從它執行之處可以觸及瀏覽器儲存的密碼(DPAPI / Keychain)作業系統憑證保險庫 · cmdkey /list啟動資料夾 · 簽署過的 LOLBinsEDR 規則觸發——與資訊竊取器相同的呼叫。抑制它,或被淹沒。一次性虛擬機中的代理 · BROMURE編碼代理一個 hypervisor 之遠 · 只握著假貨從它執行之處可以觸及主機密碼儲存 — 不存在主機憑證保險庫 — 不存在代理自己的環境 — 預留位置(brm_…)主機代理只在線路上把假貨→真的換入。真機密從不進入虛擬機。
左:代理以你的身分在主機上、在你的環境權限之內執行——瀏覽器密碼儲存、作業系統憑證保險庫、啟動資料夾、簽署過的下載工具。一次正當的搆取和一個資訊竊取器的搆取是同一個呼叫,所以端點規則怎樣都會觸發。右:Bromure 讓代理在一台一次性虛擬機裡執行。主機的儲存並不存在,代理所用的憑證是假貨,由主機代理只在線路上換成真的。攻擊者形狀的呼叫照樣執行;它落在一個無物可取的地方。

讓人類留在迴路裡的兩條規則

隔離把機密挪出了觸及範圍;另外兩個控制決定一個真機密何時才被允許離開主機。 每一次憑證替換都可以設定為需要核准——從假到真的替換會暫停,你 Mac 上的 一個對話框會在真值出去之前詢問。對於一個 SSH 金鑰或一個 AWS 請求,你授予它 五分鐘、一個小時,或本次工作階段的其餘時間,然後它再次上鎖。而對於透過代理接進來 的資料庫——MongoDB、ClickHouse、Elasticsearch——一道護欄會讀取線路上實際的 操作,並能攔下破壞性的那些,於是一個代理自己說服自己發出的 DELETE,即便在 憑證被換入之後,也永遠到不了真正的端點。

這一切都沒有要求代理守規矩。它假定代理可能會去做那件攻擊者形狀的事——解密 一處儲存、掏空一個保險庫、重試一次被攔的下載——因為 Sophos 剛剛看著真實的 代理做了正是這些。設計決定:當它發生時,儲存是空的,金鑰是假的,破壞性的 查詢在門口就被攔住。

代理如今的行為,正像你的防禦被調校去阻止的那個東西,而你沒法靠請它守規矩來 解決這件事。你靠改變它們所站的位置來解決。給一個代理一台沒有儲存密碼的一次性 機器、一個裝滿假貨的保險庫,以及一個把真機密留在主機上的代理——那份點亮了 Sophos 傾印的遙測,就變成一個在空房間裡翻找的行程。 裝上它,把它指向一個儲存庫,任它去搆它想要的任何東西。