Claude Code 源码泄露事件深度剖析

作者:吴佳浩
撰稿时间:2026-3-31
最后更新:2026-4-1
一行
.map文件,让价值数百亿美元的 AI 编程工具"裸奔"了。
📌 事件速览
2026年3月31日,安全研究员 Chaofan Shou 在 X 上发了一条简短的帖子:
"Claude code source code has been leaked via a map file in their npm registry!"
翻译成人话:Claude Code 的源代码,因为一个 .map 文件,彻底泄露了。
没有黑客攻击,没有内鬼,没有高级漏洞利用------
就因为发 npm 包的时候,忘了把 source map 文件删掉。
1️⃣ 发生了什么
Source Map 是什么?(前端同学一带而过,后端和AI同学可以看看)
先科普一下,Source Map(.map 文件)是现代前端工程里的标配工具。
正常发布流程是这样的:
Source Map 的核心就是一个 JSON 文件,里面有两个关键数组:
| 字段 | 作用 |
|---|---|
sources |
原始文件路径列表 |
sourcesContent |
对应的完整源代码 |
只要有这个文件,任何人不需要反编译、不需要逆向,直接打开就是原始 TypeScript 代码。
Source Map 只能在开发调试环境使用,绝对不应该出现在生产发布包里。
Anthropic 这次不仅带了这个文件,还带了 sourcesContent------等于把源码和钥匙一起塞进了快递包裹。
具体有多严重?
| 数据项 | 数值 |
|---|---|
| npm 包版本 | v2.1.88 |
| 包体积暴涨 | 17MB → 31MB(多了14MB) |
.map 文件大小 |
57MB |
| 泄露源文件数 | 1906 个 |
| 代码总量 | 512,000 行 TypeScript |
| 工具数量 | ~40 个内置工具 |
| Slash 命令 | ~50 个 |
| 暴露内容 | 工具逻辑 + 权限系统 + 未发布功能 |
Anthropic 事后立刻删除了这个文件,但 npm 包一旦发布就收不回来了------源码已经在社区疯狂流传。
更讽刺的是:这不是第一次。
早在2025年2月,Claude Code 刚上线 npm 时就因为同样的原因泄露过一回,后来修掉了。一年后,最新版 v2.1.88 又把 source map 打进去了。
2️⃣ 泄露了什么------Claude Code 内部架构全览
整体架构:四层体系
Claude Code 不是一个简单的"聊天包装器",它是一个完整的工程级 AI Agent 系统。
46,000 行] COORD[Coordinator
多Agent协调] end subgraph TL["工具层"] FT[File/终端工具] WEBTOOLS[Web工具] AGENT[Agent编排] IDE[LSP/Jupyter] MCP[MCP集成] end subgraph MEM["记忆层"] DREAM[autoDream
记忆整理] MEMMD[MEMORY.md
持久化] COMPACT[上下文压缩] end subgraph SEC["安全层"] PERM[权限分级] SANDBOX[沙箱] GUARD[路径防护] end UL --> ML ML --> TL TL --> SEC MEM --> ML
从外到内,一层层来看:
第一层:用户层------三种入口
VS Code / JetBrains] A --> D[浏览器 UI
给 ULTRAPLAN 用] B <--> E[JWT 双向认证] C <--> E D <--> E E[Bridge 通信层]
- 终端 CLI:核心入口,用 React + Ink 渲染(是的,命令行界面用 React 写的)
- IDE 插件:通过 Bridge 层和 CLI 双向通信
- 浏览器 UI:为 ULTRAPLAN 预留的远程规划界面
第二层:编排层------46,000 行的大心脏
Query Engine 是整个 Claude Code 最大最核心的模块,占了约 46,000 行代码。
它负责所有 LLM API 调用、流式响应、缓存和上下文编排。
开启 Coordinator Mode 后,还能变成多 Agent 调度中心,同时管理多个并行的 worker agent。
第三层:工具层------40+ 工具有权限门控
Claude Code 的工具系统不是随手拼的,每个工具都通过 getAllBaseTools() 注册,按 feature gate、用户类型、环境变量过滤后才暴露给模型。
有个值得注意的细节:工具有 schema 缓存机制 (toolSchemaCache),避免每次都重新序列化 JSON schema 给模型------这是不错的小优化。
第四层:记忆系统------AI 真的在"做梦"
Claude Code 源码里有一个叫 autoDream 的后台记忆整理引擎。Anthropic 的工程师给它起了个浪漫的名字------Dream。
系统 prompt 原文:
"You are performing a dream - a reflective pass over your memory files. Synthesize what you've learned recently into durable, well-organized memories so that future sessions can orient quickly."
翻译:AI 在做梦,把最近学到的东西整理成持久化的记忆。
Dream 的触发条件极其严格,有三重门控:
- Phase 1 Orient:扫描 memory 目录,读取 MEMORY.md,浏览现有主题文件
- Phase 2 Gather:采集新信号,优先级:每日日志 → 漂移的记忆 → 对话记录搜索
- Phase 3 Consolidate:写入或更新记忆文件,把相对日期转成绝对日期
- Phase 4 Prune:MEMORY.md 必须控制在 200 行以内,不超过 25KB
Dream 子 agent 只有只读 bash 权限,它能看项目但不能改任何东西------纯粹的记忆整理。
3️⃣ System Prompt:110+ 碎片动态拼装
大多数 AI 应用的 system prompt 是一个写死的字符串。Claude Code 不是。
可跨组织缓存] A --> C[动态段
每次请求重建] B --> B1[核心人格指令] B --> B2[24个工具描述] B --> B3[安全边界
CYBER_RISK_INSTRUCTION] B --> B4[输出格式规范] C --> C1[CLAUDE.md
项目指令] C --> C2[Output Style
会话风格] C --> C3[用户偏好] C --> C4[环境变量] C --> C5[Feature Flags]
五种内容注入机制:
| 机制 | 注入位置 | 触发方式 | 作用域 |
|---|---|---|---|
| CLAUDE.md | 用户消息(system-reminder) | 自动 | 项目级 |
| Output Style | system 数组 | 手动 | 会话级 |
| Slash Command | 用户消息(command-message) | 用户显式调用 | 单轮 |
| Skill | 用户消息(tool_result) | 模型自主决定 | 单轮 |
| Sub-Agent | 独立对话 | 模型自主决定 | 隔离 |
拼装完的 system prompt 大约 24,000 tokens。加上 40 多个工具描述,每次 API 调用之前就要消耗大量上下文窗口。
还有一个命名很有意思的函数:DANGEROUS_uncachedSystemPromptSection()。
一看这名字就知道------某个工程师曾经因为把不该缓存的内容放进了缓存段,被坑过一次,然后干脆起了这个名字提醒后人。
4️⃣ 多 Agent 协调器:并行是超能力
Claude Code 可以从单 agent 变成指挥官,同时调度多个 worker agent 并行干活。
多 worker 并行调研] R --> S[Synthesis
coordinator 读取所有发现
制定实施规范] S --> I[Implementation
多 worker 按规范
各自实现模块] I --> V[Verification
运行测试验证改动] V --> END[任务完成] R --> |并行| W1[Worker 1] R --> |并行| W2[Worker 2] R --> |并行| W3[Worker N] style R fill:#b3e5fc style S fill:#c8e6c9 style I fill:#ffe0b2 style V fill:#d1c4e9
Workers 之间用 <task-notification> XML 消息通信。有共享的 Scratchpad 目录,跨 worker 持久化共享知识。
System prompt 里有一句话很能代表设计理念:
"Parallelism is your superpower. Workers are async. Launch independent workers concurrently whenever possible --- don't serialize work that can run simultaneously."
翻译:并行是你的超能力。只要能同时跑的任务,就不要串行。
还有一个反偷懒规则:
"Do NOT say 'based on your findings' --- read the actual findings and specify exactly what to do."
Coordinator 不能甩锅,必须自己读完发现再下精确的指令。
5️⃣ 藏在代码里的彩蛋------未发布功能全曝光
这是最让开发者兴奋的部分。Claude Code 源码里藏了不少从未公开的功能,全部通过编译时 feature flag 门控,外部版本看不到------但 source map 不管这套,编译前的源码全在里面。
BUDDY:终端里养电子宠物
Claude Code 内置了一个完整的 Tamagotchi 式宠物系统。18种生物,用 Mulberry32 PRNG 确定性抽卡------同一个用户永远抽到同一只。
| 稀有度 | 概率 | 物种 |
|---|---|---|
| Common | 60% | Pebblecrab, Dustbunny, Mossfrog, Twigling, Dewdrop, Puddlefish |
| Uncommon | 25% | Cloudferret, Gustowl, Bramblebear, Thornfox |
| Rare | 10% | Crystaldrake, Deepstag, Lavapup |
| Epic | 4% | Stormwyrm, Voidcat, Aetherling |
| Legendary | 1% | Cosmoshale, Nebulynx |
每只宠物有 5 个属性(DEBUGGING/PATIENCE/CHAOS/WISDOM/SNARK),6 种眼睛样式,8 种帽子。5 行高、12 字宽的 ASCII Art 渲染,有待机动画和反应动画。
代码里标注的预告窗口:2026年4月1-7日(今天是4月1日!),正式上线计划在5月。
物种名在代码里用 String.fromCharCode() 数组做了混淆------Anthropic 明确不想让这些名字被字符串搜索找到。结果 source map 完全不吃这套。
KAIROS:永不睡觉的 Claude
一个常驻运行模式,Claude 不等你打字,它自己主动观察和行动。
直接推文件] F --> G2[PushNotification
推送通知] F --> G3[SubscribePR
订阅 PR 活动] style A fill:#ffcdd2 style F fill:#c8e6c9
维护每日日志,定期收到 <tick> 提示来决定要不要主动做什么。有个 15 秒阻塞预算------任何主动操作如果会阻塞用户超过 15 秒,就延后执行。
说得直白点:KAIROS 就是7×24小时在线的全能助手。OpenClaw 管得了的它要管,OpenClaw 管不了的它更要管。
ULTRAPLAN:让 Opus 4.6 替你想 30 分钟
复杂规划任务可以扔到远程的 Cloud Container Runtime,跑 Opus 4.6 模型,给它最多 30 分钟的思考时间。
结果"传送"回本地 CLI-->>User: 终端显示最终规划
Penguin Mode
快速模式的内部代号。API 端点是 /api/claude_code_penguin_mode,配置 key 是 penguinModeOrgEnabled,熔断开关是 tengu_penguins_off。
全是企鹅。 Anthropic 的工程师给快速模式起名企鹅,原因不明,但很可爱。
6️⃣ 权限安全体系:比想象中复杂得多
Claude Code 的权限系统不是简单的 allow/deny,而是多层级精密设计。
三级风险分类:
| 等级 | 处理方式 |
|---|---|
| LOW | 直接放行 |
| MEDIUM | YOLO 分类器(基于上下文的 ML 模型)自动判断 |
| HIGH | 必须用户手动授权 |
还有个细节:当 Claude 需要你授权一个操作时,它解释风险的那段话本身也是 LLM 生成的。
你看到的"此命令将修改你的 git 配置"------这句话是 Claude 用另一次 LLM 调用写出来的。
Undercover Mode:最讽刺的彩蛋
Claude Code 里有一套叫 Undercover Mode 的系统,专门防止 AI 在提交代码时泄露 Anthropic 的内部信息。
给开源项目贡献代码] --> B{是否内部仓库?} B -->|不确定| C[自动激活卧底模式] B -->|确认是内部| D[正常使用] C --> E[注入特殊 System Prompt] subgraph RULES["禁止事项"] R1[禁止动物代号
Capybara, Tengu等] R2[禁止未发布版本号
opus-4-7, sonnet-4-8] R3[禁止内部仓库名] R4[禁止内部 Slack 频道名] R5[禁止提及 Claude Code
或暗示自己是 AI] end E --> RULES
Anthropic 的工程师花了心思做了这个防泄露子系统,然后用一个 .map 文件把整个源码(包括 Undercover Mode 的代码)一次性泄了个干净。
最讽刺的是:这没有强制关闭选项------"如果我们不确定这是内部仓库,就保持卧底状态。"
这意味着:你在 GitHub 上看到的很多"人类"贡献者,搞不好背后是 Claude Code 在干活。
7️⃣ 技术栈全景图
(非 Node.js)"] UI["终端 UI:React + Ink
(用 React 写命令行)"] CLI["CLI 框架:Commander.js"] TYPE["类型校验:Zod v4"] SEARCH["搜索:内置 ripgrep"] PROTOCOL["协议:MCP SDK / OpenTelemetry"] FEATURE["功能开关:GrowthBook"] end TECH --> REASON["选择 Bun 的原因:
① 启动更快
② 死代码消除更彻底
③ Feature flag 走编译时消除"] style UI fill:#fff9c4 style RUNTIME fill:#e3f2fd
用 React 写命令行界面这个选择挺有意思。Ink 这个库让 React 组件能跑在终端里,Anthropic 在生产级产品里用上了------那些看起来很简陋的终端交互效果,原来都是 React 组件渲染出来的。
8️⃣ 整个行业怎么看
社区反应:有人欢喜有人愁
GitHub 上的泄露仓库几个小时就涨了 6600+ Star、10000+ Fork。Issue 区变成了大型合影留念现场,绝大部分是中文用户在打卡:
- "终于可以一睹源码了"
- "笑死了全是国人"
- "国产 agent 你崛起罢"
- "不久后国内:XXagent 震撼首发"
开发者社区的共识:广泛获取 Claude Code 的架构最终是有益的。代码现在已经永久可用,互联网不会遗忘。
对 Anthropic 的冲击
| 影响维度 | 具体表现 |
|---|---|
| 技术泄露 | 上下文压缩策略、工具调用设计、权限模型全被研究 |
| 安全风险 | 安全漏洞面的扩大,攻击门槛降低 |
| 品牌形象 | "做 AI 安全的公司,栽在 npm 配置上" |
| 资本信任 | Anthropic 可能2026年 IPO,这种失误影响管理成熟度评估 |
| 竞争格局 | Claude Code 年化收入占 Anthropic 总收入 18%,且3个月内翻倍------现在是关键期 |
更糟的是:这不是孤立事件。
就在5天前(3月26日),一次 CMS 配置错误就暴露了未发布的 Claude Mythos 模型细节。三天后,又来了一次 npm 配置失误。
两次事故,五天之内。一个是内容管理系统,一个是 npm 包管理。
这不是随机意外,这是组织内部工程流程和发布安全管控存在系统性问题的信号。
开发者从中学到什么
一位正在构建 AI 应用的开发者 @devmelv 总结了四点观察:
① 上下文处理不是后期功能 Claude Code 的 CLAUDE.md 在每一轮对话中都会被加载,不只是会话开始时。持久化、结构化的上下文是从第一天起就要承载一切的基础架构。
② 围绕定价模型设计产品 Claude Code 派生子 agent 时,创建与父上下文完全相同的字节副本。API 会对缓存。5 个智能体的成本≈1个,因为都命中了同一个提示缓存。这是产品层面的设计决策,不是性能优化。
③ 摩擦点 = 配置问题 Claude Code 的每一次权限弹窗都被视为配置的失败。他们用 AI 来决定 AI 能做什么。AI 产品中的每个摩擦点,本质上都是一个配置问题。
④ 为连续性而设计 每个会话都保存到 JSONL 文件。用户可以恢复、分支、继续。大多数人每次都重新开始------这丢弃了模型已经了解到的所有信息。
9️⃣ 启示:这件事告诉我们什么

总结
一家做 AI 安全的公司,因为构建配置没管好把自家源码全泄了,这个剧情是真的讽刺。
但换个角度看,这 51 万行代码展示了一个事实:现在最好用的 AI 编程工具,技术栈并不神秘。
React + Ink + Bun + 一套精心设计的工具注册系统。
真正的壁垒还是在模型能力上。
源码已经泄了,但 Claude Code 不会因此变得更弱。该好用还是好用。
有些东西,藏不住也没必要藏。
参考来源**