mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
3482 字
9 分钟
Claude Code 源码泄露事件始末:一次低级的工程失误与51万行代码的狂欢

Claude Code 源码泄露事件始末#

前言#

2026年3月31日,整个AI编程社区经历了一场意想不到的”开源”狂欢。Anthropic 公司旗下旗舰编程工具 Claude Code 的完整源代码,因为一个低级的配置失误,被意外公开到了 npm 注册表中。

这次泄露是如何发生的?源码是如何被提取的?暴露了哪些未发布的功能?本文将为你一一解答。


事件时间线#

时间事件
2026年3月31日安全研究员 Chaofan Shou 发现泄露并在 X 平台发帖
随后几小时源码被提取并上传至 GitHub,获得大量 Star
同日晚些Anthropic 紧急更新 npm 包,移除 Source Map 文件

一、什么是 Source Map(面向小白的解释)#

1.1 先理解软件开发的基本流程#

当我们写一个程序时(比如 Claude Code),开发者会用某种编程语言(比如 TypeScript、Python、Java)来编写源代码

但源代码有个问题:人类能看懂,但计算机(或更准确地说,CPU)不能直接执行

这是因为源代码使用的是高级编程语言(如 TypeScript、Python、Java),它们的语法和抽象层次是为了方便人类理解而设计的。但 CPU 只认识极其底层的机器指令(0 和 1 的序列)。

所以源代码需要经过一系列处理,变成计算机能执行的格式:

源代码(人类可读)→ 编译/打包 → 生产代码(机器可执行)

这个过程叫做编译(把源代码一次性转换成机器代码,如 C/C++),或者解释/即时编译(边运行边转换,如 Python、JavaScript)。无论是哪种方式,最终目的都是让计算机能够理解和执行这些指令。

1.2 压缩代码带来的问题#

举个例子,你的源代码可能是这样的:

// 源代码(人类写的,可读性好)
function calculateTotalPrice(items: Item[]): number {
let total = 0;
for (const item of items) {
total += item.price * item.quantity;
}
return total;
}

但变成”生产代码”后,计算机会把它压缩成:

// 生产代码(压缩后的,计算机能运行但人看不懂)
function c(t){let n=0;for(const e of t)n+=e.price*e.quantity;return n;}

1.3 Source Map 的作用#

问题来了:线上出错了怎么办?

比如用户报告”计算价格出错了”,但你看到的代码全是 c(t){let n=0...} 这种鬼画符,根本没法调试。

Source Map 就是来解决这个问题的!

Source Map(也叫”源码映射”)是一个文件,它记录了”压缩后的代码”对应”原始源代码”的哪个位置。有点像是一个对照表

压缩代码位置 → 原始代码位置
────────────────────────────────────────
c(t){...} 第1行 → calculateTotalPrice 函数
n+=e.price... 第3行 → total += item.price * item.quantity

有了这个对照表,当线上出错时,开发者就能快速定位到原始源代码的位置,而不是面对一堆乱码。

1.4 Source Map 的文件格式#

Source Map 是一个 .map 结尾的文件,里面是 JSON 格式。关键字段:

字段含义示例
sources原始文件路径列表["src/utils/helper.ts", "src/main.ts"]
sourcesContent原始文件的完整代码完整的 TypeScript 代码内容
mappings位置映射关系一串编码后的位置对应

重点sourcesContent 里面直接就是完整的原始代码!这就是这次泄露的关键。


二、Claude Code 源码提取完整教程#

2.1 准备工作#

在开始之前,你需要了解几个名词:

名词解释
Node.js一个运行 JavaScript 的环境,类似于 Python、Java。你电脑上能运行 JS 代码就是因为安装了它。
npmNode.js 的包管理器,类似于手机的应用商店,可以下载安装各种 JS 工具。Claude Code 就是通过 npm 分发的。
npm pack下载一个 npm 包到本地,类似于”把应用下载到本地安装包”

2.2 第一步:下载 Claude Code 的 npm 包#

打开终端(在 Mac 是”终端”应用,在 Windows 是”PowerShell”),输入:

npm pack @anthropic-ai/claude-code@2.1.88

这行命令的意思是:“下载 Claude Code 的 2.1.88 版本到本地”

执行后会生成一个文件:anthropic-ai-claude-code-2.1.88.tgz

