在控制台删掉那把钥匙,并不等于吊销它

OpenCode 通知了 1.4% 的 Console 用户:他们存在工作区里的模型提供方 API key 可能已经泄露。而真正的发现藏在那条补救指示里——请去 OpenAI、Anthropic 或 Google 自己的控制台吊销这把 key,因为把它从 OpenCode 里删掉吊销不了任何东西。自带 key 的集成方式,把「保管」与「吊销」拆给了两家公司;而它泄露出去的资产是按量计费的算力,其唯一权威的监控器,是别人家的账单。

作者 智能体 AI 维基 18 分钟读完

OpenCode 通知了 1.4% 的 Console 用户:他们存在工作区里的 OpenAI、Anthropic 与 Google API key 可能已经泄露——而它不得不给出的那条补救指示,才是真正的发现:请去模型提供方自己的控制台吊销这把 key,因为把它从 OpenCode 里删掉吊销不了任何东西。自带 key 的集成方式,把「保管」与「吊销」拆给了两家公司;而它泄露出去的那件资产是按量计费的算力,其唯一权威的监控器,是别人家的账单。

一眼概览

哪些已被公开确认,哪些目前仍只是报道。据报道,OpenCode 的披露发生在 2026 年 10 月 17 日,而 TechCrunch 于 10 月 19 日作了报道。

说法来源状态
1.4% 的 Console 用户受影响;每一位都收到了邮件,没收到邮件即未受影响OpenCode公司声明
攻击者攻入了 OpenCode 称正在下线的一套遗留系统OpenCode公司声明;入口途径未披露
泄露的是用户存在 Console 工作区里的第三方提供方 keyOpenCode公司声明;存储设计未披露
Anthropic 与 Google 停用了它们认为已泄露的 key媒体报道广泛报道,无提供方正式公告
OpenAI 与 OpenCode 协作恢复访问,并为攻击期间消耗的额度向 API 客户补偿OpenAI 一位高管在 X 上的发言非正式公告;退款机制未公布
一夜之间产生数百至数千美元的未授权消费受影响用户用户自述,未经核实
此事是一次「蒸馏攻击」OpenCode 的定性未公布技术证据,也没有任何入侵指标

最后三行请当作报道、而不是事实来读。下文的论证不需要它们当中的任何一条,只需要前三行,以及 OpenCode 不得不写进补救建议里的那句话。

补救指示本身就是那个发现

按顺序读一遍受影响用户收到的建议:去每家提供方替换 key、更新用到它的那些应用、检查近期用量。这一串动作里,没有任何一步是由 OpenCode 自己的产品完成的。它做不到。一把提供方 API key 是由 OpenAI、Anthropic 或 Google 签发、并由它们在每次请求时校验的持票凭证;唯一能让它失效的,是签发它的那一方。OpenCode 可以删掉自己手上的每一份副本,而那串泄露出去的字符仍会继续买走推理算力——直到有人登进另一家公司的控制台。

Custody and revocation in a bring-your-own-key integration Four rows. The first traces the key from the provider that issued it, through the customer pasting it into a vendor console, to the stored copy sitting in the legacy system that was exposed. The second row shows that deleting the saved key removes only the copy and leaves the credential valid. The third shows that revoking it in the provider's console destroys the grant and stops every copy. The fourth shows the attacker's traffic running from their own machine to the provider endpoint and onto the customer's invoice, never crossing the customer's network. How the key got out Provider issues key You paste it in Console saves a copy Legacy system read Deleting it in the console Delete the saved key The copy is gone The key still works Revoking it at the provider Revoke in provider console The grant is destroyed Every copy stops Where the attacker's traffic goes Attacker's machine Provider endpoint Your invoice No step in the bottom row passes through anything you operate, log or rate-limit.
三方在场,而那个唯一看起来像「吊销」的界面控件,根本不在吊销的路径上。

这与大多数事件响应预案所针对的那种泄露形状不同。当厂商泄露的是你的数据,厂商可以收口:下掉系统、轮换密钥、补上窟窿。而当厂商泄露的是你交给第三方的凭证,这场事件里没有任何一方具备收口能力。厂商知道 key 泄了,却杀不掉它。提供方杀得掉,却不知道它泄了。同时握着这两件事实的只有你一个,而其中第一件,你是从一封邮件里得知的。

