Claude Code源代码泄露揭示了什么
2026年3月,一个Bun构建bug将源映射文件随Claude Code的npm包一起发布。这些.map文件包含了完整可读的TypeScript源代码:每一个模块、每一条注释、每一个内部代号。1 Anthropic迅速下架了该包,但社区已经提取并分析了其内部实现。
Claude Code源代码泄露揭示:自动模式为每次工具调用运行一个独立的Sonnet 4.6分类器,bash安全采用23项编号检查(暗示存在真实的漏洞利用事件),提示缓存追踪14种破坏向量并配备粘性锁存器。 源代码还暴露了使用虚假工具注入的反蒸馏防御机制、一个剥离内部代号且没有强制关闭开关的隐身模块,以及完全通过系统提示指令而非专用协议代码实现的多智能体协调。
我不是在写一篇”看看泄露了什么”的文章。我维护着互联网上最详尽的Claude Code指南,并在其上每天运行84个钩子、43个技能和19个智能体。2 源代码泄露回答了我通过数月行为观察进行逆向工程才摸索出的问题。下文是一位实践者对源代码揭示的Claude Code实际工作原理的分析,以及这些发现对在其之上构建系统的人意味着什么。
TL;DR: 源代码证实:自动模式为每次工具调用运行一个独立的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会向对话中注入诱饵工具定义。虚假工具会污染从会话中收集的任何训练数据。基于污染数据训练的模型会学到错误的工具模式。
连接器文本摘要。 第二重防御会缓冲工具调用之间的助手文本,并返回加密摘要而非原始文本。这些摘要使对话记录在蒸馏用途上失去价值,同时保留用户体验。
两种防御均存在已知的绕过方法。MITM代理、环境变量覆盖或第三方API提供商都可以绕过它们。1 这些防御的作用是减速带而非城墙:提高蒸馏成本但无法完全阻止。
4. 隐身模式
undercover.ts大约90行,有一个值得注意的特性:没有强制关闭开关。1
该模块隐藏内部代号(”Capybara”、”Tengu”)、Slack频道、内部代码仓库以及其他Anthropic基础设施引用。当模型生成包含代号的文本时,隐身模块会在用户看到输出之前重写它。
“无强制关闭”的设计意味着该模块在所有上下文中都会运行,包括Anthropic员工使用Claude Code时。源代码还揭示,来自Anthropic员工的AI生成提交在其开源贡献中不带AI署名,因为隐身模块剥离了这些标记。
5. 挫败感检测
userPromptKeywords.ts通过对脏话的正则模式匹配来检测用户挫败感。1 正则以微秒计算,模型调用则需数秒。速度与成本差异解释了这一设计选择。
触发时,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实例。
该设计验证了实践者独立构建的”提示即架构”模式。我在Anatomy of a Claw中描述的钩子系统采用了相同方法:调度器、技能与智能体通过提示指令而非代码级控制流来运作。
协调器提示中的一条指令尤为突出:
“绝不写’based on your findings’——这些短语将理解委派给工作者,而非自己完成。”
该指令充当一个编码在编排提示中的质量门。协调器必须综合,而非转述。同一原则适用于任何多智能体系统:如果编排器只是在专家之间传递消息,它就没有增加价值。
9. KAIROS:未发布的自主智能体
源代码中包含对一个未发布功能的引用,名为KAIROS——一个具有持久记忆的自主智能体。1
关键组件:
- 用于夜间记忆蒸馏的/dream技能
- 每日仅追加日志
- 用于代码仓库感知上下文的GitHub webhook
- 具有5分钟cron刷新的后台守护进程
- 阻止激活的功能门
KAIROS似乎是Anthropic对持久化、始终在线的智能体助手的回应。/dream技能尤为有趣,因为它暗示一个在空闲时处理并整合记忆的模型,类似于人类在睡眠期间的记忆整合。
功能门阻止激活,Anthropic也尚未发布KAIROS。但它在源代码中的存在昭示了方向:Claude Code正在从一个基于会话的工具演化为一个持久、后台感知的智能体。
10. 伙伴宠物系统
更令人意外的发现之一:Claude Code包含一个伙伴宠物系统。1
每个宠物都是确定性的,通过Mulberry32算法从用户ID的哈希派生而来,源代码将其描述为”足以用于挑鸭子”。每个宠物有5项属性(DEBUGGING、PATIENCE、CHAOS、WISDOM、SNARK)和一个稀有度等级:
| 稀有度 | 概率 |
|---|---|
| 普通 | 60% |
| 不常见 | 25% |
| 稀有 | 10% |
| 史诗 | 4% |
| 传说 | 1% |
系统将宠物渲染为带3帧动画的5x12 ASCII精灵图。源代码对物种代号进行了十六进制编码,因为其中一个与未发布的模型名称冲突。
伙伴系统不是玩笑功能,而是一种留存机制。确定性分配意味着您的宠物始终相同,由此产生依恋。稀有度系统创造社交货币。ASCII渲染意味着零性能开销。Anthropic构建了一个精心设计的参与系统,并将其隐藏在开发者工具内部。
11. 分叉炸弹
一起社区事件说明了钩子系统的风险。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源代码分析:Bun源映射泄露. 2026年3月。由于已知的Bun构建bug,npm包中的
.map文件暴露了完整可读的源代码。 ↩↩↩↩↩↩↩↩↩↩ -
Anatomy of a Claw:84个钩子作为编排层. Blake Crosley,2026年2月。 ↩
-
Claude Code源代码深度剖析:架构内部. 2026年3月。协调器模式、提示缓存检测与反蒸馏防御的技术分析。 ↩↩↩
-
Claude Code自动模式文档. 自动模式架构:基于分类器的权限系统、断路器阈值。 ↩
-
Claude Code分叉炸弹事件. 2026年3月。SessionStart钩子指数级生成,因内存耗尽而得以挽救。 ↩