乐于分享
好东西不私藏

Claude Code 源码泄露事件复盘:一次典型 npm 发布事故,给所有开发者敲响警钟

Claude Code 源码泄露事件复盘:一次典型 npm 发布事故,给所有开发者敲响警钟

摘要

Claude Code 并非遭遇黑客入侵,而是因 npm 发布配置失误,将携带完整源码的 sourcemap 文件公开发布,导致核心工程代码被直接还原。本文完整还原事故链路、通过本地实验复现泄露原理,并重点提醒 GitHub 二次开发版本暗藏供应链投毒风险,对前端、Node.js、CLI 开发者及研发安全团队具有重要参考价值。

前    言

近期,Claude Code 源码泄露事件在技术圈引发广泛讨论,不少人第一时间猜测:Anthropic 是不是被黑客攻破了?结合公开信息与实测验证,结论非常明确:这不是安全入侵,而是一次典型的 npm 发布配置事故。

团队在发布 @anthropic-ai/claude-code 2.1.88 版本时,误将包含完整源码映射的 cli.js.map 一同上传至公域 npm 仓库。任何人只需下载解析,就能直接还原出大量原始 TypeScript 代码,相当于“把源码当成编译产物一起公开了”。这件事的真正价值,不在于围观大厂失误,而在于它戳中了一个全行业通用的工程盲区:我们总在严防代码仓库泄密,却常常忽略——最终发出去的安装包里,到底藏了什么。

本文将从三方面展开分析:一是此次泄露事件的发生原因、泄露内容及影响;二是通过本地隔离实验验证此类泄露路径是否成立;三是提示 GitHub 上二次开发 Claude Code 项目可能带来的供应链安全风险。

这次泄露事故的主要问题、泄露内容及影响

综合公开信息判断,这更像一次公开 npm 包发布配置失误,而不是一次外部安全入侵。从公开报道看,@anthropic-ai/claude-code 的 2.1.88版本在 2026年3月31日前后被发现包含一个不应出现在公开发布包中的sourcemap文件。Anthropic 对外也明确表示,这是一次由人为失误导致的 release packaging issue,而不是 security breach,同时强调没有客户敏感数据或凭证暴露。问题的关键,不在于“包里有一个 .map 文件”,而在于这个 .map 文件里到底包含了什么内容。

sourcemap 原本是给开发和调试使用的。构建后的 cli.js 往往已经被打包、转译甚至压缩,不容易直接定位到原始 TypeScript 源码。于是构建工具会额外生成一个 .map 文件,告诉调试器“这段打包后的代码,对应原来哪一个源文件、哪一行、哪一列”。如果这个 sourcemap 只包含位置信息,问题还不算太大;但如果它还包含 sourcesContent 字段,那么原始源码文本就会被直接嵌进 .map 文件里。

这就意味着,一旦这个 sourcemap 被一起发布到 npm registry,任何能够下载该包的人,不需要攻入内部系统,也不需要具备很强的逆向能力,只要解析 .map 文件,就可能把原始源码逐文件恢复到本地。换句话说,泄露的不是“几段实现逻辑”,而是“很大一部分能够直接阅读和研究的原始工程代码”。

从影响上看,这次暴露的主要是 Claude Code CLI 和相关工具链实现细节,包括内部能力边界、功能开关、部分实验性功能痕迹,以及工程层面的提示词编排、记忆机制等。这类信息对普通用户而言可能只是“看个热闹”,但对安全研究者、竞争对手以及供应链攻击者来说,价值并不低。它不是模型权重泄露,也没有证据表明 Anthropic 内网被攻破,但它确实让外部世界更容易理解这个产品的内部实现方式。

如果把这件事抽象成一个工程问题,其链路其实非常典型:

  1. 构建阶段生成了对调试有用的 sourcemap。

  2. 发布阶段没有把这个 sourcemap 排除掉。

  3. sourcemap 中又包含了可直接恢复源码的 sourcesContent。

  4. 结果是“本来只是想发布可执行产物,最后却等于把源码一并公开了”。

因此,这次事故真正暴露出来的,不只是 Anthropic 的一次失误,而是许多团队共同存在的一个盲区:大家会检查源码仓库里有没有敏感内容,却不一定会认真检查“最终发布出去的 tarball 里到底装了什么”。

通过本地实验复现验证泄露路径确实成立

为了避免停留在“理论上可能会泄露”的层面,针对“npm 包误带 sourcemap,导致源码可恢复”的过程进行了一个本地隔离实验。该实验没有接触公共 npm,只在本地私有 registry 中进行。

实验环境很简单:

  1. 用 verdaccio 搭建了一个本地私有 npm registry,地址是 http://127.0.0.1:4873;

  2. 构造了一个最小的 TypeScript CLI 包 @demo/leaky-cli;

  3. 用 esbuild 构建出 dist/cli.js 和 dist/cli.js.map;

  4. 故意把 dist/cli.js.map 一起打进发布产物。

实验主要验证了两件事。

第一,泄露版是否真的会把 sourcemap 发出去。

结果是肯定的。执行 npm pack –dry-run 后,打包清单里明确出现了 dist/cli.js.map。