这就是 Claude Code 的安装包。

2.3 第二步:查看包的内容#

我们解压这个包看看里面有什么:

# 解压
tar -xzf anthropic-ai-claude-code-2.1.88.tgz

解压后会有一个 package/ 文件夹,里面的内容大致是:

package/
├── cli.js 13.0MB ← 这是 Claude Code 的主程序
├── cli.js.map 59.8MB ← ⭐ Source Map!这就是泄露源头
├── package.json 1.2kB ← 包的信息配置文件
├── README.md 2.0kB ← 说明文档
└── vendor/ ← 第三方依赖库

2.4 第三步:创建提取脚本#

为什么要自己创建脚本?

因为 .map 文件本质上只是一个 JSON 文件,里面记录了”哪个文件路径 → 对应哪段代码”。但这个 JSON 没有现成的工具能直接”解压” —— 必须写一个程序来解析它、提取内容、写入文件。

核心原理map.sourcesmap.sourcesContent两个长度相同的数组,它们按照索引位置一一对应:

sources[0] → "src/main.ts" ← sourcesContent[0] 的代码
sources[1] → "src/utils/helper.ts" ← sourcesContent[1] 的代码
sources[2] → "src/core/QueryEngine.ts" ← sourcesContent[2] 的代码
... ...
sources[i] → 路径 ← sourcesContent[i] 的代码

脚本的核心逻辑就是:遍历这个数组,取出第 i 个路径和第 i 个代码内容,配对后写入文件。

不过别担心!这个脚本很短,而且这个脚本是公开的(由开发者 sorrycc 创建并分享在 GitHub Gist 上),我们只是复制过来用,不需要自己从头写。

第一步:复制脚本代码

创建一个新文件 extract-sourcemap.mjs,内容如下:

// 这是一个 Node.js 脚本,用来从 Source Map 里提取原始代码
// 首先定义要用的工具(这些是 Node.js 内置的功能)
import { readFileSync, writeFileSync, mkdirSync } from "fs";
import { resolve, dirname } from "path";
// 从命令行参数获取要处理的文件
const mapFile = process.argv[2]; // 第二个参数:.map 文件路径
const outDir = process.argv[3] || "./src"; // 第三个参数:输出目录
// 检查参数
if (!mapFile) {
console.error("用法: node extract-sourcemap.mjs <source-map文件> [输出目录]");
process.exit(1);
}
console.log(`正在读取 ${mapFile} ...`);
// 读取并解析 .map 文件(它是一个 JSON 文件)
const map = JSON.parse(readFileSync(mapFile, "utf8"));
// 确认文件格式正确
if (!map.sources || !map.sourcesContent) {
console.error("错误: 这个 .map 文件格式不对,缺少 sources 或 sourcesContent");
process.exit(1);
}
console.log(`发现 ${map.sources.length} 个源文件`);
let written = 0; // 成功写入的文件数
let skipped = 0; // 跳过的文件数
// 遍历所有源文件
for (let i = 0; i < map.sources.length; i++) {
const src = map.sources[i]; // 第 i 个文件的路径
const content = map.sourcesContent[i]; // 第 i 个文件的原始代码
// 跳过第三方依赖(node_modules)
if (src.includes("node_modules")) {
skipped++;
continue;
}
// 跳过没有内容的文件
if (content == null) {
skipped++;
continue;
}
// 清理文件路径(把 ../ 去掉)
const cleaned = src.replace(/^(\.\.\/)+(\.\/)?/, "");
const outPath = resolve(outDir, cleaned);
// 创建目录(如果不存在)
mkdirSync(dirname(outPath), { recursive: true });
// 把原始代码写入文件
writeFileSync(outPath, content);
written++;
}
// 完成!
console.log(`完成!共写入 ${written} 个文件到 ${outDir}(跳过了 ${skipped} 个)`);

2.5 第四步:运行提取脚本#

在终端中执行:

cd package # 进入 package 目录
node extract-sourcemap.mjs cli.js.map ./src # 运行脚本

你会看到类似这样的输出:

正在读取 cli.js.map ...
发现 4756 个源文件
完成!共写入 1906 个文件到 ./src(跳过了 2850 个)

2.6 第五步:查看提取结果#

现在 src/ 目录下就是 Claude Code 的完整源代码了:

