OpenCode密钥泄露:1.4%背后,API密钥安全警钟

OpenCode承认1.4%用户API密钥可能泄露,暴露退役系统风险与响应矛盾。
OpenCode(Anomaly Innovations旗下开源编码代理)向部分Console用户发送邮件,承认存储在托管工作区中的OpenAI、Anthropic和Google API密钥可能因遗留系统被入侵而泄露,并将事件定性为“大规模蒸馏攻击”。受影响用户占Console用户的1.4%,但公司未公布总数,无法换算具体人数。入侵发现于10月17日凌晨,通知在约22小时后发出,期间密钥处于暴露状态。泄露源于正在退役的遗留控制台,CLI本地添加的密钥不受影响。Anthropic已撤销受影响密钥,但无提供商承诺退款。事件响应中,前沿模型因安全过滤器拒绝分析攻击样本,迫使团队中途切换工具。文章总结三条教训:存储的提供商密钥是bearer工具,应按现金标准审计;退役是攻击面,关停清单必须包含凭证轮换;没有分母的百分比是麻醉剂,用户应自行撤销并验证密钥失效。
OpenCode,这个由Anomaly Innovations打造的开源编码代理,最近向部分Console用户发送了一封标题为“Action Required: Potential provider key breach”的邮件,承认他们存储的API密钥可能已经泄露——不是OpenCode自己的密钥,而是用户保存在托管工作区里的OpenAI、Anthropic和Google密钥。公司称问题出在一个正在退役的遗留系统上,并将此次入侵定性为“大规模蒸馏攻击”,说白了,就是攻击者想白嫖前沿模型的推理能力。

