Claude Code 五十万行源码意外公开,藏在里面的秘密比泄露本身更有意思
Claude Code 五十万行源码意外公开,藏在里面的秘密比泄露本身更有意思
2026 年 3 月 31 日凌晨四点,Anthropic 的工程师照常把 Claude Code 推上了 npm。
没有人注意到,这次更新顺手带走了公司最核心的商业机密。
不是黑客攻击,没有密码被盗,没有系统被入侵。是 Anthropic 自己把门打开了。
一个叫 cli.js.map 的调试文件,59.8 MB,理论上永远不该出现在发布包里。但 v2.1.88 把它打包进去,上传到了全球所有开发者都能 npm install 的公共仓库。这个文件本身不包含代码——它指向的是 Anthropic 存放在 Cloudflare R2 上的一个压缩包,无需认证,直接下载。
早上八点多,一位在 Solayer Labs 实习的安全研究员 Chaofan Shou 发现了这件事,把链接公开了出去。帖子最终积累了将近 2800 万次浏览。
四个小时后,Anthropic 把 v2.1.88 从 npm 下架。但那时候,512,000 行 TypeScript 代码已经被镜像到了无数个 GitHub 仓库,最大的那个单独获得了超过 84,000 颗 Star 和 82,000 次 Fork。部分内容被上传到去中心化平台,维护者留言:这些代码”永远不会被删掉”。
一个调试文件引发的事故,比你想的更系统性
Anthropic 的官方声明把这次泄露定性为”人工错误造成的打包问题”。技术上没错,但背后的失误链条值得细看。
第一层:Bun 的已知 bug
Claude Code 使用 Bun 构建,Bun 是 Anthropic 去年年底收购的 JavaScript 运行时。Bun 有一个公开记录的 bug(编号 28001,首次提交于 2026 年 3 月 11 日,距泄露仅 20 天):即使配置明确要求关闭 source map,生产构建依然会生成它。这个 bug 在泄露发生时还处于开放状态,没有被修复。
第二层:.npmignore 没有配置
一个正确的 .npmignore 会在发布时自动把 .map 文件排除在外。Anthropic 的发布配置里没有这一行。软件工程师 Gabriel Anhaia 在事后分析里写道:
“一个错误配置的
.npmignore或package.json的files字段就能暴露一切。”
第三层:R2 桶是公开的
.map 文件本身不包含代码,它指向一个链接。但那个链接指向的 Cloudflare R2 存储桶是公开访问的,不需要任何认证。
三层配置同时出错,才能让这件事发生。
更让人无语的是——Fortune 的报道指出,13 个月前的 2025 年 2 月,Claude Code 的一个早期版本发生过几乎完全相同的泄露,但当时没有公开的事故复盘,也没有足以阻止复发的修复被落实。
这次泄露发生的同一周,Anthropic 还有另一次信息外泄:约 3000 个内部文件,包括一篇关于未发布模型的草稿博客,通过一个面向公众的内容管理系统被访问到了。
五十万行代码藏着什么
开发者社区在接下来 48 小时里把源码翻了个底朝天。技术细节远比”这是个事故”更有意思。
KAIROS:一个从未公开过的后台 Agent
源码里出现频率最高的关键词,没有之一。KAIROS 被引用了超过 150 次,命名来自古希腊语里”恰当时机”的概念。
它是什么?一个持续运行的后台 Agent 模式,不等你打开终端,不等你输入命令。KAIROS 会在你空闲时自主运行任务、修复错误、整合记忆,并通过推送通知向你汇报。源码显示,它有五分钟一次的 cron 刷新、GitHub webhook 订阅、以及一套叫 autoDream 的夜间记忆整合系统——在用户不活跃时,自动合并零散的观察结果,消除逻辑矛盾,把模糊的洞察转化为确定事实,并把记忆压缩到不超过 200 行 / 25KB。
KAIROS 还拥有普通 Claude Code 没有的工具:推送通知、文件发送、GitHub PR 订阅。
这个功能完全隐藏在 feature flag 后面,外部构建的二进制文件里根本不存在这段代码。
ULTRAPLAN:把规划任务外包给云端 Opus
另一个没有公开的功能。当任务过于复杂,ULTRAPLAN 会把规划阶段外包给一个运行在云端容器里的 Opus 4.6 实例,给它最多 30 分钟来思考,然后让你在浏览器里审批结果。审批通过后,结果会通过一个叫 ULTRAPLAN_TELEPORT_LOCAL 的特殊标记”传送”回本地终端。
源码注释里有一句话很能说明设计思路:有些任务规划的成本太高,不适合在标准会话里进行,ULTRAPLAN 把规划变成了一个独立的异步任务——更接近一次后台 CI 运行,而不是一次对话。
Undercover Mode:最被讨论的那个
undercover.ts 文件里有一段系统提示:
“你正在一个公开的开源仓库里秘密工作。你的 commit 消息、PR 标题和 PR 正文绝对不能包含任何 Anthropic 内部信息。不要暴露你的身份。”
这是 Anthropic 员工在为外部开源项目贡献代码时会自动激活的模式。它会抹去 Git 历史里的 AI 署名,禁止出现内部代号(Tengu、Capybara、Fennec),不允许提及未发布的版本号。
社区讨论里有一句话被反复引用:Anthropic 建了一整套系统来防止内部信息泄露,然后自己把整套系统的源码打包公开了。
BUDDY:一只 AI 宠物
源码里还有一个叫 buddy/companion.ts 的文件。里面实现了一个 Tamagotchi 风格的 AI 宠物系统,会在输入框旁边显示一只小动物,偶尔在气泡里发表评论,有自己的名字和个性。物种由确定性算法生成,意味着同一个用户总会得到同一只宠物。
源码注释显示,全量发布的目标时间是 2026 年 5 月。
此外,源码还暴露了几个内部代号:Tengu(Claude Code 的项目代号)、Capybara(一个新模型系列,可能就是已泄露的 Mythos 模型)、Fennec(Opus 4.6)、Numbat(一个未发布的模型)。Undercover Mode 的禁用词列表里还出现了 Opus 4.7 和 Sonnet 4.8,证实这两个版本正在开发中。
同一天,另一个威胁悄悄等在旁边
泄露本身还不是最危险的部分。
就在 Anthropic 推送 v2.1.88 的同一天,npm 上的 Axios 包遭到了独立的供应链攻击。恶意版本(1.14.1 和 0.30.4)被上传,包含跨平台远程访问木马(RAT)。
两件事的时间窗口完美重叠:2026 年 3 月 31 日 00:21 到 03:29 UTC 之间,通过 npm 安装或更新了 Claude Code 的用户,可能同时拉取了携带 RAT 的 Axios。
攻击者随后利用泄露事件发起了新一轮行动:在 GitHub 上创建伪装成”官方 Claude Code 泄露版”的仓库,声称提供”解锁企业功能和去除消息限制的版本”,实际是一个 Rust 编写的投放器,会部署数据窃取工具和代理程序。
安全公司 Zscaler 还记录了另一条攻击路径:攻击者提前在 npm 注册了与泄露代码内部依赖同名的空包,等有人尝试自行编译泄露源码时,把恶意更新推送给已安装同名包的用户。
如果你在那个时间窗口里更新过 Claude Code,现在需要检查 package-lock.json、yarn.lock 或 bun.lockb 里是否包含 axios 1.14.1 或 0.30.4,以及 plain-crypto-js 这个依赖。如果有,立即轮换所有凭证,将宿主机视为完全失陷处理。
Anthropic 推荐的安装方式已经改为原生安装器,不再经过 npm:
curl -fsSL https://claude.ai/install.sh | bash
代码永久在外面了,这意味着什么
DMCA 删除令让 GitHub 上的大部分公开镜像陆续下线,但去中心化平台上的内容是删不掉的,存档也在流传。
对竞争对手来说,损失是实质性的。Cursor、Copilot、Windsurf 现在能看到 Anthropic 已经做完什么、快要发布什么。KAIROS 的架构、三层内存系统、ULTRAPLAN 的规划分离思路——这些是产品路线图,不是可以”改改代码就弥补”的信息损失。
对安全研究来说,影响更直接。AI 安全公司 Straiker 指出,攻击者现在能研究 Claude Code 内部的数据流,设计出能在上下文压缩后依然存活的注入载荷,在任意长的会话里持续存在。每一条系统提示、每一套权限逻辑都已经公开,蒙眼猜测的时代结束了。
开发者社区的反应则出现了分裂:一部分人在认真讨论安全风险,另一部分人把这次泄露当成了”有史以来最详细的生产级 Agent 架构参考文档”——有人已经在用 Python 做了一个清洁室重写版,法律地位目前不明。
有一位开发者在技术社区写下的分析被广泛流传:
“它不只是一个 LLM 的包装层,而是一个复杂的多线程操作系统。512,000 行、自定义上下文压缩、细粒度权限系统、多 Agent 协调器——如果你打算从零做出类似的东西,这是一个多年的工程项目。”
对每一个维护 npm 包的人来说
这件事的教训不只属于 Anthropic。
在发布流程里加一步自动检查几乎没有成本:在 npm publish 运行之前,扫描构建产物里是否存在 .map 文件;检查包的大小是否超出预期(v2.1.88 因为那个 59.8MB 的文件,体积明显异常)。这两个检查,几行脚本就能实现。
更安全的做法是用 package.json 的 files 字段做显式白名单,而不是用 .npmignore 做黑名单——白名单只发布你明确列出的文件,其他所有东西默认被排除,不可能意外把不该发的东西带进去。
Anthropic 的工程师不比任何人差。他们犯的这个错,任何一个在维护 npm 包的团队都可能犯。而且,同一个错误,他们犯了两次。
这大概是这件事留下的最有价值的提醒。
你用 Claude Code 吗?这次泄露有没有改变你对它的看法?欢迎在留言区说说。
夜雨聆风