src/
├── main.ts ← 主入口文件
├── core/
│ ├── QueryEngine.ts ← 查询引擎
│ ├── tools/ ← 工具目录
│ │ ├── Read.ts ← 读取文件工具
│ │ ├── Write.ts ← 写入文件工具
│ │ ├── Edit.ts ← 编辑文件工具
│ │ └── Bash.ts ← 执行命令工具
│ └── ...
├── services/
├── utils/
└── ...

2.7 统计#

类别数量
.map 文件中记录的总文件数4756
Claude Code 自己的代码1906 个文件
脚本跳过的文件(主要为第三方依赖及无内容文件)2850 个
最终提取的代码行数约 51.2 万行

三、为什么会泄露?原因分析#

3.1 npm 包应该包含什么?#

正常情况下,一个 npm 包发布到网上时,应该只包含用户运行时必需的文件

✅ 应该包含:
├── cli.js ← 主程序代码(必须的)
├── package.json ← 包信息(必须的)
└── README.md ← 说明文档(可选)
❌ 不应该包含:
├── *.map ← Source Map(调试用,上线后不需要)
└── node_modules/ ← 第三方依赖(用户安装时会自动下载)

3.2 Anthropic 犯了什么错?#

Anthropic 的 npm 包中错误地包含了 cli.js.map 文件

这个文件本来是用于调试的,发布到 npm 上之后:

  1. 任何人都可以下载这个包
  2. 解压后能拿到 cli.js.map
  3. 从中提取出完整的原始源代码

这不是被黑客攻击了,而是自己”不小心发出去的”。

3.3 为什么会有 Source Map?#

Source Map 是开发过程中很有用的工具。开发 Claude Code 时,工程师们:

  1. 用 TypeScript 写代码(方便维护)
  2. 编译成 JavaScript(计算机能运行)
  3. 生成 Source Map(方便调试)

但在发布到 npm 时,应该把 Source Map 排除掉。Anthropic 可能是:

  • 构建脚本配置错误,没有排除 .map 文件
  • .npmignore 配置不当
  • 或者干脆忘了这一步

3.4 这不是第一次#

值得注意的是,Anthropic 在 2025 年就因为类似的问题下架过旧版本。结果 2026 年又重演了一遍。


四、泄露的代码里发现了什么#

4.1 Claude Code 的内部架构#

这次泄露揭示了 Claude Code 是一个架构非常成熟的工程产品

模块功能简单解释
REPL(交互式命令行环境)交互式编程环境让你在终端里和 AI 对话的系统
QueryEngine查询引擎处理你发的消息,理解你要干什么
工具系统各种操作能力读写文件、执行命令、搜索代码等
Slash 命令快捷指令比如 /edit /search 这样的快捷命令
权限系统安全控制防止 AI 做危险的操作
任务系统复杂任务执行AI 自动完成多步骤的工作

4.2 未发布的隐藏功能#

代码中最有意思的是发现了很多还没发布的功能

Kairos - 贾维斯模式#

代码中有个功能叫 KAIROS,注释写的是:

“Start Claude in assistant mode (custom system prompt, brief view, scheduled check-in skills)”

翻译:启动为助手模式,支持自定义提示词、简化视图、定时提醒技能。

这不就是《钢铁侠》里贾维斯的样子吗?一个真正的 AI 助手!

Buddy System - 电子宠物#

代码里还有一个电子宠物系统,类似 90 年代的”拓麻歌子”(Tamagotchi):

  • 18 种宠物
  • 稀有度等级
  • 宠物属性

想象一下,一边写代码一边养电子宠物 🐱

🔧 大量隐藏的环境变量#

