乐于分享
好东西不私藏

扒一扒Claude Code源码泄露始末

扒一扒Claude Code源码泄露始末

3月31日,AI前线迎来一则重要动态,有人在Twitter上把Claude Code的源码贴了出来:

有引发网友调侃:Anthropic现在比OpenAI更加open

这次的泄露并非被黑客攻破,而是因为Anthropic自己的发布流水线翻车了,误把Source Map文件打进了发布版本2.1.88。为何说是误打呢,它的上个发布并未发生泄露,也没包含Source Map文件

为什么把Source Map文件打包会导致源码泄露?

Claude Code的Source Map文件长下面的样子:

没看错,sourcesContent字段中,每一个文件内容,每一行源代码,每一条注释,每一个内部常量,一字不差的躺在那里,不需要逆向编译,不需要反混淆。

Source Map文件干什么用的,为什么会把它打包进去?

这得从WEB讲起。在发布WEB代码时,为减少文件体积,JavaScript源码会被压缩(minify)成一行。但这操作有负作用,每当应用报错时,其错误对应的是压缩后的源码,那将是难以理解的“第1行,第58776列”之类的天文信息。

为提升调试效率,聪明的开发者想到,构建一张“从压缩后代码 到 源码的精确坐标对照表”,这样即可把上面的天文信息,翻译到真实的源码位置。这张所谓的坐标对照表就是我们讨论的Source Map文件。一句话总结:Source Map文件可回答我们,压缩后代码的第X行第Y列,对应到原始代码的哪一行哪一列

然而问题只解决了一半,在开发阶段,知道错误位置还不足以高效的排查问题,我们还需源码来设置断点和单步执行等。此时若直接加载../src/main.tsx将会失败,因为正常的打包只会有dist/目录, 并不包含src/

很快,聪明的开发者又想了个办法:源码打包进sourcesContent字段,这样即可保证在任何情况下都能调试。但是,此策略只建议用在开发环境,在生产环境应隐藏Source Map文件,以防造成泄露!

Anthropic为什么会犯如此低级的错误?

其实,错误的原因几乎总是相同的:

1. 忘记将 *.map 添加到 .npmignore文件中

2. 没有配置打包工具,在生产版本中关闭生成source map文件

若小狐狸告诉你,几乎一模一样的翻车方式,Anthropic在2025年2月份就栽过一次,你是否会有点意外?

有意思的是,Anthropic为防止内部信息泄露,他们内部构建了一个完整系统(叫Undercover Mode)来防止他们的AI,在Git提交中意外泄露内部代码……然并卵,AI还是在他们的眼皮底下,偷偷的把整个Claud Code源码搬运了出来

请长按二维码,关注小狐狸,一起变更好