篇章一 · 1.1
泄露事件始末
先搞清楚这次泄露的「怎么发生的」:Source Map 是什么、为什么它等于源码、时间线上都发生了什么。这一站是整门课的地基。
一张 59.8MB 的调试文件,交出了 51 万行代码
2026 年 3 月 31 日,Anthropic 发布 @anthropic-ai/[email protected] 时,npm 包里多带了一个本不该发布的文件——完整的 Source Map。这不是黑客攻击,是一次打包事故,但结果等同于开源。
npm 包体检 · @anthropic-ai/[email protected]
| 文件 | 体积 | 是什么 |
|---|---|---|
| cli.js | 13 MB16,824 行 | 打包产物,minified(压缩但未混淆) |
| cli.js.map | 59.8 MBSource Map v3 | 本不该发布——内含全部源码的还原材料 |
| sourcesContent | 4,756 个文件 | Source Map 字段:每个源文件的完整原始内容 |
| 还原结果 | 1,902 个 TS 文件33 MB | 未混淆的 TypeScript 源码,含原始文件名与目录结构 |
关键在 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 到底挡住了什么。