界面只会让情况更糟而不是更好,因为那个控件就摆在那里,而它是一次空操作。断开集成、删掉工作区、移除已保存的 key——这三样在任何用过 OAuth 授权页的人看来都是「吊销」,因为在那里断开连接确实会让授权失效。而在这里,同一个手势删掉的只是一份副本。这把凭证的寿命从来就不在厂商的掌控之内,所以厂商界面上的任何按钮都缩短不了它。

谁手上握着什么

Which party can revoke, log and detect Three rows, one per party, against three capabilities. The customer can revoke at the provider but holds no usage log and learns of the exposure only by email. The agent vendor knows first but can neither revoke nor log. The model provider can revoke and holds the authoritative log but does not know the key leaked until someone tells it. No single row carries all three. Who can revoke it, who can see it, who knows can invalidate the key holds the usage log knows it leaked You yes, at the provider no only once emailed The agent vendor no no yes, first The model provider yes yes, authoritative not until told Accent is a capability the party actually holds, the lighter tint is partial, plain is absent. Every row is missing something another row has, so the incident is actionable inside nobody's own systems. An owned gateway collapses all three onto the top row, because a credential you mint is one you can invalidate.
保管、吊销与观测落在三张不同的办公桌上——这正是这场事件没有主人的原因。

那张矩阵里的每一行,都缺着别的行有的东西,而这些缺口叠起来是一个具体的运维失效。提供方吊销得了,但在有人告诉它之前没有理由动手。厂商知道,却只能请求。你动得了手,手上却没有那份日志。没有任何一方能在自己的系统内部把这场事件处置完——而这恰恰就是一次没人设计过的职责分离的定义。

被偷走的资产是钱,而它的监控器是一张账单

一把被偷走的提供方 key 不寻常的地方,不在于它是怎么被存的,而在于它能兑换成什么。一行泄露的数据库记录得先被卖掉、被关联、或被再次利用,才会让谁付出代价。而一把泄露的提供方 key 本身就有流动性:它从第一个请求起,就按公开价目买走 GPU 时间,账记在你头上。

这就改变了检测该住在哪里。攻击者的请求从不碰你的基础设施——它们从那台机器直奔提供方的端点。你的网关什么也不记。你的 SIEM 什么也看不见。你的限流器不在路径上。这场滥用的权威记录是提供方的用量看板,而权威的告警是一道计费阈值——在多数组织里,这恰恰是那个由财务部门按月查看、而不是由值班工程师持续盯着的信号。那些及时发现的用户之所以发现,是因为一夜之间的一笔消费大到足以触发提供方的一封邮件。

把价格算清楚:一把长期有效、没有封顶的提供方 key,等于一张开给「谁拿着这串字符谁就是额度主」的无上限信用额度。这就是该写下来的影响半径;而这里被报道的那些数字——一夜之间每把 key 数百到数千美元——是下限而不是上限,因为它们描述的是一个随手花钱的攻击者。一个对着没有上限的 key 刻意花钱的攻击者,其边界只由提供方自己的限流与风控启发式决定,而这两样都不是你配置的。

这里有两项消费控制比任何轮换卫生都值钱,因为它们在你知情之前就把损失圈住了:一道按你真实预期用量、而不是按「留点余地」设定的单 key 月度硬上限;以及每个集成一把独立的 key,好让上限可被归因。一把带 50 美元上限的 key 泄露,是一份事件报告。同一把 key 不设上限,则是一场与提供方计费团队的谈判。

「蒸馏攻击」是一个动机,不是一个指标

OpenCode 把这次事件定性为蒸馏攻击——偷 key 以从前沿模型上生成训练数据。它可能是对的。但截至本文撰写时,它没有公布任何把泄露凭证与蒸馏活动联系起来的技术证据,也完全没有公布入侵指标:没有入口途径、没有 key 的存储方式、没有攻击者流量长什么样。

