Cloude Code源码泄露 我们扒出了这些
SUMMARY
2026年3月31日,Anthropic 在 npm 上发布 Claude Code 时意外打包了 59.8MB 的 source map,1906 个 TypeScript 源文件完整泄露。7 小时后包被撤回,但备份已遍布 GitHub。
我花了两天时间翻这些源码,扒出了 KAIROS 自主 Agent 模式、反蒸馏防御、23 项 Bash 安全检查、虚拟宠物彩蛋等关键发现。下面是完整解读。
> 01. KAIROS:下一代 Claude Code 的真实形态
先说最重磅的发现。
源码里有一个 feature flag 叫 KAIROS。它的定义是 “assistant mode”——自定义系统提示词、简化交互视图、定时检查技能。
KAIROS 不是一个功能改进,它是一种全新的运行模式。你可以把它理解为钢铁侠的 JARVIS——一个全天候在后台运行的自主 Agent。它不需要你打开终端输入命令。它自己就在跑。
具体来说,KAIROS 模式下的 Claude Code 支持这些能力:
GitHub webhook 监听:有人给你的仓库提了 PR?Claude 自动接收通知、开始审查。
cron 定时任务:每天凌晨 2 点跑一遍代码质量扫描?设一次就行。
MCP channel 通知:和外部系统实时联动。
后台守护进程:不需要打开 Claude Code,它就在那里。
append-only 日志:所有操作写入不可篡改的日志,可追溯、可审计。
5 分钟刷新周期:定期检查是否有新任务进来。
INSIGHT
KAIROS 标志着 Claude Code 从”你告诉它做什么,它做什么”的工具,进化成”它自己知道该做什么”的助理。这是 Claude Code 的第二形态。
/dream:夜间记忆蒸馏
源码里有一个叫 /dream 的技能,功能描述是 “nightly memory distillation”(夜间记忆蒸馏)。
Claude Code 在你一天的使用过程中,会积累大量零散的上下文——你改了哪些文件、遇到了什么 bug、你的编码偏好是什么、哪些决策背后有什么理由。这些信息散落在各个会话里,彼此之间可能有矛盾、有重复、有模糊地带。
/dream 干的事情是:在你下班之后,在深夜自动对这些记忆进行整理。源码里描述了这个过程的具体步骤:
1. 合并分散观察:把多个会话中对同一件事的描述合并成一条
2. 消除逻辑矛盾:如果早上你说”这个模块不需要缓存”,下午又加了缓存,Claude 会识别出来并更新认知
3. 将模糊洞察转化为确定事实:把”用户好像偏好用 interface 而不是 type”变成”用户在 90% 的场景下使用 interface”
还有一个 autoDream 功能——不需要你手动触发,Claude 检测到你空闲时自动执行。
TIP
白天采集信息,夜间整理记忆,第二天醒来时认知更清晰——这不就是人类睡眠时大脑做的事吗?Anthropic 是在给 Claude Code 造一个”睡眠周期”。
> 02. 反蒸馏机制:Anthropic 怎么防别人偷模型
如果说 KAIROS 让我兴奋,那么反蒸馏机制让我佩服。这两套防御方案藏在代码的不同角落,但组合起来形成了一套相当精密的护城河。
假工具注入
在 claude.ts 的第 301-313 行,有一段逻辑:当 tengu_anti_distill_fake_tool_injection 这个 feature flag 开启时,系统会向 API 请求中注入 anti_distillation: [‘fake_tools’]。
知识蒸馏(distillation)是 AI 行业公开的秘密。竞争对手可以录制 Claude 的 API 流量——你发什么请求、Claude 返回什么响应——然后用这些数据训练自己的小模型。
假工具注入的防御思路很直接:在 API 响应中混入虚假的工具定义。如果你老老实实用 Claude Code,这些假工具不会被调用,对你零影响。但如果有人录制流量用于训练,这些假工具定义会被模型学习进去——训练出来的模型会在不该调用工具的时候调用不存在的工具,表现异常。
INSIGHT
数据投毒。简单粗暴但有效——你可以复制我的输出,但你学不到正确的行为模式。
连接文本摘要
在 betas.ts 的第 279-298 行,还有第二道防线。服务端会缓冲工具调用之间的助手文本(Claude 的”思考过程”),然后返回一个加密签名的摘要,而不是完整的推理链。
这意味着即使有人完整录制了 API 流量,他们看到的也只是一串加密过的摘要,而不是 Claude 真正的推理步骤。没有过程,蒸馏出来的模型就只能学到”输入 A 对应输出 B”,学不到”为什么 A 应该对应 B”。这在复杂推理任务上的差距是致命的。
卧底模式
源码里有一个 undercover.ts 文件。它的功能是:当 Claude Code 在外部仓库(非 Anthropic 内部仓库)中使用时,自动剥离所有内部引用——包括代号”Capybara”、”Tengu”,内部 Slack 频道名称,甚至隐藏 “Claude Code” 自身的名称。
最有意思的是一行注释:
undercover.ts
// There is NO force-OFF. This guards against model codename leaks.
没有关闭开关。这个防护是硬编码的、不可绕过的。考虑到他们刚刚泄露了 “Mythos” 代号,这个设计多少有点讽刺。但从工程角度看,这是对的——人会犯错,所以要靠系统兜底。
> 03. 安全架构:比你想象的更偏执
Claude Code 让 AI 在你的终端里执行命令。这意味着安全不是加分项,而是生死线。看了源码之后,我觉得 Anthropic 在安全上确实下了狠功夫。
Bash 安全:23 项检查
bashSecurity.ts 里实现了 23 项编号检查,覆盖了几乎所有攻击向量:
18 个被屏蔽的 Zsh 内建命令:像 eval、source 这类可能被滥用的命令,直接禁掉
零宽空格注入防御:检测并拒绝在命令中插入肉眼不可见的零宽空格字符的攻击
IFS null-byte 注入预防:通过修改 shell 的内部字段分隔符来劫持命令解析的攻击,也被封堵了
WARNING
这三个例子已经超出了大部分开发者对”命令行安全”的认知范围。零宽空格注入和 IFS null-byte 注入——说实话,我是看了源码才知道这两种攻击方式的。
客户端认证:加密级别的身份证明
system.ts 的第 59-95 行揭示了一个精巧的认证机制。API 请求中会包含一个 cch=00000 的占位符。在请求发出之前,Bun 的原生 HTTP 栈(底层基于 Zig 语言实现)会在传输层把这个占位符替换为一个计算出的哈希值。
这个哈希值是一个加密证明,证明这个请求来自合法的 Claude Code 二进制文件。为什么用 Bun/Zig 而不是 Node.js 的 HTTP 库?因为 Bun 的 HTTP 栈是原生编译的,替换操作发生在 JavaScript 运行时之外——你没法通过 monkey-patching Node.js 的 http 模块来拦截或伪造这个哈希。
INSIGHT
把安全关键逻辑下沉到运行时底层——你想绕过它,就得逆向工程整个 Bun 运行时。成本极高。
> 04. 彩蛋时刻:宠物系统和粗口检测
扒源码最有趣的部分,永远是发现那些和主线功能无关的东西。
BUDDY:Tamagotchi 风格的虚拟宠物
buddy/companion.ts 里藏着一个完整的虚拟宠物系统。18 个物种,有稀有度分级,1% 的概率出”闪光”个体(对,就像宝可梦的闪光概率)。宠物从你的用户 ID 通过 Mulberry32 伪随机数生成器确定性生成——同一个用户永远得到同一只宠物。
更有趣的是实现细节:物种名称用 String.fromCharCode() 编码,而不是直接写字符串。为什么?我的猜测是为了规避构建系统的静态分析——如果代码里直接出现 “dragon” 或者 “unicorn”,可能会被 code review 或者自动化检查标记出来。
TIP
考虑到源码泄露是 3 月 31 日,第二天就是 4 月 1 日——这几乎确定是 2026 年愚人节彩蛋。想象一下终端里多了一只像素风的小龙,写出 bug 的时候愁眉苦脸,测试全绿的时候手舞足蹈。可惜被泄露毁了惊喜。
挫折检测:比 LLM 推理便宜 1000 倍的情绪分析
userPromptKeywords.ts 里有一组正则表达式,用来检测用户的情绪状态。匹配规则很直白——”wtf”、”damn it”、”this sucks”、”are you stupid” 之类的关键词。检测到之后,Claude 会调整响应策略。
为什么不直接让 LLM 分析用户情绪?答案是成本和延迟。一次 LLM 调用要花几十毫秒到几百毫秒,还要消耗 token。一次正则匹配?微秒级,零成本。而且对于”用户在骂人”这种二分类问题,正则匹配的准确率足够用了——你不需要理解用户骂人的深层原因,你只需要知道他在骂人。
INSIGHT
不是所有问题都需要 AI 来解决。有时候一个正则表达式就够了。这是一个很好的工程决策。
> 05. 代码质量:光环之下的阴影
泄露的源码不全是让人拍案叫绝的东西,也有让人摇头的部分。
print.ts:5594 行的巨型文件
print.ts 是整个代码库里最长的文件,5594 行。其中有一个单独的函数,长达 3167 行,嵌套深度达到 12 层。
3167 行的函数。你没看错。
WARNING
无论理由多充分,3167 行的函数在任何 code review 里都应该被打回去。这是 Claude Code 的终端渲染核心——处理 Markdown 渲染、代码高亮、表格对齐、diff 显示、可折叠区域等各种边界情况。
有意思的是,这个文件里也藏着一些非常聪明的优化。终端渲染使用了游戏引擎常见的技术:Int32Array 做 ASCII 字符池,token 流式输出时 stringWidth 调用减少约 50 倍。这是用底层数据结构优化热路径的教科书案例。
一个文件里同时存在”最差实践”和”最佳实践”。这大概就是真实世界里的工程:deadline 到了,先把功能搞出来,技术债以后再还。
Axios 依赖:迷惑行为
源码显示 Claude Code 依赖 Axios 做 HTTP 请求。考虑到 Bun 已经内置了高性能的 fetch API,加上 Axios 近期在 npm 上出过远程访问木马变种事件(axois、ax1os 等仿冒包),一个在安全上如此偏执的项目依赖一个在供应链安全上有过前科的库,这个选择至少值得讨论。
TIP
我猜这是历史遗留——项目早期用 Node.js 写的时候引入了 Axios,迁移到 Bun 之后没有清理。技术债的经典样本。
> 06. 这件事对谁影响最大
对 Anthropic:短痛还是长痛?
说短痛,因为源码泄露了但核心护城河没有被攻破。Claude Code 的真正壁垒是三样东西:模型能力、推理成本、云端基础设施。这三样东西都不在 source map 里。你看到了客户端代码的全部实现,但你看不到服务端的模型权重、训练数据、推理优化。
说可能长痛,因为 KAIROS 的存在暴露了 Anthropic 的产品路线图。竞争对手现在知道了 Claude Code 正在往”全天候自主 Agent”的方向走,知道了 brief/channel/cron/team/remote control/GitHub webhook/assistant mode 怎么串成闭环。这给了 GitHub Copilot、Cursor、Windsurf 等竞品一个免费的产品调研报告。
对企业用户:信任问题
对企业用户来说,最刺痛的不是”Claude Code 源码被看了”,而是”连 source map 都能带着发出去”。这暴露的是发布流程的问题。一个面向企业客户的 AI 编程工具,release review 里没有人检查包的大小从 10MB 突然变成 70MB?
WARNING
这件事本身不影响 Claude Code 的功能安全性(source map 泄露的是客户端代码,不影响用户数据安全),但它影响信任。企业买单买的不仅是产品,还有”这家公司靠谱”这个隐含假设。连续两次安全失误会让采购决策者多想一下。
对开发者:免费的架构课
如果你是 AI 开发者或者对 agent 架构感兴趣,这次泄露其实是一份意外的学习材料。几个值得细看的点:
反蒸馏的工程实现:假工具注入和文本摘要的组合拳,如何在不影响用户体验的前提下保护模型
Bash 安全的全面性:23 项检查覆盖了从常见到冷门的各种攻击向量,是”如何让 AI 安全执行 shell 命令”的参考答案
KAIROS 的架构设计:一个后台自主 Agent 需要哪些基础设施(webhook、cron、守护进程、日志、刷新周期),信号是如何流转的
游戏引擎技术在终端渲染中的应用:Int32Array 字符池这种优化思路,适用于任何需要高频字符串处理的场景
对行业:Agent 战争的信号弹
KAIROS 的存在确认了一个趋势:AI 编程工具的竞争正在从”辅助编码”升级到”自主代理”。不是”你打字,AI 补全”,而是”你定义目标,AI 全权执行”。
Claude Code 的方向是让 AI 成为一个 7×24 小时在线的队友:它自己审查 PR、自己跑定时任务、自己整理记忆、自己检测你的情绪。你需要做的越来越少。
INSIGHT
如果 Anthropic 在内部已经把 KAIROS 做到了 feature flag 阶段,说明这不是概念验证,而是即将上线的产品。竞品需要加速了。
> 07. 最后说两句
这次泄露事件本身是一个安全事故,但它意外地给了我们一个观察 AI 编程工具内部的窗口。
我从中看到的最重要的信号是:Claude Code 不满足于做一个聊天式的编程助手。KAIROS + /dream + 反蒸馏 + 安全架构,这套组合拳指向的是一个有自主意识的开发伙伴——它有记忆、有判断、有自我保护能力、有后台运行的生命周期。
当然,源码被看到不等于能被复制。就像你可以参观一个米其林厨房,看到所有的锅碗瓢盆和摆盘技巧,但做不出同样的菜——因为你没有那个厨师。
Anthropic 最核心的资产是 Claude 模型本身。源码泄露伤害的是品牌信任,不是技术壁垒。
但我确实希望他们能把发布流程修一修。两次了。
夜雨聆风