← 返回所有文章
发布于 · 作者 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 密钥。

密钥保存在应用支持文件夹中的 models.enc,用每次安装各自的主密钥进行 AES-GCM 加密。这个主密钥位于 macOS 的 Data Protection Keychain,绑定应用的签名身份,并关闭了 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:服务商、主机、模型、状态,以及输入、输出和缓存的 token 数。当服务商控制面板显示凌晨 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,并让机器暂停。

轮换一次,逐条审计

新密钥无需重启就能送达每一台运行中的机器。每一次与模型的交互都会连同模型和 token 数一起记录下来。

密钥应该放在哪里

你每在一个地方粘贴服务商密钥,就多一个可能被偷的地方。笔记本电脑会中窃密木马,仓库会被爬取,而正如这周所见,厂商会下线仍能触及客户密钥的系统。

把真正的密钥放在 Mac 上的单一加密文件里,其他地方一律放替身。至于同一个问题在笔记本电脑端的版本,请阅读窃密木马打包带走的是替身和那个泄露了自己密钥的代理。