Claude Code 源码泄露事件与技术解析
DR 2026年3月,Claude Code 因 npm 包中遗留 source map 文件导致源码泄露,约 1906 个文件、512000+ 行 TypeScript 代码暴露。这是 Anthropic 第二次犯同样的错误。泄露代码揭示了 Claude Code 的技术栈(Bun + TypeScript + React/Ink)、40+工具系统、50+命令,以及多个安全 Bug。
Claude Code 源码泄露事件与技术解析
TL:DR 2026年3月,Claude Code 因 npm 包中遗留 source map 文件导致源码泄露,约 1906 个文件、512000+ 行 TypeScript 代码暴露。这是 Anthropic 第二次犯同样的错误。泄露代码揭示了 Claude Code 的技术栈(Bun + TypeScript + React/Ink)、40+工具系统、50+命令,以及多个安全 Bug。
(Issue区)
一、 事件核心:一次“低级配置”引发的全面泄露
在 NPM 包发布过程中,如果忽视了 .npmignore 和 package.json 中 files 字段的配置,后果可能会非常严重。
最近,Anthropic 发布的命令行工具 Claude Code 就因此“翻了车”。一个高达 60MB 的 cli.js.map (Source Map 源映射文件) 被意外打包上传。任何下载该包的用户,只需通过简单的工具还原,就能直接获取其完整的 TypeScript 源代码——包含 1906 个文件、超过 51.2 万行代码。
这已经是历史重演,早在 2025 年 2 月 Claude Code 首次发布时,就发生过一模一样的泄露事件。时隔一年(2026 年 3 月),同样的错误再次出现。
二、 源码揭秘:Claude Code 的底层技术架构
抛开泄露事件本身,这份超大规模的源码为我们提供了一次绝佳的“大厂工程化实践”观摩机会。
1. 核心技术栈
Claude Code 采用了一套非常现代且高效的 CLI 开发堆栈:
- 开发语言与运行时: 基于 TypeScript 编写,运行在高性能的 Bun 环境下。
- 终端 UI 渲染: 创意性地使用了 React + Ink,像写网页前端一样来构建复杂的终端交互界面。
- 指令与数据校验: 使用 Commander.js 处理命令行参数解析,搭配 Zod v4 进行严格的数据结构(Schema)校验。
2. 高度解耦的工具与命令系统
系统内部设计了强大的扩展能力:
- 40+ 独立工具模块: 每个工具(如负责执行 Shell 的
BashTool、读取文件的FileReadTool、基于 ripgrep 的内容搜索GrepTool,以及派生子代理的AgentTool)都拥有独立的输入规范、权限控制和执行逻辑。 - 50+ 快捷命令(Slash Commands): 涵盖了
/commit、/review、/doctor等完整的日常开发工作流。
3. 灵活的功能开关(Feature Flag)体系
代码中大量使用了编译时变量(通过 Bun 的常量折叠实现)来控制功能上线。例如:
- 区分普通用户与内部员工(
process.env.USER_TYPE === 'ant'),为内部员工开放配置工具和底层调试终端(REPL)。 - 预埋了尚未发布的新特性(如语音模式
VOICE_MODE,以及原本计划作为愚人节彩蛋的 ASCII 桌面宠物BUDDY)。
三、 安全审查:坚固堡垒中的三处“阿喀琉斯之踵”
从源码可以看出,Claude Code 的权限系统经过了精心设计,针对各种常见的终端逃逸攻击(如 Shell 展开、UNC 路径注入等)都有纵深防御。但在极度复杂的系统下,依然暴露出了一些边界漏洞:
- 漏洞 1:白名单匹配规则过宽(越权风险)
系统在校验当前会话的计划(Plan)文件时,仅使用了“前缀匹配”(startsWith)。如果合法文件名为blue-fox,攻击者只需构造名为blue-fox-evil.md的文件,就能绕过权限校验。 - 漏洞 2:多级软链接(Symlink)穿透失败(文件破坏风险)
在处理快捷方式/软链接写入时,程序只解析了“第一层”链接。如果遇到多级嵌套的链接(A 指向 B,B 指向 C),中间的链接文件会被静默覆盖为普通文件,导致原有的目录链接结构被破坏。 - 漏洞 3:跨运行时 WebSocket 不一致(数据丢失风险)
由于 Bun 和 Node.js 在处理 WebSocket 断线重连的回放机制上存在底层行为差异,可能会导致网络波动后的消息丢失。
四、 性能:值得借鉴的极致优化方案
作为一款命令行工具,Claude Code 在启动速度上非常值得前端和 Node.js 开发者学习:
- 毫秒级并发预热: 在主入口文件(
main.tsx)的最顶部,在执行任何耗时的import之前,优先触发底层 MDM 配置读取和系统钥匙串预取。利用后续模块加载耗费的约 135 毫秒“空窗期”进行并行 I/O,成功将整体启动时间压缩了 65 毫秒。 - 激进的懒加载(Lazy Loading): 对于体积庞大的依赖(如 400KB 的 OpenTelemetry 链路追踪组件、700KB 的 gRPC 通信组件),坚决不参与初始化加载,而是使用动态
import(),只有在触发特定功能时才按需加载。
五、 事件影响与排雷指南
对用户与厂商的影响:
此次泄露的是纯客户端代码,不包含任何 AI 模型权重或用户隐私数据,对普通用户无直接安全威胁。 但对于 Anthropic 而言,由于缺乏基础的 CI/CD 自动化校验,导致同样的低级失误连犯两次,在工程严谨性上难免受到业界质疑。
给开发者的避坑指南:
为了避免成为下一个“受害者”,在发布任何公开 NPM 包之前,请务必注意以下几点:
- 收敛打包范围: 在
package.json的files字段中,显式且精确地列出需要发布的文件或目录(如dist/、README.md)。这是最安全的白名单机制。 - 拉黑敏感文件: 配置完善的
.npmignore,坚决排除.env、内部配置文件、私钥,以及最重要的——不要在生产包中包含.map(Source Map)文件。 - CI/CD 自动化拦截: 在自动化部署流水线中加入静态扫描步骤,如果构建产物中包含
.map等敏感后缀,直接阻断发布。
总结
站在自己职业的角度上,这件事情也让我感受颇深。
-
白盒审计的“降维打击”: 源码一旦泄露,系统内部的防御机制对攻击者将完全透明。在实际进行白盒代码审计时,我们深知拿到源码后,去追踪深层的业务逻辑缺陷(比如隐藏极深的 SQL 注入或越权漏洞)有多么致命,这些是纯靠外部黑盒盲扫极难发现的。
-
系统越复杂,安全边界越脆弱: 尽管代码中对路径注入、Shell 展开做了纵深防御,但复杂的权限系统和海量的 Feature Flag 依然导致了白名单匹配过宽、软链接穿透等高危边界漏洞。防御叠得越厚,边缘节点越容易失守。
-
安全左移(DevSecOps)不容忽视: 顶尖 AI 公司的产品,竟未在 CI/CD 流水线中加入基础的静态产物扫描。现代化的渗透测试不能只停留在事后发包扫描,推动在发布流水线中加入自动化安全校验,卡住“低级配置失误”的脖子,同样是安全建设的核心价值。

参考链接
https://mp.weixin.qq.com/s/ssxPswUL-eVdhkcBuwPP_w
https://www.cnblogs.com/yumingwen/p/19803657
更多推荐

所有评论(0)