事件确认了什么,没确认什么
综合多方报道以及可自行验证的信息,目前能确认的事实有这些:入侵在10月17日周六凌晨被发现,受影响用户通过邮件得知;OpenCode将影响范围框定为“OpenCode Console用户的1.4%”,特指那些关联了外部提供商的子集。但公司从未公布Console用户总数,所以1.4%无法换算成具体人数——任何给出确切人数的说法,都是在凭空捏造分母。
泄露的系统是一个正在退役的遗留控制台。公司表示调查未发现其他数据暴露,并正与Anthropic、OpenAI和Google合作处理。Anthropic据报道已撤销受影响的Claude密钥。通过CLI的/connect流程在本地添加的密钥不在此次事件范围内,影响半径仅限于托管Console工作区。
我做了两项桌面检查:GitHub仓库anomalyco/opencode截至今日有216,534颗星和28,989个fork,公司宣称的“每月1600万开发者”使其成为迄今用户基数最大的编码代理凭证事件。而截至当晚,公开网络资产上依然没有安全公告——我抓取了opencode.ai和opencode.ai/docs并搜索,没有任何“breach”或“security”字样。通知仅通过邮件发送给已识别的账户,如果你不在名单上,只能通过类似本文的报道了解此事。
蒸馏攻击(distillation attack) 是指攻击者通过大量调用前沿模型(如GPT-4、Claude、Gemini),收集其输入输出对,用以训练自己的小模型,从而“蒸馏”出大模型的能力。这种攻击并不窃取模型权重,而是窃取推理行为,成本极低且难以追溯。对于API提供商而言,蒸馏攻击表现为异常高的调用量和多样化的提示词;对于密钥持有者,则意味着账单激增。OpenCode将此次入侵定性为蒸馏攻击,暗示攻击者主要目的是无偿获取模型推理能力,而非直接盗取资金或数据。
时间线才是最令人不安的部分
开发者社区流传的小时级重建(由用户而非公司完成)显示,最早可识别的暴露时间约为10月17日00:30 UTC,而第一封通知邮件发出在约22:51 UTC——间隔约22小时。具体分钟数应视为“据报道”而非“已确认”,但即便按公司自己的说法(“昨晚入侵”、“今早发邮件”、“周六下午公开声明”),也描述了一整天里密钥处于活跃、暴露状态,而且如果蒸馏攻击的定性准确,这正是入侵者想要的东西。
用户比任何声明都更早察觉。17日晚间开始出现未经授权的提供商使用报告;公开帖子中的金额数字彼此矛盾——有说约100美元的,也有清单列出个别账户449美元、700多美元和1700美元的——且没有提供商公开承诺退还欺诈使用费用。这种分歧本身就是数据点:一天之后,没有权威的损失数字,只有自报数据。
响应侧有一个细节让我难以释怀:据参与响应的开发者发帖(经事件报道转述),OpenCode最初用来帮助分析攻击材料的前沿模型开始拒绝——攻击样本触发了安全过滤器——团队不得不在事件处理中途切换工具。同一周,Hugging Face群体调查中的防御方也需要同类的访问权限。我们构建了一个世界,最好的事件响应助手可能是一个会拒绝查看证据的模型。
Bearer token(持有者令牌) 是一种安全令牌,持有者无需进一步证明身份即可访问资源。API密钥通常作为bearer token使用,一旦泄露,任何持有者都能以密钥所有者的身份调用服务并产生费用。与密码不同,bearer token不绑定设备或会话,无法通过多因素认证增强安全性。因此,存储的API密钥等同于现金:泄露即损失,且损失速度取决于调用频率。这解释了为何事件中攻击者能迅速消耗大量额度,也凸显了托管工作区保管密钥的高风险。
这件事真正关乎什么
三条教训,按人们抗拒的程度递增排列。
存储的提供商密钥是 bearer 工具。 它不是带有账单和退单的账户密码,而是以API速度花掉的现金。任何要求你将密钥粘贴到托管工作区的产品,都是在要求替你保管现金,应该按此标准审计。
退役是攻击面,不是尾声。 被攻破的系统正在下线途中。遗留系统持有生产形态的秘密,却只得到预生产级别的关注。如果你的关停清单不以“撤销并轮换该系统接触过的所有凭证”开头,那清单就是装饰性的。
没有分母的百分比是麻醉剂。 “1.4%的用户”听起来很小,且按所述无法证伪。用户真正需要的是二元信息:你收到邮件了没有。这才是正确的单位。如果你收到了:去提供商仪表盘(不是OpenCode)撤销密钥、重新签发、更新旧密钥的所有消费方、检查10月17日之后的使用情况,并确认旧密钥确实失效——已撤销的密钥应返回401,而“应该”这个词可以用一个curl来测试。
我差不多以测试错误表面为生。凭证生命的终点是唯一能在半秒内验证的API行为,这是一种奇怪的安慰。
401 Unauthorized 是HTTP状态码,表示请求缺乏有效的身份认证凭证。在API密钥撤销场景中,验证旧密钥是否真正失效的最直接方法就是用它发起一次请求,预期返回401。如果返回200,则说明密钥仍有效,撤销未生效。这种方法比依赖控制台显示更可靠,因为缓存、延迟或配置错误可能导致撤销状态未同步。文章建议用curl测试,正是基于这一简单可验证的API行为。
相关推荐

前端转AI Agent开发:一线架构师解析职业路径与红利
一线AI架构师解析前端转AI Agent开发的行业变化与落地路径:纯前端岗位为何消失、Agent+全栈为何成为招聘主流,以及Agent开发工程师、FDE、远程接单三条转型路线和对应学习策略。

AI Agent开发课程怎么选?五条避坑指南
机械转行开发者踩坑两年总结的AI Agent开发课程筛选清单:完整交付链路、可写进简历的项目、真实开发视角、更新频率、陪跑反馈五个维度,附具体判断方法和避坑要点。

扣子(Coze)智能体搭建入门:零代码开发AI Agent实战指南
扣子(Coze)是字节跳动推出的一站式AI应用开发平台,支持零代码拖拽搭建AI智能体。本文基于B站教程梳理扣子的核心概念、三大优势、国内版与国际版差异,以及智能体与应用的区别,帮助初学者快速入门AI Agent开发。