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 代码就是因为安装了它。 |
| npm | Node.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.sources 和 map.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 上之后:
- 任何人都可以下载这个包
- 解压后能拿到
cli.js.map - 从中提取出完整的原始源代码
这不是被黑客攻击了,而是自己”不小心发出去的”。
3.3 为什么会有 Source Map?
Source Map 是开发过程中很有用的工具。开发 Claude Code 时,工程师们:
- 用 TypeScript 写代码(方便维护)
- 编译成 JavaScript(计算机能运行)
- 生成 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 做了什么
- 紧急修复 - 立刻更新 npm 包,删除了 Source Map 文件
- 版本处理 - 关键是:Anthropic 选择更新最新版本移除 Source Map,但已泄露的版本(2.1.88)仍在 npm 上存在。这意味着任何在泄露事件后下载过该版本的人,都已经拿到了包含完整 Source Map 的包。
- 核心未受影响 - Claude 的底层 AI 模型依然是保密的——泄露的是工具层代码,不是模型权重或训练数据。
6.2 法律与许可风险
这是一个容易被忽视的维度:
- 版权问题:Claude Code 是专有软件(proprietary software),其源代码受版权法保护。大规模传播和使用这些代码可能涉及侵权风险。
- 许可证合规:即便代码被公开查看,并不意味着可以自由使用、修改或再发布。这次泄露并非”开源”,GitHub 上的 Star 和 Fork 行为本质上是对泄露事件的关注,而非合法的开源贡献。
- 开发者责任:开发者社区应意识到:研究和学习这些代码无可厚非,但将其用于商业目的或二次开发存在法律风险。
6.3 安全影响分析
从安全角度看,这次泄露带来了以下影响:
| 影响类型 | 说明 |
|---|---|
| 攻击面扩大 | 源码暴露使得恶意行为者可以更深入地分析 Claude Code 的实现细节,寻找潜在漏洞 |
| 供应链风险 | 如果攻击者向泄露的代码中注入恶意代码并重新打包,可能造成供应链攻击 |
| 内部机制曝光 | 权限系统、API 调用逻辑等安全机制的暴露,理论上可能被绕过 |
好消息是:Claude Code 的权限系统、安全沙箱等核心安全机制在此次事件中一并曝光,这反而让安全研究者可以评估其健壮性,有助于提升整体安全性。
七、从这件事里学到了什么
7.1 对普通开发者的提醒
-
Source Map 不能发到生产环境
- 构建时配置排除
*.map - 或者使用
.npmignore明确排除
- 构建时配置排除
-
发布前检查
- 上线前检查一下包里的内容
- 用
npm pack+tar -tzf可以在不解压的情况下查看包内容
-
自动化检查
- CI/CD 里加入敏感文件检测
- 防止这类配置失误导致泄露
7.2 对 AI 行业的思考
- 工具工程同样重要 - AI 模型能力很强,但工具本身也要做得扎实
- 开源社区很高效 - 51 万行代码几小时就被全球开发者分析完了
- 未发布功能有风险 - 泄露可能影响产品规划和市场策略
八、总结
这次事件本质上是一次低级的工程失误,不是被黑了。
但它让我们看到:
- Claude Code 是个架构很成熟的产品
- Anthropic 正在做很多酷炫的未发布功能(Kairos 贾维斯模式!)
- Source Map 安全是个容易被忽视但影响巨大的问题
对于想学习 AI 编程工具开发的人来说,这是个难得的机会——可以看看业界最顶尖的团队是怎么做产品的。
参考资料
部分信息可能已经过时









