出事的是 OpenCode 的托管控制台 Console,不是开源编程客户端。官方称一个正在下线的遗留系统被未授权访问,用户存放在那里的外部模型厂商密钥可能外泄;官方公开前,已有多名用户报告密钥被盗刷。官方以事件仍在处理为由,没有说明入侵入口、受影响的绝对人数和密钥存储方式,却把事件和“大规模蒸馏攻击”联系在一起。本文是截至北京时间 10 月 19 日早晨的初步复盘。
缘起。 美国时间 2026 年 10 月 17 日上午(北京时间 10 月 18 日凌晨),开源终端 AI 编程 Agent OpenCode 的官方账号在 X 上发帖,称“昨晚”发生安全入侵,影响 1.4% 的 OpenCode Console 用户(官方定稿帖)。OpenCode 由 Anomaly Innovations 公司运营(信任中心)。本文把它与 OpenCode 近一年的其他安全问题分开,按一手材料复盘。资料截至北京时间 10 月 19 日 06:38;本文只读公开材料,未安装受影响版本、未运行任何验证代码,也未向 Anomaly 和各模型厂商求证。
术语速查。
- Console 与客户端:Console 是 Anomaly 运营的可选托管服务,包括工作区、推理服务(原名 Zen,10 月 12 日并入)、供应商网关、用量预算、团队策略和 Go 订阅(V2 文档、PR #54761)。开源的命令行、终端界面和桌面端,下文统称“客户端”。
- 两类凭据:①外部厂商密钥,指用户在 OpenAI、Anthropic、Google 等模型厂商申请、交给 Console 保管的 API 密钥,本次可能外泄的是这一类;②OpenCode 自家凭据,指 OpenCode 签发的 Console、Zen、Go API 密钥和登录令牌,这次被批量作废,原因官方没说。下文只用这两个叫法。
- BYOK(自带密钥):用户把外部厂商密钥交给平台保存、由平台代为调用模型的做法。
- 蒸馏与 LLMjacking:蒸馏指用一个模型的大量输出训练另一个模型;Anthropic 等厂商把违反使用条款的这类做法称为 illicit distillation,中文常译“非法蒸馏”,多指违约,不等于已被认定违法。LLMjacking 指盗用他人凭据调用大模型,费用记在凭据主人账上。
一、先说结论
- 出了什么事。 据官方“昨晚”的说法推算,入侵约发生在美国时间 10 月 16 日夜(北京时间 10 月 17 日),具体时刻没有公布。官方通知邮件说,有人未经授权访问了 Console 中一个“正在下线的遗留系统”,用户保存在工作区里的外部厂商密钥可能已经暴露(通知邮件转贴)。官方口径是影响 1.4% 的 Console 用户,限于连接了外部模型厂商的一部分人;Console 用户总数没有公开(官方定稿帖)。这是托管服务被入侵,不是客户端漏洞;没有证据表明官方 npm 包或发布流程被篡改(见第五节)。
- 谁受影响。 在 Console 工作区存过外部厂商密钥的用户。OpenCode 维护者 Dax Raad(@thdxr)回复一名 Anthropic 员工时称,出事的是 Console 而不是 OpenCode 本身,客户端里配置的密钥从来不会发给他们(原话“those keys never come to us”,所指是本文据上下文的理解)(Dax Raad 回复)。据此,只在本机配置密钥、不连 Console 的用户不在已披露范围。另一方面,同期 OpenCode 自家凭据被批量作废,没绑外部厂商、没收到邮件的用户也被波及,官方没有解释(#56833、#56703)。
- 现在该做什么。 在 Console 存过外部厂商密钥的人,要到各厂商后台吊销并更换密钥,只在 Console 里替换不够;查 10 月 16 日以来的用量和账单;在厂商侧按项目或工作区设消费上限;不点“去轮换”的邮件链接(Cyera)。分情况的清单见第九节。
- 有没有被利用。 多方迹象显示有(本文判断)。官方只说密钥可能外泄,没有确认滥用。但官方公开前约 4 小时 20 分,已有受害者公开报告盗刷;本文统计的自述金额,单人多在几百美元到约 3,000 美元之间;一名 Anthropic 员工用个人账号发帖称,Anthropic 已吊销他们认为受影响的 Claude 密钥(见第五节)。
- 根因是什么。 入侵入口官方没有公布。能确定的是,一个集中托管大量长期密钥的平台,在新旧系统迁移、旧系统尚未拆净时被入侵。开源代码显示,旧 Console 的数据库原样保存外部厂商密钥,但官方没有确认被入侵的就是它(见第四节)。
- 对 AI 编程 Agent 意味着什么(本文判断)。 过去一年这类工具的安全事件多出在本机客户端,这次出在厂商托管层,客户端的沙箱和审批都不在攻击路径上。工具变成托管平台后,凭据集中和系统退役期的治理缺口比客户端漏洞更隐蔽,损失也更直接。
二、事件时间线
时间为 UTC,北京时间加 8 小时。
背景:入侵前的相关动作。
- 2026 年 1 月 12 日,客户端漏洞 CVE-2026-22812、CVE-2026-22813 公开;9 月 24 日,Datadog 发现的升级接口漏洞 GHSA-632h 公开(Datadog)。这三起与本次入侵无关,见第四节对照表。
- 9 月 4 日起,外部厂商密钥开始迁往新 Console;10 月 10 日,V2 合入 dev 分支(PR #47266、提交 5caf1f9f6f)。
- 10 月 12 日 07:17 至 07:48,旧 Console 代码不再访问旧数据库的改动上线,生产环境删除了旧 Console 应用连接旧库的那组口令,库本体要手工删除(PR #54585、部署记录)。
- 10 月 13 日、16 日,GitHub 先后为 16 个借用 OpenCode 名义的第三方 npm 恶意包发布公告(一包一条,例如 GHSA-8w65、GHSA-pm76),与 Console 入侵没有已知关联。
- 10 月 16 日 12:32 和 22:14,opencode-ai 1.19.3、@opencode/cli 2.0.32 例行发布,与事件没有已知关系(npm v1、npm v2)。
主线。
| 时间(UTC) | 事件 |
|---|---|
| 10-16 夜(美国时间) | 官方称“昨晚”被入侵;一名用户称睡前三家厂商的消费告警齐响(日期为推断) |
| 10-17 约 06:00 | 一名用户的 OpenAI 密钥开始被刷(自述),是已知最早、有明确时刻的盗刷 |
| 13:36(北京 21:36) | 该用户公开发帖,这是已知最早的公开信号 |
| 14:35 | 另一名用户发帖,已用“遗留系统被黑”的说法 |
| 15:18、15:30 | 安全从业者 Matt Johansen 称有用户收到泄露通知,并转贴 Reddit 上的邮件截图,截图显示帖子约一小时前发布 |
| 16:16 | 维护者提交客户端 PR,配合 Console 端的“过期密钥”响应 |
| 约 17:11 | 已知最早的用户日志显示 OpenCode 自家凭据被拒 |
| 17:56(北京 18 日 01:56) | 官方首发帖,正文没写完 |
| 18:01 | HN 主帖发布,取数时 938 分 |
| 18:08(北京 18 日 02:08) | 官方定稿帖:影响 1.4% 的 Console 用户;称事件仍在进行,暂不能透露更多,正与 Anthropic、OpenAI、Google 合作处置 |
| 18:41 | 维护者称其个人账号也遭攻击,称这是“AI 驱动的攻击” |
| 21:04 | Anthropic 员工称已吊销受影响的 Claude 密钥 |
| 21:38 | 维护者澄清出事的是 Console |
| 22:17 | 维护者向一名受害者承诺退款 |
| 10-18 00:01(北京 08:01) | 维护者称已联系所有人,退款在进行中 |
| 04:04–08:28 | 状态页记录两段错误率升高,没有注明原因 |
| 12:04 | 维护者称对方过去 48 小时一直在尝试攻击 |
| 14:59–16:39 | CI 部署改到固定出口 IP 的运行器,Cloudflare 令牌换成权限更窄的版本(两个 PR 都没提事件,与入侵的关系不明) |
| 22:38(北京 19 日 06:38) | 取数截止前复查:没有复盘,官方账号没有第二条帖子,状态页没有安全条目,仓库安全公告仍是三条 |
表中来源依次为:官方定稿帖、Chris Sinco、Colin Parsons、Matt Johansen 帖一、帖二、PR #56433、#56782、官方首发帖、HN 主帖、Dax Raad 18:41、Lydia Hallie、Dax Raad 21:38、22:17、00:01、状态页接口、Dax Raad 12:04、PR #56818、PR #56841、仓库安全公告。
从时间线看,已知最早、有明确时刻的盗刷在 10 月 17 日 06:00 UTC 前后开始,有用户称前一晚睡前告警就响了,盗刷可能更早。通知邮件不晚于 15:18 UTC 发出,按 Reddit 截图推算约 14:30 已在流传(本文推断)。已知最早的公开信号来自受害者收到的厂商计费告警;OpenCode 何时、如何发现入侵,官方没有说明。维护者 10 月 18 日称对方“过去 48 小时”一直在尝试攻击,按字面推算,攻击活动至少始于 10 月 16 日中午(UTC)前后,但这不能说明团队那时已经察觉(本文推断)。
三、Console 是什么:一个替用户保管密钥的网关
按官方文档,Console 保存用户的外部厂商密钥,再通过自己的供应商网关提供各家服务,工作区成员用得上模型,却看不到密钥。新 Console 除了模型厂商的密钥,还能保存 Azure、AWS Bedrock 的 API key,Google Vertex AI 的服务账号 JSON,以及 Cloudflare AI Gateway、Databricks 的令牌(Console 供应商文档)。旧 Console 只支持三家模型厂商(见第四节),这些云凭据只可能存在新 Console 里,而官方说出事的是遗留系统;没有证据表明云凭据在本次泄露。
这种结构有两个容易忽略的边界。第一,文档里的“轮换”是在 Console 页面换填新凭据,没有提到去厂商处吊销旧密钥(Console 供应商文档)。第二,Console 的预算只覆盖经过 OpenCode 的花费,被盗密钥直接调用厂商接口时,它管不到(Cyera);即使是经过网关的请求,用户自带厂商的模型也只有设了价格才计入预算(预算文档)。
“密钥保险箱加代理”的结构还会放大损失:一个平台集中保管许多用户在多家厂商的长期密钥,攻击者拿到平台背后的数据,就能绕开平台直接调用厂商接口,平台的预算、风控和日志都管不到。受害前提只有一条,就是曾把密钥存进 Console 工作区,与客户端版本、安装方式都无关(本文分析)。
产品层次本来就容易混:HN 上多名用户要求把主帖标题改成“OpenCode Console”(HN 主帖),StepSecurity 的文章也把本机凭据文件当成了 Console 里的连接(StepSecurity)。
四、技术线索:已知、推断与空白
官方只说了一句话
通知邮件对入口的全部描述是:有人未经授权访问了一个“正在下线的遗留系统”(邮件转贴)。入侵途径、驻留时长、发现方式、密钥存储方式,官方都没有公布,给出的理由是事件仍在进行(官方定稿帖)。下面的线索来自开源仓库,能说明旧系统的样子,不能证明被入侵的就是它。
开源代码里的旧数据库
通俗地说,在这份旧代码里,能读到这个数据库的人,就能直接拿到可用的密钥。在旧代码被删除前的最后版本里,旧 Console 用 PlanetScale(一种托管 MySQL 数据库服务)存数据。外部厂商密钥(代码里叫 BYOK 凭据)存在一个文本字段里,写入和读出都是原样;OpenCode 自家签发的 API 密钥也按原值存放,查找时直接比对原值,说明库里存的不是哈希。代码里看不到应用层加密(provider.ts、key.ts、inference-proxy.ts)。生产环境有没有存储层加密,从代码看不出来;即使有,也挡不住拿到数据库口令或应用权限的攻击者(本文分析)。
旧 Console 的 BYOK 支持 OpenAI、Anthropic、Google Gemini 三家,Gemini 于 2025 年 11 月加入(厂商列表代码、提交 9bd6be5c6d)。这正是官方说合作处置的三家,也与 Google 密钥被刷的报告吻合(本文推断)。
正在拆,还没拆净
9 月 4 日起,已迁移工作区的外部厂商密钥改走新 Console,前提是先在新 Console 导入连接(PR #47266)。旧代码的路由查询仍要求旧表里的密钥非空,说明至少到 10 月 12 日,同一把密钥在新旧两处各存一份(inference-proxy.ts,本文推断,有较强代码支持)。新 Console 闭源,新的那份怎么存无从判断。
10 月 12 日合并的 PR #54585 让旧 Console 代码不再访问旧库,上线步骤的最后一步是手工删除旧数据库,因为它不由基础设施代码管理。PR 还特意保留了存有 Zen 请求和响应归档的对象存储(PR #54585)。部署日志显示,生产环境在 07:48 UTC 删除了旧 Console 应用连接旧库用的那组口令。这条路从此不能再用来连库,但这不等于旧库已经没有其他访问途径,库里的数据也要等手工删库才会消失。库本体是否在 10 月 16 日前删掉,本文没有找到证据(部署记录)。
“遗留系统”指什么:几种推断,都没有证实
被入侵的“遗留系统”,可能是旧 Console 的数据库,也可能是旧 Zen 或旧 Console 的后端。从代码看,旧 Zen 的推理代理就在旧 Console 应用里,查询的是同一个数据库,所以几种说法并不互斥(本文推断)。限制条件是:如果被访问的是旧库,攻击者用的不是那组已删除的口令。新架构里还有别的组件带“legacy”字样,这个词具体指什么,只能等官方说明。本文不写“明文泄露”或“被拖库”。
主事件与客户端漏洞对照
下表对照主事件和客户端的三个已公开漏洞(GHSA 是 GitHub 安全公告编号,CVE 是通用漏洞编号),只写到原理层面。
| 事件 | 攻击前提 | 攻击者能做什么 | 修复或处置 |
|---|---|---|---|
| Console 遗留系统入侵(2026-10) | 用户在 Console 工作区存过外部厂商密钥;入侵途径未公开 | 直接用密钥调用厂商接口,费用记在用户账上 | 通知用户到厂商吊销;Anthropic 在厂商侧吊销;OpenCode 自家凭据批量作废,原因未说明 |
| GHSA-632h(2026-09 公开,只影响 V1) | 用 npm、pnpm 或 Bun 安装 V1(opencode-ai)1.14.30 至 1.18.21;运行 serve 或 web;没设密码或浏览器缓存了凭据;打开恶意网页 | 诱导本机安装攻击者指定的包并执行其安装脚本 | 1.18.22 起只接受 JSON 请求,目标版本必须是语义化版本号 |
| CVE-2026-22812(2026-01 公开) | 1.0.216 之前的版本启动即开本地服务 | 本机任意进程或任意网站可借未鉴权接口执行命令 | 1.0.216 收紧跨域白名单(限定哪些网站能调用本地接口),1.1.10 起服务默认关闭 |
| CVE-2026-22813(2026-01 公开) | 1.1.10 之前,Web 界面加载了攻击者控制的会话 | 模型回复里的恶意内容在本地页面执行脚本(XSS,即跨站脚本),再调用本地接口执行命令 | 服务端先停用相关参数,1.1.10 修复 |
表中来源:通知邮件转贴、Lydia Hallie、GHSA-632h、PR #44686、NVD:CVE-2026-22812、GHSA-vxw4、v1.1.10 发布说明、GHSA-c83v。
五、影响范围与被利用证据
规模:只有比例,没有绝对人数
官方只给了 1.4% 这个比例,Console 用户总数没有公开(官方定稿帖)。仓库星标、npm 下载量和官网自称的“每月超过 1,600 万开发者”(官网)都不能拿来乘以 1.4%。PR #54585 提到,最多 257 个组织在用旧密钥走 BYOK,每天约 1.2 万至 1.7 万次请求(PR #54585),这也不等于受影响人数。
盗刷:多方独立报告
Colin Parsons 称,他只在 OpenCode 里用的 OpenAI 密钥从美东凌晨 2 点起被刷 281 美元,Anthropic 密钥同期被刷 168 美元,合计 400 多美元(原帖)。另有用户自报约 1,700 美元、700 多美元、约 3,000 美元,或余额被刷光(Preston Zeller、Francisco Giancarelli、@tunahorse21、Max Weinbach)。Reddit 上还有 Anthropic 被扣 400 美元、Google 被扣约 200 欧元的报告,经 Notebookcheck 转述(Notebookcheck);IT之家的相关段落与 Notebookcheck 几乎逐句一致,应视为同源,不算独立来源(IT之家,本文判断)。本文统计的自报受害者至少 8 人,金额都未经核实,The Latent 也写明无法独立核实(The Latent)。
受害者彼此独立,Anthropic 员工也称已吊销受影响的密钥,“确有滥用”可信度高(本文判断)。但官方至今只说密钥可能外泄,没有确认滥用;Lydia Hallie 用的是个人账号,不是 Anthropic 官方公告(Lydia Hallie)。OpenAI 和 Google 的公开表态,本文没有找到。
次生损害:风控、断供与下游
被厂商风控。 有受害者称 OpenAI 账户被停用、Google 账户被限制,还有人的 Google 项目以“可疑活动”为由被暂停(Alejandro García Iglesias、Max Weinbach、Chris Sinco)。这些是个案。OpenAI 社区 6 月有一起无关的先例:企业用户密钥被盗后,账户因“蒸馏”政策被停用(OpenAI 社区)。滥用记在合法主人名下,主人就可能被当成违规者(本文推断)。
OpenCode 自家凭据被批量作废。 从 10 月 17 日约 17:11 UTC 起,多名用户报告 OpenCode 自家的 Console、Zen、Go 密钥以及登录生成的 OAuth 凭据被拒,有的密钥从账户里消失(#56782、#56556)。有用户通过 opencode auth login 或终端界面里的 /connect 重新登录后恢复(#56782、#56586)。当天 Console 的社交登录也失败,最早的报告称从早上起就登不上(#56442)。受波及的人里,有从没绑过外部厂商的 Go 订阅用户,也有没收到邮件、所有工作区被锁的用户(#56833、#56703)。维护者在首例报错前约 55 分钟提交了配合“过期密钥”响应的客户端 PR,取数时仍未合并(PR #56433)。
官方没有解释原因。可能是预防性轮换,也可能是下线遗留系统的副作用:有用户称迁移时自动生成的 Go 密钥约 47 小时后过期,另有用户称旧密钥全部变成受限、过期状态(#56586、#52227,本文推断)。如果被访问的是旧库,自家密钥也以原值存放在那里,这为预防性作废提供了动机(本文推断)。不能据此写成“自家密钥也泄露了”。但作废波及了没收到邮件的用户,官方又没有解释,“没收到邮件就未受影响”的说法因此不完整(官方定稿帖)。
服务波动与下游断连。 状态页记录,10 月 18 日 04:04 至 08:28 UTC 先后有两段错误率升高,没有注明原因,与事件有无关系未知(状态页接口)。OpenClaw、Roomote 等第三方工具支持把 Zen、Go 当作模型来源(OpenClaw、Roomote),经 litellm、Hermes Agent 等调用的用户都报告了过期错误(#56560、#56620)。本文没有找到具名企业确认受影响。
没有发现供应链被篡改的证据
按包名查询 OSV 漏洞库,opencode-ai 名下只有两条 1 月的客户端漏洞,@opencode/cli 名下没有条目;GitHub 恶意软件公告库里,官方包名下也没有恶意条目(OSV:opencode-ai、OSV:@opencode/cli、GitHub Advisory)。事件前后 @opencode/cli 的所有版本,都由同一个 GitHub Actions 可信发布配置上传(可信发布是 npm 用来证明包由指定 CI 流程上传的机制),没有紧急正式版。2.0.32 发布于 10 月 16 日 22:14 UTC,可能落在官方所说的“昨晚”,所以不能说所有版本都早于入侵(npm 元数据)。仓库没有新增安全公告(仓库安全公告)。“客户端没有被篡改”是根据这些旁证的推断,官方没有正式声明。
六、“蒸馏攻击”:一个没有公开依据的定性
“大规模蒸馏攻击”是官方帖的原话(官方定稿帖)。官方和维护者都没有解释它与入侵的关系,也没有归因到任何组织(维护者后续帖);通知邮件里没有这个词(邮件转贴)。
本文读到的评论多数是批评。HN 上有人打比方:信用卡被盗去买礼品卡,没人称之为“礼品卡攻击”(HN);研究者 Nathan Lambert 认为把窃取密钥也算作“蒸馏”很奇怪(Lambert);中文账号 Max For AI 要求公开证据(Max For AI)。也有人辩护,认为“蒸馏”只是在交代攻击者的动机(HN)。
行业背景能解释这种联想,但不是本案证据。Anthropic 9 月的威胁报告说,非法蒸馏通常靠欺诈,包括使用被盗的 API 密钥,中转站也常用属于合法公司或个人的被盗凭据(Anthropic 9 月报告)。Anthropic 10 月 12 日的文章称,初步证据显示新防御让蒸馏者获取的数据减少约 90% 至 99%,部分措施只针对 8 月 31 日及之后新建的账号(Anthropic 10 月文章)。新账号越来越难用,真实老客户的密钥对蒸馏者就更值钱,这是本文推断。美国 NSA、CISA、FBI 9 月的联合通报讲的是欺诈账号和中转站,全文没有提被盗密钥(AA26-251A)。另需说明,Anthropic 9 月报告里两次出现 OpenCode 的名字,都只是作为一种编程工具被提到,与这次 Console 入侵无关。
更贴切的概念是 LLMjacking。Sysdig 在 2024 年提出这个词,按当时的价格和配额估算,最坏情况下受害者每天要承担超过 4.6 万美元(Sysdig);Datadog 也观察到,有凭据收集平台从 8 月 31 日起专门筛选能调用 Amazon Bedrock 的 AWS 凭据(Datadog)。投资人 Sarah Guo 转发官方帖时说这已是“过去一周的第三家公司”,没有点名(Sarah Guo);同期能确认的是 Fireworks AI 10 月 6 日发现客户评测任务里的第三方密钥被读取,10 月 9 日发布公告,公告没有提 OpenCode(Fireworks)。
本文的处理是:能较有把握地说的是,密钥可能外泄(官方用语),多方报告显示已被滥用;“蒸馏”是 OpenCode 对攻击者用途的说法,官方没有公开依据;本文不归因到任何国家、公司或实验室。
七、维护方响应:动作快,披露薄(截至取数)
| 维度 | 做到的 | 欠缺的 |
|---|---|---|
| 通知 | 邮件不晚于 15:18 UTC 发出(可能更早),距已知最早、有明确时刻的盗刷约 9 小时 | 邮件的已知最晚时间比受害者第一条公开帖晚约 1 小时 40 分;X 公告 17:56 才发,距该盗刷约 12 小时,比受害者第一条公开帖晚约 4 小时 20 分 |
| 范围 | 划出“连了外部厂商”的范围,区分 Console 与客户端 | 1.4% 没有绝对人数;作废自家凭据波及没收到邮件的用户,官方没有解释,“没收到邮件即未受影响”的说法不完整 |
| 上游联动 | 称与三家厂商合作处置;Anthropic 在厂商侧吊销 | OpenAI、Google 的处置未见公开 |
| 披露 | 说明了暂不公开的理由:事件仍在进行 | 截至官方公开后约 29 小时,入口、驻留时长、存储方式、绝对人数、凭据类型、入侵指标(IOC,如 IP、域名、文件哈希)、复盘时间表都没有更新 |
| 渠道 | X 帖加邮件 | 状态页、博客、GitHub 都没有公告;状态页曾为 10 月 14 日至 15 日的一次 Console 故障补写说明,这次安全事故没有条目;邮件说会跟进,没有找到公开跟进 |
| 客服 | — | 本文查看的 12 个事故期间相关 issue 里,官方一方的公开答复都来自自动分诊机器人;机器人在官方发帖 3 小时后仍称没有官方信息,教用户重新登录 |
| 补偿 | 维护者称退款在进行中 | 只有个人回复,没有书面政策;用户索要政策,只等来机器人回复 |
| 时间上相邻的基础设施改动 | 部署运行器改用固定出口 IP,Cloudflare 令牌收窄(两个 PR 都没提事件,不能写成令牌被盗) | — |
表中来源:Matt Johansen、官方定稿帖、Dax Raad 21:38、#56703、Lydia Hallie、状态页接口、邮件转贴、#56526、Dax Raad 00:01、#56833、PR #56818、PR #56841。
联系渠道也不统一:分诊机器人引导用户发到客服邮箱 help@anoma.ly,维护者在 X 上让受害者直接发到他本人的工作邮箱,安全政策另列了安全邮箱 security@anoma.ly(#56560、Dax Raad、SECURITY.md)。多个邮箱并存,给冒充者留了空间(本文推断)。有用户反问,其他受害者是不是也得先上热搜才能退款(@arb5z)。
维护者对攻击态势的说法是单方面的。10 月 17 日,他称自己的个人账号也遭攻击,并说这是“AI 驱动的黑客攻击”的新世界;10 月 18 日又称,对方过去 48 小时一直在尝试攻击,团队基本上需要 7×24 运行的 Agent,因为对方就有(Dax Raad 18:41、12:04)。他还说,处置中用模型调查时,模型做了不少后开始拒绝,拿到一项新的访问权限后好转;他也不认为有人拒绝帮他们(回复一、回复二)。“对方用 AI 攻击”的说法,目前没有技术证据。
对照 OpenCode 自己的历史。 据 CVE-2026-22812 报告者自述,他在 2025 年 11 月至 2026 年 1 月间先后用邮件、GitHub 安全公告和 Discord 报告,都没有得到回复,直到在 issue 评论里跟进才得到回应(报告者原文、GHSA-vxw4)。维护者在 HN 认错,说处理安全报告做得很差,表示要争取资金办漏洞赏金、做审计(HN);主仓库的安全政策当天首次提交,此后没有提到漏洞赏金(SECURITY.md 历史)。8 月的 GHSA-632h 处理得规范得多:13 天修复,应 Anomaly 要求推迟一个月公开,Datadog 感谢其开放沟通。但 Anomaly 没有为它申请 CVE;据 Datadog 转述,Anomaly 认为给经 GitHub 安全公告报告的漏洞分配 CVE,会促使研究者大量提交低质量报告(Datadog)。修复版本的发布说明也没有提安全修复(v1.18.22)。
本文判断:截至取数,OpenCode 在代码漏洞的协调披露上进步明显,在托管服务事故上止血和通知动作快,但对外透明度与它握有的信任还不相称,也看不到成形的事故披露流程。官方给的理由是事件仍在进行,后续能否补上,要看接下来的复盘。
八、放回 AI 编程 Agent 的安全谱系
| 类别 | 代表事件 | 出事位置 | OpenCode 是否有同类 |
|---|---|---|---|
| 本地控制面不鉴权、不校验来源 | MCP 调试工具 Inspector(CVE-2025-49596)、Claude Code IDE 扩展(CVE-2025-52882)、Cline(GHSA-5c57) | 用户本机 | 有,2026 年三起,其中一起根因是 XSS |
| 仓库配置在确认信任前生效 | Claude Code(CVE-2025-59536)、Codex CLI(CVE-2025-61260)、GitSpawn(Manifold 报告) | 用户本机 | 项目插件启动即自动加载,文档没有工作区信任;但 OpenCode 安全政策把恶意配置文件列为不在漏洞范围内,官方不视为漏洞(本文只作设计对比) |
| 提示注入改写配置或绕过白名单 | Cursor(CVE-2025-54135)、Gemini CLI(Tracebit 报告) | 用户本机 | 仓库安全公告中未见 |
| 供应链投毒 | Nx s1ngularity 调用本机 AI 工具(Nx 复盘)、cline@2.3.0(GHSA-9ppg) | 包仓库 | 只有借用其名义的第三方恶意包,官方包未受影响 |
| 本地凭据被窃密木马收集 | 多个家族把 OpenCode 等工具的本地数据列入收集目标(Gen Digital 报告) | 用户本机 | 是目标之一,与本案无因果关系 |
| 替客户保管凭据的平台被攻破 | Salesloft Drift、Braintrust、Composio、Fireworks | 厂商云端 | 本案 |
表中来源:CVE-2025-49596、CVE-2025-52882、GHSA-5c57、CVE-2025-59536、CVE-2025-61260、Manifold、OpenCode 插件文档、OpenCode 安全政策、CVE-2025-54135、Tracebit、仓库公告列表、Nx 复盘、GHSA-9ppg、Gen Digital、GTIG:Salesloft Drift、TechCrunch:Braintrust、Composio 公告、Fireworks 公告。
典型之处(本文分析)。 集中托管的凭据是高价值目标,先通知一部分人、再扩大吊销是常见节奏。Composio 事后的改进值得参考:接口不再返回已连接账户的令牌;OAuth 凭据改用信封加密,即每条数据用各自的密钥加密,这些密钥再由密钥管理服务里的主密钥加密;平台 API 密钥只存哈希;并提醒用户,删除连接不等于在厂商处吊销(Composio 公告)。
特殊之处(本文分析)。 第一,出事的是 Agent 厂商的商业托管层。各家客户端的沙箱和审批设计差别很大,OpenCode 的安全政策就写明不对 Agent 做沙箱,权限系统只是体验功能(SECURITY.md);但这些设计管的都是 Agent 在本机做什么,这次都不在攻击路径上。第二,官方主动把事件和“蒸馏”挂钩,在同类事件里少见。第三,损失直接记在用户自己的账单上,受害者还可能被厂商风控误伤。第四,同一产品的密钥存在本地和云端两处,两处都是靶子。
按 OWASP 2026 版大模型应用十大风险,本案最贴近两条:敏感信息泄露,条目把 API 密钥列为受保护信息;无界消耗,条目把被盗凭据造成的“钱包耗尽”列为典型情形(OWASP LLM Top 10 2026)。
九、自查与处置清单
先判断你属于哪种情况。
| 你的情况 | 风险判断 | 该做什么 |
|---|---|---|
| 收到 OpenCode 的密钥泄露通知邮件 | 按已泄露处理 | 立即到厂商后台吊销并重发;查用量和账单;设消费上限;向厂商申诉,并联系 OpenCode 退款(下文第 1 至 5 条) |
| 在 Console 存过外部厂商密钥,但没收到邮件 | 官方称未受影响,但官方口径与用户报告有出入 | 本文建议预防性轮换:先建新密钥,再替换,最后吊销旧的 |
| 不确定是否在 Console 存过 | 无法排除 | 按“存过”处理 |
| 只用开源客户端,密钥只在本机配置 | 不在已披露范围 | 升级到安全基线以上,清理不用的本地凭据;想稳妥可以新建一把密钥(Anthropic 员工也这样建议),成本很低 |
| 用 Zen、Go 或 OpenCode 账号登录,突然报“过期”或 401 | OpenCode 自家凭据被作废,原因未说明,不等于外部厂商密钥泄露 | 见下文第 6 条 |
| 装过 opencode2 系列包或 @beloved-lenora 名下插件 | 与本案无关,但按 GitHub 公告视为整机失陷 | 在另一台干净设备上轮换全部密钥,见“客户端卫生”第 4 条 |
个人用户
- 到厂商后台吊销并替换。 官方邮件要求通过相应厂商的后台吊销并替换密钥(邮件转贴)。三家的密钥管理页分别在 OpenAI、Anthropic、Google AI Studio。被通知的密钥,不论有没有看到异常,都应立即吊销,再补发新密钥;只是出于预防的,可以按先新建、再替换、最后吊销的顺序做(Cyera、Anthropic 帮助中心)。只在 Console 页面换填新密钥,旧密钥在厂商那里仍然有效。
- 查用量。 Cyera 建议查 10 月 16 日以来的账单(Cyera);入侵起点没有公开,本文建议追溯到密钥存入 Console 的那天。在厂商后台按密钥或项目筛选用量,重点看三点:有没有自己没用过的模型,平时不用的时段有没有峰值,几家厂商是否在同一时间激增。本机日志看不到被盗密钥的调用(本文推断)。
- 设上限。 主流厂商的消费上限按组织、项目或工作区设置,不能给单把密钥封顶:OpenAI 可给组织或项目设月度硬上限,达到后请求返回 429 错误;Anthropic 可给工作区设月度消费上限和告警;Google AI Studio 可给项目设月度消费上限,但这是实验功能,计费数据最多延迟约 10 分钟,期间可能超支(OpenAI 文档、Anthropic 文档、Google 文档,均核对于 10 月 18 日)。做法是给托管网关和其他第三方工具单独建项目或工作区,放进专用密钥,再设上限、开告警;预付费账户要谨慎设置自动充值额度(Anthropic 帮助中心)。
- 换掉所有用到旧密钥的地方。 持续集成、环境变量文件和其他 Agent 里用到旧密钥的地方,都要一并更换(邮件转贴)。
- 申诉与退款。 被盗刷的向厂商申诉,同时联系 OpenCode 申请退款(Dax Raad)。建议准备好用量截图、受影响密钥的名称或 ID(不是密钥本身)、异常时间段和 OpenCode 的通知邮件(本文建议)。
- OpenCode 自家凭据报“过期”或 401。 这与外部厂商密钥是否泄露是两回事。报错提示写明,重新登录不会让旧的 API 密钥续期,要在 Console 新建一把,再替换客户端和密钥存储里的旧密钥(#56806);也有用户通过
opencode auth login或终端界面的/connect重新登录后恢复,其中一人原先用的是 Go API 密钥(#56782、#56586)。换了新密钥,要同步更换 litellm、OpenClaw 等集成工具里的旧密钥。从 V1 升级上来的电脑,有用户发现 V1 凭据文件里残留的过期条目会干扰新凭据(#56556)。不要在 GitHub issue 等公开场合贴出密钥或含令牌的日志;需要退款或解锁工作区,按官方邮件或仓库机器人给出的客服邮箱联系。 - 防钓鱼。 不点通知邮件里的链接,直接登录厂商后台操作(Cyera)。本文看到的官方联系邮箱都在 anoma.ly 域名下;任何催你点链接去“轮换”或“领退款”的邮件,都应视为可疑。10 月 17 日至 18 日,issue 区出现 70 条“一键安装”钓鱼帖,诱导 Windows 用户以管理员身份执行远程脚本,仓库机器人确认相关域名不属于 OpenCode(#56424)。
客户端卫生(与 Console 事件无关,但应一并检查)
- 用
opencode --version查版本。V1(opencode-ai)至少要 1.18.22,它修复了 GHSA-632h;V2(@opencode/cli)不在这份公告的受影响范围。截至 10 月 18 日,最新版分别是 1.19.3 和 2.0.32(GHSA-632h、npm v1、npm v2)。升级客户端保护不了存在 Console 里的密钥。 - 用 npm、pnpm 或 Bun 安装 V1、又运行过 serve 或 web 的,尤其要确认版本。判断安装方式,可以运行只读命令
ls -l "$(command -v opencode)",看路径是否指向 npm、pnpm 或 Bun 的全局目录(方法出自 Datadog 的漏洞报告,受影响条件以 GHSA-632h 为准)。 - 本地凭据:V2 存在本地数据库里,通常是
~/.local/share/opencode/opencode.db,可用opencode debug paths db查看位置;V1 存在~/.local/share/opencode/auth.json。两者都可以用opencode auth list查看、opencode auth logout删除(V2 文档、V1 文档)。注意,auth logout只删除本机记录,不会在厂商处吊销密钥;用环境变量配置的连接,auth logout删不掉,要自己去掉那个环境变量(V2 文档)。V2 迁移时只读取旧文件、不删除,从 V1 升级上来的电脑可能还留着它(迁移代码,本文推断)。 - 核对包名。官方命令行包是 opencode-ai(V1)和 @opencode/cli(V2),它们会自动带上各平台的二进制依赖包;SDK 和插件库在 @opencode 与 @opencode-ai 作用域下(PR #47852)。V2 装好后可以用 opencode 或 opencode2 两个命令名启动(npm 元数据),但 npm 上名为 opencode2 的包不是官方包,安装 V2 只用 @opencode/cli。GitHub 已为 opencode2 系列 9 个包和 @beloved-lenora 名下 7 个插件发布恶意软件公告,装过的按公告口径视为整机失陷,要在另一台干净电脑上轮换全部密钥(GHSA-8w65、GHSA-pm76)。公告之外名字相近的包没有经过认定,不能一概当成恶意包,但也不要拿它们代替官方包。
团队与企业
- 盘点谁在用 Console、谁只用客户端,列出每个工作区接入的厂商和每把密钥的负责人,逐一吊销重发,找出复用同一把密钥的系统(本文建议)。
- 旧系统只支持三家模型厂商,Bedrock、Vertex、Azure 等云凭据只可能保存在新 Console 里,官方没有说新 Console 受影响。但云凭据权限大、官方细节不全,存过的仍建议优先做预防性轮换(本文建议,Console 供应商文档)。
- 托管和本机各有风险,要做取舍。V2 的“Managed providers only”(只允许托管供应商)设置让全体成员只用工作区里保存的密钥,能防止成员各自在本机放密钥、绕开团队管控,代价是所有调用都依赖 Console 保管的密钥。团队应按对 Console 的信任程度选择;如果开启,就给 Console 单独建低额度的专用密钥。也可以用策略限制成员能用的厂商,但顶层策略配置 10 月 14 日才转为正式功能,旧版本未必支持(Console 供应商文档、策略文档、PR #55297)。
截至取数,OpenCode 没有公布本次事件的入侵指标(CyPro),本文也没有找到各模型厂商公布的入侵指标。可参考的只有用户报告里的行为迹象:只在 Console 用过的密钥,从 10 月 16 日前后出现异常用量,或几家厂商的消费告警同时触发(本文归纳)。
十、启示(本文分析)
给开发者。 把模型 API 密钥当作能直接花钱的生产凭据。交给托管网关的密钥要单独建,放进单独的项目或工作区设上限,厂商支持过期时间的就设上;能用 OAuth 或短期令牌,就不用长期密钥。这次账单告警比平台通知来得早,厂商侧告警值得认真配置。
给企业。 托管 BYOK 网关是关键的第三方依赖,应按凭据托管方的标准来审:密钥怎么加密,谁能访问,退役时数据怎么销毁,出事后怎样披露。SOC 2 报告通常只列控制项名称,未必写到这些细节,应单独问清。OpenCode 的信任页列有“静态数据加密”“加密密钥管理”等控制项名称,但没有细节;公开信任页列出的子处理方只有四家,目前仍在用的 Cloudflare、Stripe 等不在其中(信任中心、PR #56841、PR #54585;本文对照代码与部署记录的观察,可能另有未公开的完整清单)。V2 里组织经 Console 下发的策略优先于个人和仓库配置(策略只会收紧权限,不会凭空授权),企业的集中管理也就依赖这个托管服务本身的安全(策略文档)。不要把高权限的云凭据交给模型网关。
给 Agent 产品设计者。
- 如果一定要集中托管密钥,就做信封加密并交给密钥管理服务,按租户隔离、访问留痕,尽量在厂商一侧换成受限的子密钥或短期令牌。
- 系统退役要有截止日期,并核对数据确实已经销毁;数据还在,监控和访问控制就不能先撤。
- 提前准备事故页、状态页条目、常见问题和补偿政策;客服机器人要同步收到事故信息。
- 产品层次要命名清楚,让用户分得清自己用的是开源客户端还是托管服务。
- 客户端侧,本地服务默认鉴权、校验请求来源,提供工作区信任和沙箱。这次没有用上,不等于不需要。
十一、仍未弄清的问题
括号里是能回答的一方。
- 入侵途径、驻留时长和发现方式;维护者所说“过去 48 小时”的攻击与这次入侵是什么关系(Anomaly)。
- “遗留系统”指哪个组件,旧数据库何时删除,保留的 Zen 请求与响应归档是否受影响;这些归档与官网首页“不存储任何代码或上下文数据”的说法如何对应(Anomaly,官网)。
- 外部厂商密钥在生产环境有没有加密,新 Console 怎样存储(Anomaly)。
- 受影响的绝对人数、密钥数,以及有没有云凭据(Anomaly)。
- 为什么连没绑外部厂商的用户也被作废凭据、锁住工作区(Anomaly)。
- OpenAI 和 Google 有没有批量吊销、撤销费用或恢复被停用的账户(OpenAI、Google)。
- “蒸馏”的依据和攻击者身份,以及会不会发布入侵指标(Anomaly、模型厂商)。
- 正式的补偿政策,以及邮件承诺的跟进(Anomaly)。
- 1 月提出的漏洞赏金和审计有没有落实,今后会不会为安全公告申请 CVE(Anomaly)。
结语
这起事件的大轮廓已经清楚:入侵发生了,出事的是 Console 而不是开源客户端;存进去的外部厂商密钥可能外泄,多方报告显示已被滥用;厂商参与了吊销,维护方的止血动作也快。细节却几乎全空。开源代码显示旧数据库原样保存密钥,而且正处在“手工删库”之前,说明退役期的治理缺口真实存在,但不能据此断言被拿走的就是这个库。截至官方公开后约 29 小时,Anomaly 公布的信息还不足以让用户判断自己的风险:入口、绝对人数、存储方式和“蒸馏”的依据都没有说,官方给的理由是事件仍在进行。AI 编程工具正在从本地程序变成替用户保管密钥的平台,接下来是否发布复盘、入侵指标和补偿政策,是检验它履行披露义务的关键。
延伸阅读
- 本站 10 月 15 日的分析:一批跑在腾讯云上的 AI Agent 试图绕过高德反爬,讨论的是野外 Agent 照着陌生网页行事的越界问题。
资料来源与说明
- 取数与依据。 主要页面读取于 2026 年 10 月 18 日 20:30 至 22:40 UTC(北京时间 10 月 19 日 04:30 至 06:40),依据是 X 与 HN 原文、GitHub 代码与记录(只读)、npm 元数据、状态页接口、OSV 与 GitHub 恶意软件公告库。22:38 UTC 只读复查了官方 X 账号、维护者账号、状态页接口、仓库安全公告和 Anomaly 的博客页面,仍然没有复盘和第二条公告;三家厂商的消费上限文档也在同一时段核对。“没有复盘”“没有入侵指标”“没有书面补偿政策”等结论以此为准,此后可能变化。
- 未能证实。 入侵途径与被入侵的组件;生产环境是否另有加密;受害者的损失金额(都是自述);10 月 16 日前旧数据库是否已删除;OpenCode 自家凭据批量作废的原因;OpenAI、Google 的处置;Reddit 原帖(服务器拒绝访问,只读到截图和转述)。
- 未采用的说法。 网上流传的“攻击始于 9 月下旬”“约 1.4 万人受影响”“官方已发布事后报告和入侵指标”“本地环境变量文件也会泄露”“桌面版被投毒”等,找不到可靠来源,或与官方材料、开源代码矛盾。
- 处理原则。 官方说法、维护者个人说法、用户自述、代码事实和本文推断分开标注;“投毒”“恶意”只用于 GitHub 已认定的恶意包,“蒸馏”只用于转述。本文不提供利用步骤、载荷、钓鱼域名或攻击用命令,文中的命令都是只读的自查命令;恶意包只写包名和公告编号。受害者姓名与金额来自本人的公开帖子。调研页面里有写给 AI 的营销引导和用户贴出的注入样本,本文只记录、未照做。本文不构成法律或投资意见。
