钥匙放在别人家里:OpenCode Console 密钥泄露之后,先做什么
OpenCode Console 存放的模型提供商 Key 可能外泄:Console 的预算和报表看不到被盗 Key 的直连调用,该去提供商那边吊销、查账、设上限。
钥匙这种东西,从来都是麻烦。锁越来越好,门越来越厚,可是钥匙总得放在某个地方,放在身上怕丢,放在门口的地垫下面怕人翻,交给物业代管,又得相信物业的柜子比自己的口袋牢靠。用 AI 写代码的人,如今手里也攥着一大把这样的钥匙,OpenAI 一把,Anthropic 一把,Google 一把,每一把都连着一个按调用计费的账户。钥匙本身不值钱,值钱的是它能打开的那扇门后面,那张不设上限、按月寄来的账单。
这一回出事的是 OpenCode。这是一个开源的编码 Agent,除了大家在本机上用的那个应用,它还有一个云端的 Console,用户可以把自己的模型提供商 Key 存进去,在工作区里统一调用。据 OpenCode 在 X 上的说法,10 月 16 日夜里发生了一起安全事件,与「大规模蒸馏攻击」有关,影响了 1.4% 的 OpenCode Console 用户,10 月 17 日早上已经给全部受影响者发了邮件。随后它补了一句:没收到邮件,就没受影响,受影响的是关联了外部模型提供商的那部分用户。据 AiLookout 的记录,首版帖子发在 UTC 时间 17:56,12 分钟后编辑补上了这句话。OpenCode 还说,事件仍在进行,正在和 Anthropic、OpenAI、Google 合作处理。
邮件的标题叫「Action Required: Potential provider key breach」。按 r/opencode 上流出、经安全研究员 Matt Johansen 转发的截图,邮件的大意是:发现有人未经授权访问了一个正在下线的旧系统,工作区里保存的第三方提供商 Key,比如 OpenAI、Anthropic 的,可能已经暴露,请到各家提供商的后台吊销并更换 Key,更新用到这些 Key 的应用,再检查一下近期用量。需要说明的是,这份邮件 OpenCode 并没有公开发布全文,我们看到的只是截图。
联合创始人 Dax Raad 的说法,大意是普通 OpenCode 应用里用的 Key 从来不经过公司,只有存在 Console 里的才在这次的范围之内。OpenCode 的文档也写明,在本地用 /connect 添加的 Key 存在用户自己机器上的一个配置文件里。另一边,Anthropic 的 Lydia Hallie 表示,Anthropic 已经吊销了它认为受影响的 Claude API Key。把这几句话放在一起看,事情的轮廓大致清楚了:钥匙放在自己口袋里的,这一次没事,钥匙交给了云端柜子代管的,那一部分人需要动手。
如果你只在本机用 OpenCode,从来没有往 Console 里存过 Key,按 Dax Raad 的说法,这一次的事情与你无关,不必跟着别人一起慌。慌张这种情绪传染得很快,一条新闻转上三手,就从「1.4% 的 Console 用户」变成了「用 OpenCode 的都中招了」,这种时候先分清楚自己属于哪一边,比什么都要紧。
至于其他的,目前都还不知道。谁干的,Key 是怎么被拿走的,入侵持续了多久,1.4% 具体对应多少人,那个「正在下线的旧系统」又是什么,这些都没有公开的答案。截至北京时间 10 月 19 日凌晨我再查时,OpenCode 的状态页上没有显示这起事件,GitHub 上也没有新的安全公告,官方 X 账号在 10 月 17 日那条通报之后也没有新的说明。Dax Raad 10 月 18 日在 X 上说,过去 48 小时攻击者一直没停过攻击他们的系统。我知道网上已经有很多猜测,有猜内鬼的,有猜外部团伙的,也有顺手骂开源项目不靠谱的,但在官方给出更多信息之前,我不打算往这些方向多走一步。猜测这种东西,写出来容易,收回去难,对受影响的人也没有任何用处。
真正值得多说几句的,是 techcityauthority 和 AiLookout 都指出的一个坑。Console 里的用量报表和预算,只统计经过 Console 的请求。偷到 Key 的人,完全可以绕开 Console,直接拿着 Key 去调 OpenAI 或者 Anthropic,这样的调用在 Console 里根本看不见,也不会触发工作区设好的预算,账单直接落在提供商那边。换句话说,你在 Console 里看到一切风平浪静,并不能说明什么,因为那块仪表盘本来就照不到这条路。这就像物业的监控只拍大门,有人拿着配好的钥匙从后门进出,监控录像里自然干干净净。
X 上已经有用户自述一夜之间被刷了约 1,700 美元,这是当事人自己的说法,没有经过核实,我写在这里,只是为了说明这个坑不是纸上谈兵。至于赔偿,Dax Raad 在 X 上回复用户时说,退款已经在进行,被盗刷的用户可以发邮件给他提供信息。这是他在 X 上的个人回复,不是正式公告,覆盖哪些人、怎么认定,要以 OpenCode 官方后续公布的为准。至于「蒸馏」,指的是大量调用一个强模型,再用它的输出去训练一个仿制品。我的理解是,在这类用途里,别人的 Key 就是不用自己掏钱的算力,所以账单的风险是实实在在的,这一点属于我的推断,官方并没有这样解释过攻击者的用途。
说到这里,我想给几条朴素的建议,都是通用的做法,不是 OpenCode 官方的要求,各位按自己的情况取用。第一,如果你收到了那封邮件,先去各家提供商的后台把 Key 吊销,换一把新的,再回头查近期用量,顺序不要反,更不要只在第三方平台里把 Key 删掉了事,删掉只是你看不见它了,它在提供商那边依然有效。第二,即便没收到邮件,也不妨借这个机会去提供商后台看一眼最近的用量曲线,看完心里踏实。第三,Key 按用途拆开,写代码的一把,跑脚本的一把,别让一把钥匙开所有的门,并且每一把都在提供商那一侧设好月度上限和用量告警,上限要设在发账单的那一方,而不是设在中间的某个平台上。第四,能在本地存的,就别交给云端托管,非要托管的时候,优先用权限受限的或者项目级别的 Key,丢了也只丢一个小房间。
这些建议没有一条是新鲜的,安全行业大概已经讲了很多年,只是平时大家都嫌麻烦。拆 Key 麻烦,设上限麻烦,每次换平台都要重新配一遍更麻烦,于是最省事的做法就是把一把权限最大的 Key 存进一个最方便的地方,然后忘掉它。省事本身没有错,人人都想省事,可是省掉的那一点功夫,往往会在某个半夜以账单的形式找回来。
我并不觉得这件事说明了云端托管就不能用,或者开源工具就不可信。代管钥匙这件事,本来就是在方便和风险之间做交换,交换可以做,只是要知道自己换出去的是什么。钥匙交给别人保管的那一刻,你就同时交出了一部分对它的知情权,柜子什么时候被撬,你未必第一时间知道,账单却永远第一时间寄给你。想明白这一层,该吊销的吊销,该拆分的拆分,该设上限的设上限,然后就可以继续安心写代码了。
钥匙放在自己口袋里,丢了是自己的事,放在别人家里,丢了还是自己的事,句号。
来源:OpenCode 官方 X 通报;Lydia Hallie(Anthropic);Dax Raad 关于退款的回复;OpenCode 状态页;AiLookout;techcityauthority;Notebookcheck。邮件内容出自 r/opencode 流出的截图,OpenCode 未公开全文;约 1,700 美元为 X 用户自述,未核实;退款说法来自 Dax Raad 在 X 上的个人回复,不是正式公告;事件仍在进行,以 OpenCode 官方后续说明为准;自查建议为通用做法,不是 OpenCode 官方要求。