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

金鑰就放在他們的主控台裡

10 月 16 日晚間,有人闖入 OpenCode 的一套舊系統,觸及約 1.4% 的 OpenCode Console 使用者存放在工作區中的 OpenAI、Anthropic 和 Google API 金鑰。OpenCode 稱這是一場大規模的蒸餾攻擊,使用者也回報了不是自己產生的供應商帳單。在 Bromure Agentic Coding 裡,供應商金鑰在你的 Mac 上保持加密,多供應商路由在你的 Mac 上執行,而任何離開 VM 的金鑰副本都是沒有供應商會接受的替身。

你的筆電沒事。你的 Anthropic 金鑰,是從你幾個月前親手貼進去的一台伺服器上被偷走的。

10 月 17 日星期六,OpenCode 通知部分使用者,表示已「identified unauthorized access to a legacy system」,也就是一套正在汰除的系統。入侵發生在 10 月 16 日深夜到 17 日之間。通知中寫道:「third party provider keys (eg OpenAI, Anthropic) saved in your workspace may have been exposed」。OpenCode 估計受影響的 OpenCode Console 使用者約占 1.4%,僅限於連結了外部供應商的帳號,並寄信通知了每一位。它將這起事件描述為「related to a large scale distillation attack」,並表示正與 Anthropic、OpenAI 和 Google 合作處理。OfficeChai、Startup Fortune 等媒體當天就做了報導。

OpenCode 表示無法確認這些金鑰是否已被使用,事件也仍在持續。X 上的使用者回報,只跟 OpenCode 一起用過的金鑰出現了扣款,有些金額達數百美元。大家給出的建議都一樣:到各供應商的儀表板撤銷每一把存放在 Console 裡的金鑰,簽發新的金鑰,再更新舊金鑰所在的每一個地方。

受害者並沒有執行惡意套件,也沒有開啟被下毒的儲存庫。入侵者是從他們自己貼上金鑰的伺服器上拿走了金鑰。

金鑰為什麼會在那裡

OpenCode 是一個開源的程式碼代理,能與超過 75 家模型供應商溝通。Console 是它的託管部分,你可以把自己的供應商金鑰存在工作區裡,讓這項服務代你使用。ai-tldr 的摘要形容這些是為了「for bring-your-own-key use」而存放的金鑰。這是一種便利:一個帳號、所有供應商,不必在多台筆電之間搬弄金鑰。

但它也把廠商的資料庫變成了一串鑰匙圈。每位連結供應商的使用者,都往同一個儲存庫多放進一份有效、可計費的憑證。幾個月後,一套廠商正在汰除的系統,仍然能存取這個儲存庫。

模型 API 金鑰就是支出的權限。持有它的人,可以在你撤銷之前,以供應商允許的速率用你的帳號購買推論。報導中提到的動機「蒸餾」,是指大量蒐集強大模型的回答,用來訓練一個更便宜的模型。這需要非常多的請求,而一把偷來的金鑰能讓別人替你付這筆錢。

只有一份,放在你的 Mac 上

Bromure Agentic Coding 在你 Mac 上的 Linux VM 中執行 Claude Code、Codex、Grok、Kimi 和 omp。每個模型供應商只需在 Preferences › Models 註冊一次:貼上 API 金鑰,或按下 Sign in with 供應商,就能直接使用 Claude、ChatGPT、Grok 或 Kimi 訂閱,完全不需要 API 金鑰。

金鑰存放在 App 支援資料夾中的 models.enc,以每次安裝各自的主金鑰進行 AES-GCM 加密。這把主金鑰位於 macOS 的 Data Protection Keychain,綁定 App 的簽署身分,並關閉 iCloud 同步。它永遠不會離開 Mac。Bromure 沒有讓你的金鑰存放的帳號,也沒有讓金鑰同步過去的託管工作區。

Bromure 在 Mac 上提供主控台的便利。每台機器讀取同一張面板,個別機器也可以用自己的金鑰覆寫。Codex、Grok、Kimi 和 omp 可透過在 Mac 上執行的轉譯代理伺服器連到 Bedrock、OpenRouter、xAI 和 Moonshot,真正的金鑰就保存在 Mac 上。Claude Code 則帶著替身直接連到 OpenRouter 和 z.ai。

真正的金鑰放在哪裡存放在託管主控台中的金鑰你的筆電同事其他使用者真正的金鑰廠商的工作區儲存庫sk-ant-… sk-proj-… AIza…每位已連結使用者的金鑰正在汰除的舊系統入侵者大量執行推論在撤銷之前,帳單都會寄給金鑰的主人。Bromure Agentic Coding 中的金鑰你的 Mac · models.encAES-GCM,主金鑰位於 Data Protection KeychainLinux VM · 代理的環境變數與設定ANTHROPIC_API_KEY=sk-ant-api03-brm-… (替身)Mac 上的代理伺服器檢查每個請求的去向api.anthropic.com替身 → 真正的金鑰任何其他主機451,VM 暫停沒有託管副本。VM 只持有替身。
左:存放在託管主控台中的金鑰,與其他所有使用者的金鑰共用一台伺服器,一次入侵就能觸及全部。右:在 Bromure 中,真正的金鑰只存在於你 Mac 上的一個加密檔案,以及 Mac 送給供應商的請求裡。VM 持有的一切都是替身,而替身一旦被送往其他地方,機器就會停下來。

