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

竊取程式打包走的是替身

10 月 15 日,Symantec 報告指出,今年才首次出現的資訊竊取程式 Aoki,現在會鎖定程式碼代理的憑證:.claude.json、Codex 的 config.toml 和 .env 檔,GitHub Copilot、Cursor、Gemini、JetBrains AI Assistant 和 Kiro 的權杖,以及 AWS 金鑰。在 Bromure Agentic Coding 裡,這些檔案裝的全是替身,登入資訊和金鑰在 Mac 上保持加密,而送往竊取程式伺服器的替身會讓機器暫停。

竊取程式的清單,現在第一項就是你的程式碼代理。它要的是 .claude.json、Codex 的設定,以及旁邊的 .env 檔。

資訊竊取程式過去鎖定的是瀏覽器 Cookie、儲存的密碼、加密貨幣錢包和 Discord 權杖。Aoki 依然全都要。最近的版本還會去找你的程式碼代理放在家目錄裡的檔案。

Symantec 的 Threat Hunter Team 在 10 月 15 日星期三發表的 Aoki: Infostealer Targets AI Coding Assistant Credentials 中描述了這個變化,Infosecurity Magazine 當天也做了報導。Aoki 又因其解密程序中的一個字串而被稱為 Aokigahara,今年稍早才首次出現。Symantec 寫道:「這個惡意程式的早期版本並不鎖定與 AI 相關的檔案。」最新的樣本則會。

Aoki 拿走什麼

Symantec 列出了最新樣本鎖定的代理相關檔案:

  • .claude.json 和 Claude 桌面版的 Cookie。
  • ChatGPT 的 Cookie。
  • Codex 的 config.toml 和 .env 檔。
  • Cursor 的本機狀態資料庫,它「可能快取對話脈絡和程式碼片段」。
  • GitHub Copilot、Cursor、Google Gemini、JetBrains AI Assistant 和 Kiro 的權杖。
  • AWS 憑證。

清單的其餘部分是資訊竊取程式的老套戰利品:四十多種瀏覽器、約九十個錢包擴充功能、桌面錢包、密碼管理器、Telegram、Discord,以及 FTP 和 VPN 用戶端。Aoki 還會搜尋檔名含有 secret、privatekey、keystore、mnemonic、passphrase 或 backup 的任何檔案。Symantec 指出:「這個惡意程式沒有後門指令清單。」它收集找到的東西,再 POST 到其命令與控制伺服器上的 /gate 端點。

Symantec 解釋了代理檔案為何值得費工夫:「和信用卡資料一樣,偷來的 AI 金鑰可以直接變現。」買家用你的帳號大量消耗用量,也就是所謂的 LLMjacking。同樣的權杖「可能讓攻擊者以合法使用者的身分進行活動」,並觸及該帳號連結的程式碼庫、雲端帳號和 CI/CD 管線。

Symantec 沒有說明 Aoki 如何進入一台機器。在裝了程式碼代理的開發者筆電上,最明顯的入口是套件。代理每天自行安裝幾十個套件,而帶有 postinstall 指令碼的惡意相依套件,會在 npm install 結束的那一刻以代理的權限執行。

同一份清單,在 Bromure 機器裡

在 Bromure Agentic Coding 裡,代理在你 Mac 上的一台 Linux VM 中執行。真正的憑證從不進入那台 VM。Mac 把它們存放在加密保險庫,並在 VM 裡寫入形狀和真品一樣的替身,讓每個工具都照單全收。Mac 上的代理伺服器在線路上把每個替身換成真正的值,而且只對送往該憑證所屬主機的請求這麼做。

把一個帶著 Aoki 清單的竊取程式放進那台 VM,陪它把清單逐項走一遍。

.claude.json 和 Claude 金鑰

VM 裡的 Claude Code 使用的是替身金鑰 sk-ant-api03-brm-…。如果你用 Claude 訂閱登入,OAuth 權杖會在登入時於 Mac 上被擷取,加密後存進 claude-subscription.enc。主機會在存取權杖到期前約五分鐘更新它,並注入送往 Anthropic 的請求。VM 從不持有重新整理權杖,所以不論 .claude.json 還是家目錄裡的其他任何地方,都沒有竊取程式能拿走的有效 Claude 憑證。

Codex 的 config.toml、auth.json 和 .env