代码里发现了:

  • 120 多个未公开的环境变量
  • 35 个编译时功能开关
  • 26 个内部命令(如 /teleport/dream

还有一个特殊的:

USER_TYPE=ant

设置这个环境变量可以解锁全部隐藏功能,据说这是给 Anthropic 员工用的。

Capybara - 神秘模型#

代码中出现了代号 “Capybara”(水豚)的引用,可能和 Claude Mythos 5.0 有关。

卧底模式#

一个专门给 Anthropic 员工用的模式,可以自动抹除 AI 操作的痕迹,让代码看起来像是人类写的。

4.3 隐藏功能背后的产品思路#

从这些泄露的功能来看,Anthropic 正在多个方向上进行探索:

探索方向功能代表产品思路
AI 助手形态Kairos(贾维斯模式)从”编程工具”进化为”个人 AI 助手”,支持日常提醒和定制化交互
用户粘性设计Buddy System(电子宠物)通过游戏化元素增加用户与工具的情感连接
内部效率工具卧底模式为内部团队提供的效率优化功能

五、社区反应#

5.1 传播速度惊人#

  • GitHub 上短时间内获得 13,000+ Stars
  • 20,000+ 次 Fork( Fork = 把代码复制一份到自己的仓库)
  • 多个镜像仓库在全球同步传播

5.2 开发者怎么说#

"整体代码结构很成熟,整个 repo 分得很细,主流程包括 REPL 启动、
QueryEngine、工具注册、Slash 命令、权限系统、任务系统,
以及多层状态管理,非常典型的生产级 AI agent 设计。"
—— 社区开发者
"真正有价值的,从来不是'这是不是官方泄露的',
而是你能从里面看到它是怎么被做出来的。"
—— 评论

六、Anthropic 的应对与后续影响#

6.1 Anthropic 做了什么#

  1. 紧急修复 - 立刻更新 npm 包,删除了 Source Map 文件
  2. 版本处理 - 关键是:Anthropic 选择更新最新版本移除 Source Map,但已泄露的版本(2.1.88)仍在 npm 上存在。这意味着任何在泄露事件后下载过该版本的人,都已经拿到了包含完整 Source Map 的包。
  3. 核心未受影响 - Claude 的底层 AI 模型依然是保密的——泄露的是工具层代码,不是模型权重或训练数据。

6.2 法律与许可风险#

这是一个容易被忽视的维度:

  • 版权问题:Claude Code 是专有软件(proprietary software),其源代码受版权法保护。大规模传播和使用这些代码可能涉及侵权风险。
  • 许可证合规:即便代码被公开查看,并不意味着可以自由使用、修改或再发布。这次泄露并非”开源”,GitHub 上的 Star 和 Fork 行为本质上是对泄露事件的关注,而非合法的开源贡献。
  • 开发者责任:开发者社区应意识到:研究和学习这些代码无可厚非,但将其用于商业目的或二次开发存在法律风险。

6.3 安全影响分析#

从安全角度看,这次泄露带来了以下影响:

影响类型说明
攻击面扩大源码暴露使得恶意行为者可以更深入地分析 Claude Code 的实现细节,寻找潜在漏洞
供应链风险如果攻击者向泄露的代码中注入恶意代码并重新打包,可能造成供应链攻击
内部机制曝光权限系统、API 调用逻辑等安全机制的暴露,理论上可能被绕过

好消息是:Claude Code 的权限系统、安全沙箱等核心安全机制在此次事件中一并曝光,这反而让安全研究者可以评估其健壮性,有助于提升整体安全性。


七、从这件事里学到了什么#

7.1 对普通开发者的提醒#

  1. Source Map 不能发到生产环境

    • 构建时配置排除 *.map
    • 或者使用 .npmignore 明确排除
  2. 发布前检查

    • 上线前检查一下包里的内容
    • npm pack + tar -tzf 可以在不解压的情况下查看包内容
  3. 自动化检查

    • CI/CD 里加入敏感文件检测
    • 防止这类配置失误导致泄露

7.2 对 AI 行业的思考#

  1. 工具工程同样重要 - AI 模型能力很强,但工具本身也要做得扎实
  2. 开源社区很高效 - 51 万行代码几小时就被全球开发者分析完了
  3. 未发布功能有风险 - 泄露可能影响产品规划和市场策略

八、总结#

这次事件本质上是一次低级的工程失误,不是被黑了。

但它让我们看到:

  1. Claude Code 是个架构很成熟的产品
  2. Anthropic 正在做很多酷炫的未发布功能(Kairos 贾维斯模式!)
  3. Source Map 安全是个容易被忽视但影响巨大的问题

对于想学习 AI 编程工具开发的人来说,这是个难得的机会——可以看看业界最顶尖的团队是怎么做产品的。


参考资料#

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Claude Code 源码泄露事件始末:一次低级的工程失误与51万行代码的狂欢
https://bayunmoyu.com/posts/claude-code-source-leak-analysis/
作者
八云墨玉
发布于
2026-04-01
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00