VM 裡的一切都是替身

代理啟動時仍然需要 ANTHROPIC_API_KEY 或 OPENAI_API_KEY,它也確實拿得到。在 VM 裡,這些變數存放的是外形與真品相同的替身:Anthropic 是 sk-ant-api03-brm-…,OpenAI 是 sk-brm-…,xAI 是 xai-brm-…,Kimi 是 sk-kimi-brm-…。代理的 HTTPS 流量會經過 Mac 上的代理伺服器,它只在送往該供應商自家主機(anthropic.com、openai.com、x.ai、moonshot.ai)的請求中,才把替身換成真正的金鑰。比對方式是完全相符或子網域,絕不是子字串,所以 api.openai.com.evil.example 什麼也拿不到。

使用訂閱時也一樣,只是少了金鑰。登入在一台用完即丟的 VM 中進行,或透過代理自己的登入流程完成,代理伺服器在 Mac 上擷取 OAuth 權杖,代理則留下一個替身。主機會在存取權杖到期前約五分鐘更新它。VM 從不持有更新權杖。

現在許多工具都提議把設定同步到廠商的雲端:會「備份」設定的 CLI、把你的工作區存在帳號裡的編輯器、附儀表板的外掛。在 Bromure 機器裡,這些工具上傳的設定中放的是 sk-ant-api03-brm-…。存在別人伺服器上的替身,在那裡一文不值。沒有供應商會接受它,只有當請求經過你的 Mac、送往它所對應的供應商時,它才會變成真正的金鑰。

代理伺服器也會攔下上傳本身。它會掃描每一個外送請求的標頭與內文,找出正要送往非自家供應商的替身。把 Anthropic 替身帶到第三方伺服器的設定同步,會收到 HTTP 451。什麼都不會被轉送,VM 暫停,Mac 顯示 This environment may have been compromised,並列出權杖預覽、憑證、它所屬的主機,以及它被送往的主機。在某個工具試圖把你的金鑰複製出機器的當天,你就會知道,比任何廠商的外洩通知早上好幾個月。

隔天早上,在 Bromure 裡

假設你還是收到了那封信,因為你也在別的地方用過某把金鑰。每份指南說的都是同樣三件事:撤銷、全面替換、檢查用量。在 Bromure 中,每一步都很短。

全面替換。 真正的金鑰只放在一個地方。在 Preferences › Models 的供應商彈出視窗貼上新金鑰,你停止輸入約一秒半後,Bromure 就會更新每一台執行中的機器:替換對照表、代理的環境變數,以及它們的設定檔。憑證有變動的代理會在自己的分頁中帶著續接旗標重新啟動,對話得以延續,VM 也不會重新開機。你不必為了 VM 裡的副本去追查 .env 檔、CI 機密或同事的筆電,因為那些副本都是替身。

檢查用量。 在新機器預設的 AI request details 層級下,Mac 會把每一次與模型供應商的往來記錄為一筆 llm.request:供應商、主機、模型、狀態,以及輸入、輸出與快取的權杖數。當供應商儀表板顯示凌晨 3 點出現尖峰時,你可以拿它對照自己機器送出的內容。bromure-cli trace summary 和 bromure-cli trace hostnames 可以在終端機中提供每台機器的檢視。每一次供應商金鑰的替換,都會以 Credential brokering 列出現在 Security Timeline 中,附上遮罩後的預覽和主機,所在的表格有一欄 Workspace。供應商帳單上任何不是你機器送出的東西,都來自別人。

對團隊而言, Bromure Enterprise Manager 會按使用者、工作區和模型彙總同樣的 llm.request 計數,而不上傳提示、回應或機密。被偷的金鑰會顯示為一筆對不上任何安裝的支出。

或者乾脆不用金鑰。 對 Claude Code、Codex、Grok 和 Kimi 來說,訂閱登入能取代按用量計費的金鑰,產生的權杖留在 Mac 上,也在 Mac 上更新。這樣就沒有任何長期有效的 API 金鑰可讓第三方保存。

一份加密副本,放在你的 Mac 上

供應商金鑰和登入資訊存放在 models.enc 中,由 Data Protection Keychain 裡的主金鑰保護。Bromure 沒有任何託管工作區或帳號持有它們。

多供應商路由,在本機完成

每台機器讀取同一張 Models 面板。代理透過 Mac 上持有真正金鑰的代理伺服器連到其他供應商。

副本落在哪裡,都是替身

VM、它的設定檔,以及工具同步到雲端的一切,存放的都是替身。被送往錯誤主機的替身會收到 451,並讓機器暫停。

輪替一次,逐筆稽核

新金鑰無需重新開機就能送達每一台執行中的機器。每一次與模型的往來都會連同模型與權杖數一起記錄下來。

金鑰應該放在哪裡

你每在一個地方貼上供應商金鑰,就多一個可能被偷的地方。筆電會中竊取程式,儲存庫會被爬取,而正如這週所見,廠商會汰除仍能觸及客戶金鑰的系統。

把真正的金鑰放在 Mac 上的單一加密檔案裡,其他地方一律放替身。至於同一個問題在筆電端的版本,請閱讀竊取程式打包走的是替身和代理洩漏了自己的金鑰。