Codex 會拿到一份預先填好的 ~/.codex/auth.json,裡面是一個到期日遠在未來的假 JWT,讓用戶端不會嘗試更新它。真正的 ChatGPT 登入資訊放在 Mac 上的 codex-subscription.enc。OpenAI API 金鑰在 VM 裡顯示為 sk-brm-…。

在機器的 Credentials 面板用 Import env file… 匯入的專案 .env,會以相同的變數名稱回來,每個值都是一個 brm_… 替身,只限用於你選擇的主機。你的程式碼照常讀取 STRIPE_KEY,竊取程式讀到的是 brm_…。

GitHub、AWS 和 SSH

~/.git-credentials 和 GH_TOKEN 裝的是一個 ghp_ 替身,和真品一樣 40 個字元。沒有 ~/.aws/credentials。~/.aws/config 指向一個 credential_process 輔助程式,它把真正的存取金鑰 ID 搭配一把 40 個字元的假秘密金鑰交給 AWS SDK,而 Mac 會在每個請求前往 AWS 的途中重新簽章。複製輔助程式輸出的竊取程式,拿到的秘密金鑰只會產生 InvalidSignatureException。

以關鍵字搜尋 privatekey 或 id_ed25519 什麼也找不到。VM 裡的 SSH_AUTH_SOCK 是通往 Mac 上簽章代理程式的橋接,私鑰的位元組從不跨越它。

Cookie

Aoki 想要 Claude 桌面版和 ChatGPT 的 Cookie。機器的 VM 裡沒有桌面 App,也沒有可讀取的瀏覽器設定檔。當你為 Bromure 登入 Claude 或 ChatGPT 時,登入頁面在你 Mac 的瀏覽器中開啟,權杖則落入保險庫。代理用來瀏覽網頁的 Chromium 跑在它自己的一次性附屬 VM 裡,與機器的 VM 分開,所以代理 VM 裡的竊取程式碰不到瀏覽器的設定檔。

竊取程式的清單,在 Bromure 機器裡代理的 VM竊取程式開啟的檔案找到的東西~/.claude.json, ANTHROPIC_API_KEYsk-ant-api03-brm-… (替身)~/.codex/auth.json, config.toml假 JWT、sk-brm-…專案 .envSTRIPE_KEY=brm_…~/.git-credentials, GH_TOKENghp_… (替身)AWS 憑證真的金鑰 ID + 假的秘密金鑰~/.ssh/id_*沒有金鑰檔(簽章橋接)Mac,在 VM 之外加密保險庫(AES-GCM)主金鑰存於 Data ProtectionKeychain,不同步到 iCloudclaude-subscription.enccodex-subscription.encmodels.enc工作區機密、SSH 金鑰重新整理權杖留在這裡。代理伺服器只在送往所屬主機時才換入真正的值。POST https://dobeqnesmot.cc/gate內文:sk-ant-api03-brm-…, ghp_…, brm_…Mac 代理伺服器:替身送往錯誤的主機451,未轉送,VM 已暫停
在 Bromure 機器裡跑一遍 Aoki 的清單。清單上的每個檔案都存在,裝的都是替身。竊取程式把戰利品送往 /gate 時,Mac 上的代理伺服器發現替身正送往一台它們從未簽發給的主機,於是回應 451 並暫停 VM。

上傳到 /gate

Aoki 最後會把戰利品 POST 到 /gate。Symantec 點名了 dobeqnesmot[.]cc、hjazfioe[.]surf 和 neihite[.]cc。在 Bromure 機器裡,這個請求必須經過 Mac 上的代理伺服器才能出去,因為代理伺服器是 VM 通往網路的唯一路徑。

代理伺服器會掃描每一個外送請求的標頭和內文,找出正送往其簽發主機以外任何地方的替身。sk-ant-api03-brm-… 只有一個合法的目的地家族:Anthropic。ghp_ 替身屬於 GitHub。它們出現在送往 .cc 網域的 POST 裡,只可能代表資料外洩。代理伺服器回應 HTTP 451,什麼都不轉送。VM 當場暫停,Mac 顯示 This environment may have been compromised,每個外洩的替身一行:權杖預覽、憑證名稱、它所屬的主機,以及竊取程式試圖送往的主機。

