Claude Code 源码泄露揭示了什么
2026年3月,一个Bun构建缺陷将源码映射文件随 Claude Code npm包一同发布。.map文件包含了完整可读的 TypeScript 源码——每个模块、每条注释、每个内部代号,一览无遗。1 Anthropic 迅速下架了该包,但社区已经提取并分析了全部内部实现。
这不是一篇”看看泄露了什么”的猎奇文章。我维护着互联网上最全面的 Claude Code 指南,每天在其之上运行84个钩子、43个技能和19个智能体。2 这次源码泄露回答了我此前数月通过行为观察逆向工程的诸多问题。以下是一份实践者的分析:源码揭示了 Claude Code 的真实运作方式,以及这对在其之上构建系统的人意味着什么。
摘要: 源码证实,自动模式在每次工具调用时运行一个独立的 Sonnet 4.6 分类器(yoloClassifier.ts);Bash安全机制包含23项编号检查,暗示背后有真实的漏洞利用事件(bashSecurity.ts);提示缓存追踪14个中断向量并采用”粘性锁存”机制;多智能体协调完全通过系统提示指令实现;挫折检测使用正则表达式而非 LLM 推理。指南的底层揭秘章节涵盖了对工具链构建者的启示,本文则完整剖析其架构全貌。
核心要点
- 工具链构建者: 自动模式每次工具调用消耗一次分类器推理。在自主工作流的成本模型中务必将此纳入考量。您的 PreToolUse 钩子是对内置23项Bash验证的补充,而非替代。
- 高级用户: 提示缓存极为脆弱——14个向量均可导致缓存失效。在会话期间保持CLAUDE.md稳定。如果遭遇压缩循环,系统会在3次失败后停止(在引入断路器之前,每天浪费约25万次 API 调用)。
- 安全研究者: Bash安全模块的深度(2,592行代码、Zsh专属防御)表明背后有真实的攻击尝试。每项编号检查都有其来历。
1. 自动模式分类器
内部命名为yoloClassifier.ts的文件长达1,495行。3 它实现了”自动模式”权限系统——即判断每次工具调用应允许、阻止还是询问用户的分类器。
核心发现:自动模式并非提示指令,而是一次独立的模型调用。每次工具调用都由一个 Sonnet 4.6 分类器进行评估,判断该操作是否符合用户声明的意图,而非仅仅判断命令本身是否”安全”。这意味着自动模式每次工具调用都会增加一次分类器推理——实实在在的延迟和成本。
Claude Code 内部暴露了五种权限模式:1
| 模式 | 行为 |
|---|---|
default |
写入、Bash、MCP 操作前询问用户 |
acceptEdits |
自动批准文件编辑,Bash操作仍需询问 |
dontAsk |
无需确认,批准所有操作 |
bypassPermissions |
跳过所有检查(--dangerously-skip-permissions) |
auto |
基于分类器的逐操作决策 |
自动模式的断路器与 Anthropic 公开文档中描述的一致:连续3次或累计20次阻止后切换为手动模式。4 源码证实这是硬性限制,而非柔性建议。
2. Bash安全机制:23项检查,真实事件
Bash验证模块(bashSecurity.ts)共2,592行,包含23项编号安全检查。1 这种深度令人瞩目——每一项检查背后都暗示着一次真实的安全事件。
| # | 攻击向量 | 防御措施 |
|---|---|---|
| 1-3 | Zsh =cmd 扩展 |
阻止 =curl、=wget、=bash 模式 |
| 4-6 | zmodload 入口 |
阻止18个可加载内核模块的Zsh内置命令 |
| 7-9 | Heredoc注入 | 逐行内容匹配,检测注入载荷 |
| 10-12 | ANSI-C引号($'\x41') |
检测混淆命令的模式匹配 |
| 13-15 | 进程替换(<()、>()) |
在不受信上下文中阻止 |
| 16-18 | Unicode零宽空格 | 检测不可见字符注入 |
| 19-21 | ztcp 数据外泄 |
阻止Zsh网络原语 |
| 22-23 | 组合攻击 | 跨多个向量的交叉验证 |
Zsh专属防御尤为值得关注。大多数安全工具以Bash为目标,而 Claude Code 在macOS上运行于Zsh(自Catalina起的默认Shell)。源码显示 Anthropic 发现了Zsh扩展语义所特有的攻击向量。例如=cmd扩展——这是Zsh的一个特性,会将=curl替换为curl的完整路径,从而绕过朴素的命令黑名单。
对于钩子构建者:您的PreToolUse钩子在这23项检查之后运行。您添加的是第二道防线,而非唯一的防线。内置检查处理的是应用层钩子难以捕获的Shell级攻击。
3. 反蒸馏防御
源码揭示了针对训练数据提取的主动防御机制:1
虚假工具注入。 当ANTI_DISTILLATION_CC标志启用时,Claude Code 会向对话中注入诱饵工具定义。这些虚假工具会污染从会话中采集的任何训练数据——在此数据上训练的模型将学到错误的工具模式。
连接文本摘要。 第二道防线缓存工具调用之间的助手文本,返回加密摘要而非原始文本。这使得对话记录对蒸馏毫无用处,同时不影响用户体验。
两种防御都有已知的绕过方式。中间人代理、环境变量覆盖或第三方 API 提供商均可规避。1 这些防御是减速带,而非铜墙铁壁——它们提高了蒸馏成本,但无法从根本上阻止。
4. 隐身模式
undercover.ts约90行,有一个值得注意的特性:没有强制关闭开关。1
该模块隐藏内部代号——“Capybara”、”Tengu”——以及Slack频道、内部代码仓库和其他 Anthropic 基础设施引用。当模型生成的文本包含代号时,隐身模块会在用户看到之前将其改写。
“无法强制关闭”的设计意味着它在所有上下文中运行,包括 Anthropic 员工使用 Claude Code 时。源码还揭示,Anthropic 员工的AI辅助提交在其开源贡献中不显示AI署名——隐身模块会剥除这些标记。
5. 挫折检测
userPromptKeywords.ts通过正则表达式模式匹配脏话来检测用户挫折感。1 这比 LLM 推理调用更快、更省——正则匹配在微秒级完成,而模型调用需要数秒。
触发后,Claude 会调整行为:更谨慎、更明确、更谦逊。如果您曾注意到在表达不满后 Claude 突然变得更加小心翼翼,这就是背后的机制。这种行为转变并非模型的涌现特性,而是工程化地写入了工具链。
6. 提示缓存架构
promptCacheBreakDetection.ts追踪14个不同的缓存中断向量,并采用”粘性锁存”机制。3 粘性锁存意味着,一旦发生缓存中断操作,系统不会尝试恢复缓存——在剩余会话期间缓存将持续失效。
对日常用户的实际影响:
- 重新排列CLAUDE.md中的章节会导致缓存失效
- 会话中途切换扩展思维模式会导致缓存失效
- 更改 MCP 服务器配置会导致缓存失效
- 添加或删除规则文件会导致缓存失效
这14个向量解释了许多高级用户注意到的现象:会话起初运行流畅,随后逐渐变慢。每次配置更改都会累积缓存中断。”粘性锁存”设计意味着即使撤回更改也无法恢复——该会话的缓存已不可逆地失效。
最佳实践: 在开始会话前设定好CLAUDE.md、规则文件和 MCP 配置,会话期间不要修改。
7. 自动压缩断路器
源码注释记录了此前问题的规模:1
“1,279个会话出现了50次以上的连续自动压缩失败(单个会话最高达3,272次),每天浪费约25万次 API 调用。”
修复方案:MAX_CONSECUTIVE_AUTOCOMPACT_FAILURES = 3。连续3次压缩失败后,系统停止自动压缩并抛出错误,而非继续默默消耗Token。
在此断路器引入之前,陷入压缩循环的会话会无限重试——每次重试都消耗压缩提示和响应的Token。在规模化运行下,每天25万次无效 API 调用意味着巨大的基础设施成本。修复仅需三行代码,却每天节省数百万Token。
如果您遇到反复出现的”压缩失败”错误,原因就在于此。系统在保护您免于陷入无限循环,而非出现了故障。
8. 协调器模式:以提示为架构
多智能体协调(coordinatorMode.ts)完全通过系统提示指令实现,而非代码级编排。3 编排器模型接收一个描述如何委派、聚合和综合的提示。下级智能体并非特殊进程——它们是配有不同系统提示的 Claude 实例。
这验证了实践者们独立构建的”以提示为架构”模式。我在《解剖一只利爪》中描述的钩子系统采用了相同方法:调度器、技能和智能体通过提示指令编排,而非代码级控制流。
协调器提示中有一条指令尤为突出:
“永远不要写’根据你的调查结果’——这类措辞将理解工作推卸给了工作者,而非亲自完成。”
这是编码在编排提示中的质量关卡。协调器必须综合提炼,而非简单转发。同样的原则适用于任何多智能体系统:如果编排器只是在专家之间传递消息,那它就没有创造价值。
9. KAIROS:未发布的自主智能体
源码包含对一个名为KAIROS的未发布功能的引用——一个具备持久记忆的自主智能体。1
关键组件:
- 用于夜间记忆蒸馏的/dream技能
- 每日追加写入的日志
- GitHub Webhook用于仓库感知上下文
- 带有5分钟定时刷新的后台守护进程
- 阻止激活的功能开关
KAIROS似乎是 Anthropic 对持久化、始终在线智能体助手的解答。/dream技能尤为引人注目——它暗示模型会在空闲时处理和整合记忆,类似于人类在睡眠中进行记忆巩固的过程。
该功能已设置开关且尚未发布。但它在源码中的存在预示了发展方向:Claude Code 正从基于会话的工具向持久化、后台感知的智能体演进。
10. 伙伴宠物系统
最出人意料的发现之一:Claude Code 包含一个伙伴宠物系统。1
宠物是确定性生成的——基于用户ID的哈希值,使用Mulberry32算法,源码中描述为”用来挑鸭子足够了”。每只宠物有5项属性(调试力、耐心值、混沌度、智慧值、毒舌度)和一个稀有度等级:
| 稀有度 | 概率 |
|---|---|
| 普通 | 60% |
| 非凡 | 25% |
| 稀有 | 10% |
| 史诗 | 4% |
| 传说 | 1% |
宠物以5×12的ASCII精灵图呈现,带有3帧动画。物种代号在源码中以十六进制编码,因为其中一个与未发布的模型名称冲突。
这不是一个玩笑功能,而是一个留存机制。确定性分配意味着您的宠物始终不变,由此产生情感依附。稀有度系统创造了社交货币。ASCII渲染意味着零性能开销。这是一个精心设计的参与系统,隐藏在开发者工具之中。
11. Fork炸弹
一个社区事件揭示了钩子系统的风险。5 一位开发者创建了一个SessionStart钩子,该钩子会生成2个 Claude Code 实例。每个生成的实例又触发同一个钩子,形成指数级增长:1 → 2 → 4 → 8 → 16 → 2^N。
到第二天早上,数百个 Claude Code 实例同时运行。系统免于天价 API 账单,靠的是一个颇为讽刺的机制:每个实例的内存消耗(Bun → React → TUI)导致机器在账单失控之前就已锁死。
钩子构建者须引以为戒:SessionStart钩子必须具备幂等性。如果您的钩子会生成进程,这些进程不能再次触发同一个钩子。一个守卫变量、PID文件或环境标志即可防止递归。
这意味着什么
源码泄露证实了实践者们从行为中推断出的结论:Claude Code 并非 API 调用之上的一层薄封装。它是一个成熟的工程系统,包含安全层、性能优化、行为调节,以及预示产品路线图的未发布功能。
对工具链构建者而言,关键启示已在指南的底层揭秘章节中涵盖。对其他人而言,这次源码泄露提供了罕见的窗口,得以窥见一个生产级AI工具的真实运作方式——不是市场宣传中的描述,而是代码中的实现。
最重要的发现同时也是最朴素的:这个系统远比表面看起来复杂,而这种复杂性的存在事出有因。23项Bash安全检查的存在,是因为发现了23个攻击向量。自动压缩断路器的存在,是因为每天浪费了25万次 API 调用。隐身模块的存在,是因为代号会泄露。每一行防御代码背后都有一个故事。
参考来源
常见问题
Claude Code 源码还能获取吗?
不能。Anthropic 在源码映射被发现后迅速下架了受影响的npm包版本。本文分析基于社区在源码被移除前留存的文档。
源码泄露是否影响 Claude Code 的安全性?
与安全相关的发现(Bash验证、权限系统)描述的是防御机制,而非漏洞。了解Bash安全检查的工作原理并不会使其更容易被绕过——这些检查是确定性的,不依赖于信息不对称。
我是否需要根据这些发现调整 Claude Code 的使用方式?
最具实操价值的发现是提示缓存的脆弱性。如果在会话期间修改CLAUDE.md、规则文件或 MCP 配置,就会导致提示缓存失效。建议在开始会话前完成所有配置。
KAIROS是什么?
在源码中发现的一个未发布的自主智能体功能。它包含持久记忆、夜间蒸馏和后台处理。目前受功能开关控制,尚未对用户开放。
-
Claude Code Source Analysis: Bun Source Map Leak. March 2026. Full readable source exposed via
.mapfiles in the npm package due to a known Bun build bug. ↩↩↩↩↩↩↩↩↩↩ -
Anatomy of a Claw: 84 Hooks as an Orchestration Layer. Blake Crosley, February 2026. ↩
-
Claude Code Source Deep Dive: Architecture Internals. March 2026. Technical analysis of coordinator mode, prompt cache detection, and anti-distillation defenses. ↩↩↩
-
Claude Code Auto Mode Documentation. Auto Mode architecture: classifier-based permission system, circuit breaker thresholds. ↩
-
Claude Code Fork Bomb Incident. March 2026. SessionStart hook exponential spawning, saved by memory exhaustion. ↩