随后把这个包发布到本地私有 registry,再从另一个 consumer 目录安装,安装结果里同样能够看到:

node_modules/@demo/leaky-cli/dist/cli.js

node_modules/@demo/leaky-cli/dist/cli.js.map

这说明只要发布配置不收紧,sourcemap 就会像普通产物一样进入分发链路。

第二,拿到 sourcemap 之后,是否真的可以恢复源码。

结果同样是肯定的。实验中使用了一个简单恢复脚本,直接读取 .map 文件里的 sources 和 sourcesContent,把源文件逐个写回本地。恢复结果成功落出了原始 src/cli.ts,并且命中了预埋的标识字符串 LEAKY_MARKER_2026_03_31。

这说明恢复过程并不是“艰难逆向”,而是“把已经藏在 map 里的源码重新导出来”。

警惕GitHub上二次开发版本可能存在投毒风险

除事件本身外,还需要对后续可能出现的二次传播和二次开发风险保持足够警惕。

官方源码泄露之后,接下来最危险的事情,往往不是“大家都去研究官方代码”,而是大量非官方二次开发版、魔改版、镜像版、增强版,会很快出现在 GitHub、论坛、群聊和各种网盘链接里。

这里需要特别注意一个边界:目前并无充分证据表明某个具体 GitHub 仓库已经存在恶意投毒行为,也不宜在未经核实的情况下简单定性。但从供应链安全角度看,这类项目天然就属于高风险对象,原因很简单。

第一,用户对“能跑起来的现成项目”往往缺乏足够警惕。

很多人看到“Claude Code 开源镜像”“修复版 Claude Code”“可直接安装版 Claude Code”就会去 npm install、pnpm install、bun install,甚至直接运行别人仓库里的安装脚本。问题是,这类仓库最容易藏匿恶意后门的地方,恰恰就在依赖安装和首次启动阶段,比如:

  • postinstall、prepare、preinstall 等 npm 生命周期脚本;

  • 下载额外二进制文件的 shell 脚本;

  • 读取本机环境变量、SSH key、云服务 token 的初始化逻辑;

  • 把数据悄悄发往第三方服务的埋点或远程加载模块。

第二,这类项目很容易借“官方事故”获取信任红利。

一旦官方项目出过安全事故,很多用户会下意识寻找“民间修复版”“社区增强版”“还原版源码”。而攻击者最擅长的,就是在这种高关注、信息混乱、用户急于尝鲜的窗口期,把恶意代码伪装成“社区贡献”或“修复补丁”。

第三,AI 工具类项目本身就具有更高的权限敏感性。

像 Claude Code 这类工具通常会接触:

  • 本地代码仓库;

  • Shell 命令执行权限;

  • 开发者 token、Git 凭证、云服务环境变量;

  • 编辑器配置、SSH 配置和历史命令。

也就是说,一旦运行的是一个被投毒的二次开发版本,它的危害不只是“程序跑坏了”,而可能是直接把本地研发环境里最有价值的东西一并带走。

对此,建议重点做好以下防范

  1. 优先使用官方渠道分发的版本,不要因为“能看见源码”就放松警惕。

  2. 对任何 GitHub 上的二次开发版本,先看维护者身份、提交历史、发布时间、star 增长是否异常,再决定是否接触。

  3. 安装前先看 package.json、安装脚本、生命周期脚本和网络请求逻辑,尤其是 postinstall。

  4. 不要在有生产权限、真实密钥、公司内网访问能力的机器上直接试跑未知来源版本。

  5. 最好放到隔离环境、一次性容器或专门的测试机中验证。

这也正是此次事件真正值得警惕之处:源码泄露本身已经是事故,但在事故之后形成的“二次传播 + 二次开发 + 非官方分发”链条,往往才是对开发者更现实、更长期的风险。

总    结

Claude Code 此次源码泄露事件表明,软件安全的风险边界并不止于源码仓库,更直接体现在最终对外分发的制品之中。综合公开信息和实验复现结果看,此次问题的根源在于发布环节把控不严,导致具有源码恢复能力的 sourcemap 进入公开分发链路,并由此形成了实际泄露风险。这说明,在当前软件供应链环境下,发布治理不到位,本身就可能演变为安全事件。

这一事件的警示意义,不仅在于一次具体事故的发生,更在于它揭示了一个具有普遍性的工程风险:如果缺少对构建产物、打包结果和分发内容的全过程审查,即便源码管理较为严格,也仍可能因为调试文件、源码映射或附带产物处理不当,造成敏感信息外泄。对发布方而言,需要尽快把制品检查、sourcemap 审计和自动化阻断机制纳入发布门禁;对使用方而言,则应提高对非官方镜像、二次开发版本和来源不明安装包的识别与防范能力,避免因盲目试用而放大供应链风险。

总体来看,这次事件再次提醒我们,软件安全不能只停留在“代码是否安全”的层面,更要落实到“发布出去的到底是什么”。只有同时守住发布端和使用端两个环节,真正把安全要求落实到构建、打包、分发和使用全过程,才能有效降低类似事件带来的连锁影响。

你对这个事件怎么看?对于AI编程工具的安全性,你有什么担忧或建议?欢迎在评论区分享。