金鑰的家太多了
Wiz 統計,10 月至少有九個 AI 開發平台揭露遭到入侵,多數可追溯到憑證存取,攻擊者鎖定的是存放 AI 金鑰的已儲存環境變數。最新的一家 Northflank 在 10 月 30 日告訴客戶,要假設每個環境變數都已被解密,使用者也回報自己的 AI 金鑰在幾小時內就被拿去使用。在 Bromure Agentic Coding 裡,代理寫程式用的金鑰只放在你 Mac 上的一個地方,代理無法把它複製到任何平台,輪替只需要貼上一次。
你把 AI 金鑰貼進哪個平台,那個平台就留著一份副本。10 月,攻擊者在九個平台上衝著這些副本而來,Wiz 看到被偷的金鑰在 30 分鐘內就被拿去測試。
10 月 30 日 11:43 UTC,Wiz 通知 Northflank 遭到入侵。Northflank 是一個用來部署應用程式、資料庫與 AI 工作負載的雲端平台。大約兩小時後,Northflank 的狀態頁告訴所有客戶:「Assume all environment variables have been decrypted. Disable/rotate all keys.」(請假設所有環境變數都已被解密,停用或輪替所有金鑰。)15:12 它補充:「Multiple users are confirming that their AI keys have been used.」(多位使用者證實他們的 AI 金鑰已被使用。)當天最後一次更新在 23:38:「Users have reported unauthorised use of AI API keys supplied to the Northflank platform.」(使用者回報,提供給 Northflank 平台的 AI API 金鑰遭到未經授權的使用。)BleepingComputer 報導,Northflank 並未說明攻擊者如何入侵,也沒說有多少客戶受影響。
Northflank 不是第一個。同一天,Wiz 研究員 Benjamin Read 與 Rami McCarthy 發表了 Black October for AI Developer Platforms,統計出本月至少有九個 AI 開發平台揭露了資安事件。「換作其他任何一個月,這都會是頭號資安新聞。」他們寫道。
一個月,九個平台
Wiz 的清單,依時間排列:
| 日期 | 平台 | 揭露內容 |
|---|---|---|
| 10/6 | Fireworks AI | 憑證存取;有「代理蜂群」攻擊的跡象 |
| 10/9 | Andromeda | 屬於一場「全產業攻擊」 |
| 10/14 | Zeabur | 憑證存取;公司將停止營運 |
| 10/15 | Lightning AI | 憑證存取 |
| 10/16–17 | OpenCode | 一套「舊系統」;儲存的供應商金鑰外洩 |
| 10/20 | Railway | 「我們的建置基礎設施遭權限提升」 |
| 10/23 | Warp | 第三方廠商;代理追蹤紀錄被取走 |
| 10/28 | CommandCode | 歸因於蒸餾 |
| 10/30 | Northflank | 環境變數視為已被解密 |
Wiz 沒有找到九起事件共同的單一漏洞或相依套件。它們共有的是目標。多數事件可追溯到憑證存取,攻擊者專找已儲存的環境變數,「尤其是那些能存取 AI 的」。OpenCode 與 CommandCode 歸咎於蒸餾,也就是用偷來的前沿模型存取權去訓練更便宜的模型。其餘的需求,Wiz 則連結到它稱為 LLMJacking 的轉售市場:被偷的金鑰被當成打折的模型存取權出售。
三十分鐘內測試,以百萬次轉售
Wiz 也追蹤了兩組被盜、用於 Amazon Bedrock 的企業憑證後來的下場。Wiz 無法把任何一起案例連結到特定平台的入侵,但這個模式說明了 AI 金鑰為何值得獵取:
- 在通報的憑證存取發生後 30 分鐘內,一次來自住宅 IP 的
InvokeModel呼叫測試了這些金鑰。它要求 Claude Fable 5.1,失敗後改用 Opus 5.5,成功了。 - 接著一個小型 Go 用戶端每天檢查金鑰 14 到 120 次,確認它們仍然可用。
- 一支
boto3指令碼列舉了 Bedrock 與 EC2 的配額。同一支指令碼,連版本字串都一樣,出現在兩起案例中。 - 然後才是大量流量。案例 A 在約 30 小時內發出約 80 萬次 Bedrock 呼叫,約 90% 成功。案例 B 在約 13 小時內發出約 170 萬次呼叫,超過一百萬次成功。
Wiz 估計,以牌價計算,這兩起案例「很可能累積了超過 10 萬美元的用量」。token 模式看起來像轉售的編碼代理流量:使用提示快取,一個轉售商背後有許多終端使用者。Wiz 把接觸過這些金鑰的基礎設施連結到 LLM 轉售網站,其中一個接受 USDT 付款。
被偷的 AI 金鑰就是流向這個市場:一群人用別人的帳單跑編碼代理。
一把金鑰如何落到九個地方
一位開發者拿到一把 Anthropic 金鑰,開始使用。它先進了編碼代理,再進了預覽部署好讓應用程式的 AI 功能能用,再進了跑評估的 CI 工作,再進了一個筆記本服務來試微調。每次貼上只要三十秒,就能讓某樣東西動起來。你再也不會回頭看任何一處。
編碼代理讓這件事變得更快。叫它「把這個部署到 Northflank」或「設定 Railway 服務」,它就會做開發者會做的事:從環境讀取 ANTHROPIC_API_KEY,再把它當成服務變數交給平台的 CLI。部署成功了。金鑰現在又多住進一個平台,就在資料庫密碼旁邊,而且沒有任何人親手輸入過它。
接著某個平台被入侵,建議每次都一樣。Northflank 的是「Revoke existing credentials with their issuing providers, generate replacements」(向核發者撤銷現有憑證,產生替代憑證)。要做到這點,你得先記得那把金鑰去過的每一個地方。
同一個月的 Bromure Agentic Coding
Bromure Agentic Coding 在你 Mac 上的 Ubuntu VM 裡執行 Claude Code、Codex、Grok、Kimi 與 omp,每台機器一個 VM。代理、它的儲存庫以及它執行的每個指令都在 VM 裡。真正的憑證,以及 VM 所有流量都要經過的代理伺服器,則留在 Mac 上。
金鑰只住在一個地方
模型金鑰只在 Preferences › Models 輸入一次。Bromure 把它們存在 models.enc,以 AES-GCM 加密,主金鑰放在 Mac 的 Data Protection Keychain 裡,並關閉 iCloud 同步。這個 app 不會把任何憑證、token 儲存或金鑰資料上傳、同步或備份到任何地方。Bromure 沒有經營任何儲存供應商金鑰的主控台,所以攻擊者在我們這邊找不到可以入侵的東西。
在每個 VM 裡,ANTHROPIC_API_KEY 存的是一個以 sk-ant-api03-brm- 開頭的替身。Claude Code 接受它,因為格式正確。代理呼叫 api.anthropic.com 時,請求經由你 Mac 上的代理伺服器離開 VM,代理伺服器換上真正的金鑰後再轉送。代理伺服器只為供應商自己的主機加上金鑰,其他一律不加:Anthropic 金鑰對應 anthropic.com,OpenAI 金鑰對應 openai.com,以此類推。
如果你改用 Claude、ChatGPT、Grok 或 Kimi 訂閱登入,OAuth token 留在 Mac 上,也由 Mac 負責更新。VM 從不持有 refresh token。
代理無法把它散播出去
現在重演那次部署。代理執行平台的 CLI,用環境裡的值在服務上設定 ANTHROPIC_API_KEY。那個值是替身,而攜帶它的請求送往平台的 API。
Bromure 的代理伺服器會檢查每個外送請求的標頭與內文,找出被送往非其核發對象主機的替身。一個出現在部署平台 API 請求裡的 Anthropic 金鑰替身就是其中之一。代理伺服器在任何一個位元組抵達平台之前,就以 HTTP 451 擋下請求、暫停 VM,並顯示 This environment may have been compromised,列出憑證名稱、它所屬的主機,以及它被送往的主機。
我們打造這個警示是為了對付竊取金鑰的惡意程式,而它對一個想幫忙的代理也同樣會觸發。你寫程式用的金鑰不會在你沒看到的情況下被複製到部署平台。如果這份副本正是你要的,Allow 會在這次工作階段剩下的時間裡把它送往該主機。更好的做法是替正式環境服務另外核發一把只限正式環境使用的金鑰,讓代理寫程式用的金鑰留在你的 Mac 上。
代理也會把機密往反方向拉。railway variables 或平台的 env pull 可能會把正式環境的 .env 連同真實值一起放進儲存庫。在機器的 Guardrails 裡開啟 Only allow credentials Bromure injects,任何攜帶非 Bromure 放入之憑證的請求都會被擋下,並觸發同樣的警示。代理從平台下載的真實金鑰就只能閒置在 VM 裡。
沒有金鑰可偷的 Bedrock
Wiz 追蹤的兩起下游案例,都是用長期有效的企業憑證在 Amazon Bedrock 上執行。在 Bromure 裡,任何代理都能在 Bedrock 上執行,Claude Code 原生支援,其他則透過 Bedrock 的 OpenAI 相容 API,而且都完全不需要 Bedrock 金鑰。把 Bedrock API key 欄位留空,Mac 就會用該機器的 AWS 憑證替每個請求簽章。
這些憑證可以是臨時的。在機器的 AWS 憑證中選擇 SSO / Identity Center,Mac 就會從你的 SSO 快取取得短期角色憑證,並在到期前約五分鐘更新。VM 拿到的是一把假的秘密金鑰,它產生的簽章會被 AWS 拒絕;Mac 會移除這些簽章並重新簽署。任何地方都沒有環境變數存放長期的 Bedrock 憑證,等著被人解密。
輪替只要貼上一次
當平台要你輪替時,你的代理所用的金鑰就只是一個欄位。在 Preferences › Models 貼上新金鑰,Bromure 會在你停止輸入約一秒半後,把它套用到每一台使用它的執行中機器。憑證有變動的代理會帶著續接旗標重新啟動,所以對話會接續下去。VM 不會重新開機,裡面也沒有任何東西需要修改,因為裡面從來沒有東西持有舊金鑰。
如果你的金鑰放在 1Password,機器的其他 API 金鑰可以用 op:// 參照來取代實際值。Bromure 在 Mac 上解析它們,並每兩分鐘重新解析一次,所以在 1Password 輪替項目後,幾分鐘內就會傳到執行中的機器,無需重新開機。
你自己的每次使用紀錄
Northflank 的另一個建議,是檢查供應商的用量與帳單紀錄,看有沒有不是你發起的活動。在 Bromure 裡,每次替換都是你 Mac 上 Security Timeline 中 Credential brokering 底下的一列,附有遮罩過的金鑰預覽與主機,例如 sk-a…f9q3 → api.anthropic.com。AWS 簽章,包括 Bedrock,會以 Credential used 列出現,附有遮罩過的存取金鑰。當供應商的儀表板出現暴增時,你能看出哪些呼叫來自你自己的機器。
在註冊到 Bromure Enterprise Manager 的 Mac 上,同樣的替換會以 credential.token_swap 事件串流到你的組織,只帶預覽,絕不帶金鑰本身。要回答「我們有沒有金鑰在別的地方被使用?」的管理員,手上就有整個機群合法使用的那一側紀錄。
一份副本,在 Mac 上
模型金鑰存在 models.enc,以 Keychain 金鑰加密,從不同步或上傳。沒有任何廠商主控台持有它們。
VM 裡是替身
代理的 ANTHROPIC_API_KEY 是替身。真正的金鑰在 Mac 上加入,只給供應商自己的主機。
不會意外複製
送往部署平台的替身會被 451 擋下,VM 暫停,警示會指出目的地。
嚴格憑證
開啟嚴格模式後,代理從平台 env 檔拉下來的真實金鑰,一使用就會被擋下。
用 SSO 跑 Bedrock
Mac 以短期的 Identity Center 憑證替 Bedrock 呼叫簽章。沒有長期金鑰可存放或竊取。
貼上一次就輪替
在 Preferences › Models 輸入的新金鑰,幾秒內就會傳到每個執行中的代理。VM 不會重新開機。
數數你的副本
Wiz 還不知道九起事件背後是否是同一個團體,而多數平台也尚未公布根本原因。每個儲存你 AI 金鑰的平台都可能弄丟它,而 10 月證明了,竊賊如今已有買家在等著。
代理寫程式用的金鑰,正是你最不希望出現在那份清單上的那一把。它能用你最好的模型和最高的額度,而且你的代理整天都在用。在 Bromure Agentic Coding 裡,它留在你的 Mac 上。代理拿到的是替身,其他任何平台都用不了。
關於 OpenCode 主控台遭入侵,也就是 10 月九起事件之一,請閱讀金鑰就放在他們的主控台裡。關於 Warp 被偷走的代理追蹤紀錄,請閱讀代理的紀錄存在他們的雲端。