命令是從 API 送進來的
11 月 12 日,Darktrace 展示了一把被竊的 Claude Console 金鑰如何把開發者自己的 Claude Code 變成命令與控制植入程式:工作從 Claude 的 memory store 送進來,代理掃描網路、拿一組密碼逐一試遍所有帳號,再把 1 GB 上傳到 Files API,而每個封包都送往 api.anthropic.com。在 Bromure Agentic Coding 中,攻擊者偷到的金鑰是替身,一離開就讓 VM 暫停;攻擊者自帶的金鑰會被拒絕;網路掃描在 Mac 上就被擋下;每一項工作都留在追蹤紀錄裡。
操作者把每一道命令打進 Claude memory store 裡的一個文字檔。開發者自己的 Claude Code 讀了它,執行 nmap 和 smbclient,再把戰利品上傳到 Anthropic。
11 月 12 日,Darktrace Signal Labs 的研究人員 Moishe Tajtelbaum 和 Sam Lister 發表了 Living off the AI: Shared Memories as a Covert C2 Channel。這是一個實驗室示範,Darktrace 表示尚未在真實攻擊中看到這種手法。他們也說這個手法「不依賴 Claude 平台的任何漏洞」。沒有東西會被修補。它完全由照設計運作的 Claude 功能拼成。
起點是一台開發者在上面使用 Claude Code 的 Linux 機器。一個用 curl 抓下來、交給 dash 執行的小型酬載,會找出 Claude Code 的安裝位置,收集開發者 Claude Console 帳號的 API 與 OAuth 憑證,再用另一個 curl 送回攻擊者的中繼伺服器。
拿到這些憑證後,攻擊者在開發者所屬的一個工作區裡建立 memory store,也就是附屬於 Claude Console 工作區的一組文字檔。裡面有三個檔案:一個心跳檔、一個放工作的輸入檔,和一個放結果的輸出檔。
回到開發者的機器上,酬載用 systemd-run 建立一個暫時性服務,不斷重新啟動 Claude Code。每次執行都透過一個掛鉤在心跳檔報到,請以非互動模式運作的 Claude Sonnet 4.5 從輸入檔讀取下一項工作,用 bash 工具呼叫把它做完,再把結果寫進輸出檔。接著酬載自我刪除。從那一刻起,操作者用一般的英文下達每一道命令,寫進 Anthropic 伺服器上的一個檔案。
九項工作,同一個目的地
Darktrace 對一個模擬的 Active Directory 網路執行了九項工作:
- 在本機網路上尋找 SSH、SMB 和 FTP。代理用了
ip、ss和nc,在 192.168.1.2 找到一台伺服器。 - 對那台伺服器執行一道指定的
nmap指令。 - 下載匿名 FTP 分享提供的內容。裡面有員工資料,以及一組沒有對應名字的密碼。
- 用員工姓名建出一份使用者名稱清單:
/tmp/usernames.txt裡有 190 筆。 - 透過 SMB 對網域控制站,拿這組密碼逐一試遍所有帳號。有一個帳號成功了。
- 用
smbclient列出這個帳號看得到的 SMB 分享。 - 列出其中一個分享的內容,裡面有一個 1 GB 的檔案。
- 把那個檔案下載到暫存資料夾。
- 切成三份,上傳到 Claude 的 Files API。
這些命令、每一個結果,以及那 1 GB 的上傳,全都送往 api.anthropic.com,也就是開發者的代理整天都在連線的同一台主機。大多數使用編碼代理的公司都已把這台主機列入允許清單。Darktrace 的重點是:允許清單現在就是 C2 通道,而攻擊者在第一個 curl 之後,完全不必架設自己的伺服器。
Darktrace 的建議由此而來。讓開發者從長期有效的 API 金鑰改用 OAuth 或聯合身分。做不到的地方,就讓金鑰短期有效、只限一個工作區,並且不要留在 dotfiles 和 shell 歷史紀錄裡。確認端點遙測能把代理程序的命令列和子程序,連結到它送出的資料量。留意遠高於一般推論流量的上傳量,以及執行 nc、nmap 或 smbclient 的代理程序。
Bromure Agentic Coding 正是圍繞同樣的建議打造的,只是套用在 Mac 上,而不是開發者的筆電上。
在 Bromure Agentic Coding 裡的同一台機器
Bromure Agentic Coding 在你 Mac 上的 Ubuntu VM 裡執行 Claude Code、Codex、Grok、Kimi 和 omp,每台機器一個 VM。代理、它的 shell 以及它啟動的每個程式都留在那個 VM 裡。VM 裡的憑證都是替身。每一條對外連線都經過 Mac 上的虛擬交換器和代理伺服器,代理碰不到它們。
給攻擊者同樣的立足點:他們的酬載在一台 Bromure 機器裡、以代理的使用者身分執行,並開始尋找 Claude Code 的憑證。
偷到的金鑰讓 VM 暫停
如果設定的是 Anthropic API 金鑰,VM 裡的 ANTHROPIC_API_KEY 存的是 sk-ant-api03-brm- 加上一串隨機字元。它的格式正確,所以 Claude Code 會接受,但 Anthropic 從未核發過它。真正的金鑰加密存放在 Mac 上,代理伺服器只會在送往 Anthropic 主機的請求裡換上它。
如果用的是 Claude 訂閱,登入是在 Mac 上完成的。代理伺服器自己回應權杖交換,並把 OAuth 權杖保存在主機的儲存區裡,Claude Code 也會被告知憑證留在 Mac 上。VM 裡沒有任何 OAuth 權杖可供酬載收集。
接著酬載把找到的東西送往中繼伺服器,而 VM 送出的每個請求都要經過代理伺服器的掃描。Bromure 替身只有一組合法的目的地,中繼伺服器不在其中。代理伺服器以 HTTP 451 擋下請求,一個位元組都不轉送,並暫停 VM。一則標題為 This environment may have been compromised 的警示會列出該憑證、它所屬的主機,以及它被送往的主機。預設的 Shut down 會關閉機器,並將它標記為已遭入侵。攻擊停在第一步,連一個 memory store 都還不存在。
沒有真金鑰,就沒有通道
假設酬載把金鑰藏得夠好,成功送了出去。操作者現在手上是 sk-ant-api03-brm-…。Anthropic 的 API 會拒絕它。他們無法在你的工作區建立 memory store,無法寫入工作,也無法讀出結果。這個通道需要操作者從自己那一端存取 store,而從他們那一端,這把金鑰根本無效。
攻擊者也可以改帶自己的金鑰:一把屬於他們所控制帳號的 Anthropic 金鑰,放進 VM 裡,讓植入程式從攻擊者自己的工作區讀取工作。請在機器的 Guardrails 中開啟 Only allow credentials Bromure injects。開啟這個嚴格模式後,任何帶著不是 Bromure 放進去的憑證的請求都會被擋下,並觸發同一則入侵警示。你的 Anthropic 流量照常運作。同一個 VM 裡的第二個 Anthropic 帳號則過不去。
掃描在 Mac 上止步
這些工作本身需要網路。Bromure 機器位於自己的私有子網路,每個對外封包都經過 Mac。把機器切換到 OpenShell + Sentry,除非有規則允許,否則一律拒絕。像 192.168/16 這樣的私有網段,只能透過精確的主機名稱或 allowed_ips 項目才連得到。Darktrace 的第一項工作在 192.168.1.2 什麼也找不到,nmap 收不到任何回應,也沒有 FTP 分享或網域控制站可供試密碼。每一條被拒絕的連線,都是 Security Timeline 裡的一列 Firewall。
開啟 Enforce binaries 後,VM 裡一個屬於 root 的驗證程式會把每條連線對應到開啟它的程式,每條規則也會列出可以使用它的程式。nc、nmap 和 smbclient 哪裡都沒有被列出。同一個模式還拿走了所有通往 root 的途徑,所以酬載無法用 sudo 繞過。
機器裡的代理也會收到通知。開啟 Tell the agent when policy blocks it 時(OpenShell 機器的預設值),Bromure 會利用核心哨兵的程序鏈,找出被擋連線背後的代理,並在它的對話中寫入一則說明:什麼被擋了、這是刻意的,以及不要重試,也不要換個方式去達成同一件事。被說服去掃描網路的 Claude Code 工作階段,會在被擋的指令之後立刻收到這則說明。
上傳觸發 watchdog
Darktrace 的最後一項工作把 1 GB 分三份送到 Files API。代理的正常流量是提示、回應和小型工具結果。agent watchdog 從 VM 外部監看每個工作階段。它在網路交換器上計算對外流量,獨立於代理伺服器,並與該工作階段自己的基準比較。它也會計算一連串被攔截的請求,例如撞上預設拒絕的掃描或密碼噴灑。設為 Quarantine 時,它會在幾毫秒內切斷 VM 的網路並將它暫停,接著列出它看到的內容,詢問你要怎麼處理。
追蹤紀錄顯示每一項工作
Darktrace 的偵測建議歸結起來就是關聯:把代理程序和它的命令列、子程序以及送出的位元組數連結起來。在 Bromure 機器裡,這些紀錄早已在你的 Mac 上,而且代理無法修改。
代理伺服器為每個請求寫下一筆追蹤紀錄:主機、方法、路徑、狀態,以及請求和回應的位元組數。每隔幾秒一次的心跳、對 memory store 的讀寫,以及送往 /v1/files 的三個大型 POST,各自都有獨立的一列,並附上大小。
新機器以 AI request details 等級追蹤,會保留 Anthropic 及其他模型供應商完整的請求與回應內容,並加以解析。在 Trace Inspector 的 Conversation 檢視中,操作者的工作(Claude 從 memory store 讀出並帶進上下文的內容)以明文呈現。旁邊是模型的 Bash 工具呼叫和確切的指令:nmap 那一行、smbclient 的呼叫、split。Darktrace 得從網路和端點遙測重建這條攻擊鏈。在這裡,它按順序排好了。
在裝有核心哨兵的機器上,每一次程式啟動和每一條連線,都從 VM 的核心內部回報,經由一條代理無法靠終止程序來讓它噤聲的通道。點開一條被拒絕、連往 192.168.1.2 的連線,就會看到它的 network lineage:提示、代理在呼叫前的推理、工具呼叫,以及從 claude 經 bash 到 nmap 的程序鏈。Prompt 卡片裡是一項你從未寫過的工作。
善後
如果入侵警示已經觸發,機器會被標記為已遭入侵,在你選擇 Wipe and Launch 之前都不會開機。這會清除它的磁碟映像和家目錄,並保留你的權杖、SSH 金鑰和設定。沒有警示時,Reset disk 會從基礎映像重新複製系統磁碟。Rewind home… 會把家目錄倒回酬載抵達之前某一天的開頭。而且因為這台機器從未持有你真正的 Anthropic 金鑰,原本必須輪替的那把金鑰仍待在原處:你的 Mac 上。
金鑰是絆線
酬載找到的是 sk-ant-api03-brm- 替身,若是訂閱則根本沒有權杖。把它送往中繼伺服器會得到 HTTP 451,VM 隨即暫停。
沒有通道可開
替身無法建立或讀取 memory store。攻擊者自帶的金鑰會被嚴格憑證模式拒絕。
工作撞牆
預設拒絕擋下 192.168.1.2,Enforce binaries 從未列出 nmap 或 smbclient,Claude Code 也會被告知不要重試。
每道命令都有紀錄
追蹤紀錄保留每個請求的路徑和大小,並解析工作與工具呼叫。遇到異常龐大的上傳,watchdog 會隔離該工作階段。
本週該做的事
- 找出開發者的 Claude、OpenAI 及其他模型 API 金鑰放在哪裡:shell 設定檔、
.env檔案、代理的設定資料夾。能改的就改用 OAuth 或聯合登入,其餘則改為短期有效、只限一個工作區。 - 在 Claude Console 中檢查每把金鑰能存取哪些工作區,並查看其中是否有你不認得的 memory store 或 Files API 上傳。
- 針對啟動
nc、nmap、smbclient或類似工具的代理程序、啟動代理的systemd-run單元,以及遠高於一般推論流量、送往模型供應商的上傳設定警示。 - 不要把允許清單裡的
api.anthropic.com項目,當成對經過它的一切所做的信任決定。
接著,給你的代理一台這樣的機器:它們持有的金鑰只在通往 Anthropic 的路上有效,它們能連到的網路就是你列出的那些,而它們發出的每個請求都記錄在它們改不了的地方。替身和嚴格模式請見手冊的 Credentials & the Wire Boundary 一章,預設拒絕和核心哨兵請見 Sandbox Policy,追蹤紀錄請見 Tracing & Audit。