详解 Claude Code 源码
赛博浮世绘 · 晓风乾 · 24 站拆解
回首页
详解 Claude Code 泄露与全景 1.1 · 泄露事件始末
篇章一 · 1.1

泄露事件始末

先搞清楚这次泄露的「怎么发生的」:Source Map 是什么、为什么它等于源码、时间线上都发生了什么。这一站是整门课的地基。

一张 59.8MB 的调试文件,交出了 51 万行代码

2026 年 3 月 31 日,Anthropic 发布 @anthropic-ai/[email protected] 时,npm 包里多带了一个本不该发布的文件——完整的 Source Map。这不是黑客攻击,是一次打包事故,但结果等同于开源。

npm 包体检 · @anthropic-ai/[email protected]
文件体积是什么
cli.js13 MB16,824 行打包产物,minified(压缩但未混淆)
cli.js.map59.8 MBSource Map v3本不该发布——内含全部源码的还原材料
sourcesContent4,756 个文件Source Map 字段:每个源文件的完整原始内容
还原结果1,902 个 TS 文件33 MB未混淆的 TypeScript 源码,含原始文件名与目录结构
Source Map 解剖 · 为什么 .map 文件 = 源码 Source Map v3 结构
cli.js · 13MB minified 产物(压缩) cli.js.map · 59.8MB Source Map v3(事故主角) "version": 3, "sources": [ 4,756 个路径 ], "names": [...], "mappings": "AAAA,CAAC...", "sourcesContent": [ 每个文件的完整源码 ] 还原源码树 REPL.tsx 875KB main.tsx 785KB AgentTool.tsx 228KB query.ts Tool.ts permissions/… compact/… skills/… 共 1,902 个 .ts/.tsx 33MB · 未混淆 直接读出

关键在 sourcesContent 字段:它不是「映射关系」,而是源码本身的完整拷贝。开发者本地调试用的资料,发布时忘了剔除。

事故时间线
2025-02@0.2.8 版第一次泄露 Source Map十三个月前就有过一次,没有吸取教训
2026-03-312.1.88 发布,cli.js.map 混入 npm 包
数小时内安全研究员 Chaofan Shou 发现并发推
Anthropic 回应撤包 ·「人为打包失误,非安全入侵」但 npm 镜像已被抓取,无法撤回
24 小时内GitHub 出现多个 dump(一个被 DMCA,瞬间被 fork)
同日洁净室 Rust 重写项目「Claw Code」2 小时 5 万 star
过站检查
Source Map 里哪个字段约等于「源码本体」?
mappings 只是「压缩位置 ↔ 原位置」的对照表;sourcesContent 是每个源文件的完整拷贝——拿到它等于拿到源码,这就是 59.8MB 的分量所在。
答完这题,这里给你盖章。
本站要点:Source Map 的 sourcesContent 等于源码本体,构建产物混入发布包是重复性供应链事故。下一站拿「探照灯」照一照那 13MB 的明文——看看 minify 到底挡住了什么。