接下來怎麼做由你決定。Save for Investigation 會把 VM 的磁碟、家目錄和共享資料夾匯出到你挑選的資料夾,然後關閉機器。Shut down 會停止它並標記為已遭入侵。已遭入侵的機器要先執行 Wipe and Launch 才能再次開機,它會替換磁碟和家目錄,並保留你的權杖、SSH 金鑰和設定。你的 Claude 登入、GitHub 權杖和 AWS 金鑰從未進入 VM,所以竊取程式沒有複製到任何需要輪替的東西。

你也可以在掃描之前就擋下上傳。在機器的 Guardrails 面板中,於 Outbound connections 下把 Unmatched traffic 設為 Deny,再列出機器需要的主機。這樣一來,連往陌生 .cc 網域的連線會被拒絕,Security Timeline 也會為它顯示一列紅色的 Firewall。

就算竊取程式把戰利品包裝到掃描讀不出替身,另一端的伺服器收到的仍是在任何地方都無法驗證的值。替身只有在前往其簽發主機的途中經過你 Mac 的代理伺服器時才有作用。

在竊取程式執行之前

進入代理 VM 最可能的途徑,是代理自己安裝的套件。機器的 Supply Chain 面板會在 VM 看到之前,先在 Mac 上檢查每一次下載:

  • 發布時間門檻預設開啟,最短兩天,會隱藏比門檻更新的套件版本。被劫持後幾小時內就被撤下的版本,永遠到不了 npm install。
  • 移除安裝指令碼在你開啟後,會從傳輸中的每個 npm tarball 移除 preinstall、install、postinstall 和 prepare 掛鉤,這正是 npm 惡意程式在安裝時執行的慣用手法。
  • OSV、socket.dev 或 Depi 會封鎖有已知安全公告的版本,以及被標記為惡意程式或仿冒名稱(typosquat)的套件,回應 451,並由套件管理工具原文印出原因。

每一次下載都會出現在 Security Timeline,所以事件過後,你能找出是哪個套件把竊取程式帶進來的。

如果竊取程式在 Mac 上執行

Aoki 的檔案清單也說明了竊取程式在 Mac 本身會找到什麼,而安裝 Bromure 不會在那份清單上多添任何東西。Bromure 不會匯入你 Mac 上 Claude 或 Codex CLI 的登入資訊,也不需要它們:代理在 VM 裡執行,它們的登入資訊存放在保險庫。~/Library/Application Support/BromureAC/ 底下凡是含有機密的東西,都是 AES-GCM 密文。主金鑰存放在 Data Protection Keychain,綁定 Bromure 的簽署身分,而且從不同步。複製那個資料夾的竊取程式,拿到的只是加密的二進位資料。

Symantec 特別點出 Cursor 的本機資料庫,因為它會快取對話脈絡和程式碼。Bromure 對代理行為的紀錄,也就是工作階段追蹤,以同一把保險庫金鑰做靜態加密,權杖替換只以首尾字元的預覽記錄。無論加密與否,追蹤紀錄裡都不會出現真正的機密。

清單上的每個檔案都是替身

.claude.json、Codex 的 auth.json 和 config.toml、匯入的 .env 值、git 憑證和 AWS 設定,裝的全是替身。重新整理權杖和 SSH 私鑰從不進入 VM。

上傳就讓機器停下

代理伺服器發現替身正送往不屬於它們的主機,便回應 451、暫停 VM,並逐一列出外洩的憑證。

沒有東西需要輪替

Wipe and Launch 替換磁碟和家目錄,並保留你的金鑰。竊取程式拿走的值,只有經過你 Mac 的代理伺服器才有作用。

大門有人看守

發布時間門檻、移除安裝指令碼和信譽檢查,都在套件抵達 VM 之前於 Mac 上執行,每一次下載都有紀錄。

清單只會越來越長

Symantec 說 Aoki 的功能「看來仍在積極開發中」,其他竊取程式也會照抄它的清單。Aoki 加入代理檔案,是因為偷來的代理金鑰和登入資訊賣得出去。把你的代理放在 Bromure 機器裡執行,買家拿到的就只是一包替身,出了你 Mac 的代理伺服器,沒有任何伺服器會接受。

同一個問題的日常版本,也就是代理自己把機密複製進對話紀錄,請閱讀權杖留在了對話紀錄裡。至於一個從遭入侵的 npm 套件出發、鎖定同一批檔案的蠕蟲,請閱讀撤銷權杖,就是引爆點。