动机不可操作,指标可操作。如果这场行动被按请求形状描述出来——哪个模型、什么采样参数、什么提示词分布、多大并发——那么本周之内,所有其他替客户保管 key 的厂商都能去翻一遍,提供方也能。而点名动机做到了一件指标做不到的事:它把故事从「一家公司把持票凭证存在一套遗留系统里」挪到了「一家公司被精密的对手盯上了」。两者可以都为真。但只有一个能产出检测规则。

这也是智能体工具事件报告里普遍该留意的模式。有用的问题不是「谁、为什么」,而是「同行明天能 grep 什么」。按这个尺度衡量,这次披露目前仍是一则通知、而不是一份报告——而这很要紧,因为厂商是唯一能产出那份报告的一方。

该改成怎么建

设计规则直接从那张矩阵里掉出来:绝不要把一把长期有效的提供方 key 交给第三方的网页工作区,因为这么做转移了保管权、却没有转移吊销能力。今天有三条替代路线,按工作量与收益递增排列。

做法谁能吊销代价是什么
每个集成一把专用 key,设硬性消费上限,按日历轮换仍然只有提供方,但损失被圈住、且可归因key 数量泛滥;一套你真得去跑的轮换流程
在提供方提供的场合,改用委托授权(OAuth 式)你,按客户端,在提供方自己的控制台里只在提供方对那款工具支持它时才可用
自建 AI 网关,由它持有真正的 key,再签发一把你自己造的 key 给厂商你,即刻,且不必去碰提供方多一个要运维的服务,而且它进了延迟路径

三条里只有网关真正修好了那道裂缝,而原因是结构性的、而不是什么巧思:它让你成为签发方。一把你自己造出来的凭证,就是一把你自己能作废的凭证——这就把保管、吊销与观测重新收拢回同一张办公桌上,也就是你的。它还把消费计量表放到了一个你本来就会被传呼的地方,而这正是这场事件里任何轮换都解决不了的那一半。

如果运维一个网关对你的团队并不相称,那么诚实的退路是认真对待第一行:每款工具一把 key、一道会让人不太舒服而不是宽宽松松的上限,以及一份清醒认知——每一把这样的 key,都是一份你收不回来的副本。这不是一个强势的位置。这就是「自带 key」把你放到的那个位置;而这次事件的价值,在于它被一封补救邮件说出了声。

常见问题

在厂商控制台里删掉一把 API key,等于吊销它吗?

不等于。那只删掉了厂商存的那份副本。凭证依然有效,直到在签发它的提供方自己的控制台里被吊销——OpenAI、Anthropic 或 Google 的控制台。这正是受影响的 OpenCode 用户收到的那条具体指示,而它适用于每一种自带 key 的集成。

我怎么知道一把泄露的 key 有没有被用过?

看提供方的用量看板,而不是你自己的日志。攻击者的请求直奔提供方端点,从不穿过你的基础设施,所以你运维的任何东西都不在路径上。按 key、按天去查用量,对照你预期的模式;一个陌生的模型、一个陌生的时段、或一个陌生的并发量级,就是信号。

消费上限能替代轮换 key 吗?

不能,但它是那个在你睡着时仍然奏效的控制。轮换结束的是一次你已经知道的暴露;上限圈住的是一次你还不知道的。两样都要设,并且把上限按真实用量去定,而不是留下一截你不会察觉它被吃掉的余地。

这是针对智能体本身的一次供应链攻击吗?

按已披露的描述不是。OpenCode 称攻击者攻入了一套遗留系统,读取了用户存在 Console 工作区里的 key,这属于网页产品中的静态凭证暴露,而不是对智能体、其模型或其分发包的侵入。相关的类别是凭证究竟如何送达智能体,而不是供应链完整性。

开发者是不是该彻底不要在智能体工具里保存 key?

只要存在委托授权这个选项,就改用它。不存在时,站得住脚的版本是:一把只为那一款工具签发的 key、设好上限、并记录在一份你会定期复查的清单里——因为你同意的那件事,是一串你收不回来的字符从此存在于别人的磁盘上。

延伸阅读

本站相关:

来源: