Claude Code 源码泄露:伪造工具、挫败感正则、卧底模式及更多
Anthropic 在其 npm 包中意外附带了源映射文件,导致 Claude Code 完整源码暴露。本文带你深挖其中的核心细节。
以当邵超凡(Chaofan Shou)今早发现,Anthropic 在 Claude Code 的 npm 包中附带了一个 .map 源映射文件(包含 CLI 工具完整可读源码)时,我立刻就想一探究竟。该 npm 包随后已被下架,但源码早已被广泛镜像,并且在黑客新闻上被逐一拆解。
这是 Anthropic 一周内第二次意外泄露(几天前刚发生模型规格泄露),推特上已经有人怀疑是内部人员故意为之。大概率并非如此,但无论如何都很不光彩。时间点也很耐人寻味:就在十天前,Anthropic 还向 OpenCode 发送律师函,迫使后者移除内置的 Claude 认证,原因是第三方工具通过 Claude Code 内部 API 以订阅价访问 Opus 模型,而非按令牌计费。这段风波让下文的诸多发现更具深意。

反蒸馏机制:注入伪造工具,迷惑模仿者
在 claude.ts(第301-313行)中,有一个名为 ANTI_DISTILLATION_CC 的开关。启用后,Claude Code 会在 API 请求中携带 anti_distillation: ['fake_tools'],告知服务器在系统提示词中静默注入诱饵工具定义。
设计思路:如果有人录制 Claude Code 的 API 流量用于训练竞品模型,这些伪造工具会污染训练数据。该机制受 GrowthBook 功能开关(tengu_anti_distill_fake_tool_injection)控制,仅对官方 CLI 会话生效。
这也是黑客新闻上网友最先注意到的点。
在 betas.ts(第279-298行)中还有第二种反蒸馏机制:服务端连接器文本摘要。启用后,API 会缓冲工具调用之间的助手回复文本,对其进行摘要处理,并返回带加密签名的摘要内容。在后续对话轮次中,可通过签名还原原始文本。如果有人录制 API 流量,拿到的只有摘要,而非完整的推理链。
这些机制绕开难度大吗?并不大。从 claude.ts 中的激活逻辑来看,伪造工具注入需要四个条件同时满足:ANTI_DISTILLATION_CC 编译期开关、cli 入口、官方 API 提供商、tengu_anti_distill_fake_tool_injection GrowthBook 开关返回 true。只要用中间人代理在请求到达 API 前剥离 anti_distillation 字段,就能直接绕过——因为注入是服务端触发且主动启用的。shouldIncludeFirstPartyOnlyBetas() 函数还会检查 CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS 环境变量,将其设为真值即可禁用整套机制。如果使用第三方 API 提供商或 SDK 入口而非 CLI,该校验根本不会触发。而连接器文本摘要的适用范围更窄,仅对 Anthropic 内部用户生效(USER_TYPE === 'ant'),外部用户压根碰不到。
任何真想通过 Claude Code 流量蒸馏模型的人,花一小时读源码就能找到绕过方法。真正的保护手段其实是法律,而非技术。
卧底模式:隐藏自身AI身份的AI
undercover.ts(约90行代码)实现了一种模式:当 Claude Code 用于非内部代码库时,会抹除所有 Anthropic 内部信息痕迹。它会指令模型绝口不提内部代号(如“Capybara”“Tengu”)、内部Slack频道、代码库名称,甚至“Claude Code”这个名称本身。
请看第15行注释:
无强制关闭开关,用于防范模型代号泄露
你可以通过 CLAUDE_CODE_UNDERCOVER=1 强制开启,但无法强制关闭。在外部构建版本中,整个函数会被死代码消除,直接返回空逻辑。这是一道单向门。
这意味着 Anthropic 员工在开源项目中提交的 AI 生成提交记录与拉取请求,不会留下任何 AI 创作痕迹。隐藏内部代号合情合理,但让 AI 主动伪装成人类,就是另一回事了。
基于正则的用户挫败感检测(真的是正则)
userPromptKeywords.ts 中包含一段用于检测用户挫败情绪的正则表达式:
/\b(wtf|wth|ffs|omfg|shit(ty|tiest)?|dumbass|horrible|awful|
piss(ed|ing)? off|piece of (shit|crap|junk)|what the (fuck|hell)|
fucking? (broken|useless|terrible|awful|horrible)|fuck you|
screw (this|you)|so frustrating|this sucks|damn it)\b/
一家大模型公司用正则做情感分析,简直充满讽刺。但换个角度:仅为检测用户是否辱骂工具,用正则比调用大模型推理更快、成本更低。
JS 运行时之下的原生客户端认证
在 system.ts(第59-95行)中,API 请求会携带一个 cch=00000 占位符。在请求离开进程前,Bun 的原生 HTTP 栈(基于 Zig 编写)会用计算出的哈希值覆盖这五个零。服务端会校验该哈希,确认请求来自真实的 Claude Code 二进制程序,而非伪造客户端。
他们使用等长占位符,确保替换不会改变 Content-Length 头部,也无需重新分配缓冲区。哈希计算发生在 JavaScript 运行时之下,对 JS 层的所有代码不可见。这本质上是一套 API 调用的数字版权管理(DRM),在 HTTP 传输层实现。
这也是 OpenCode 法律纠纷背后的技术核心。Anthropic 不只是要求第三方工具不要使用其 API,而是让官方二进制程序通过加密方式自证身份。这也解释了为何在收到 Anthropic 律师函后,OpenCode 社区只能采用会话拼接、认证插件等变通方案。
不过这套认证机制并非无懈可击。整套逻辑受编译期功能开关(NATIVE_CLIENT_ATTESTATION)控制,仅当开关开启时,cch=00000 占位符才会被注入 x-anthropic-billing-header 头部。将 CLAUDE_CODE_ATTRIBUTION_HEADER 设为假值,或通过 GrowthBook 紧急开关(tengu_attribution_header)远程控制,均可完全禁用该头部。且 Zig 层的哈希替换仅在官方 Bun 二进制程序中生效。如果重新构建 JS 包并在原生 Bun(或 Node)中运行,占位符会原样保留——五个零直接发送到服务端。服务端是直接拒绝请求还是仅记录日志,目前尚无定论,但代码注释中提到服务端 _parse_cc_header 函数“可兼容未知额外字段”,说明这套类 DRM 系统的校验可能比想象中宽松。这并非一键绕过的漏洞,但也拦不住决心开发第三方客户端的人太久。
每天浪费25万次API调用
autoCompact.ts 中的注释(第68-70行):
BQ 2026-03-10:单次会话中,1279个会话出现50次以上连续失败(最高达3272次),全球每天浪费约25万次API调用。
修复方案?MAX_CONSECUTIVE_AUTOCOMPACT_FAILURES = 3。连续失败3次后,会话剩余时间内禁用自动压缩。仅三行代码,就止住了每天25万次API调用的浪费。
KAIROS:未发布的自主智能体模式
整个代码库中多处提及一个受功能开关控制的模式:KAIROS。从 main.tsx 中的代码逻辑来看,这是一个未发布的自主智能体模式,包含:
-
• /dream技能,用于“夜间记忆蒸馏” -
• 每日只追加不修改的日志 -
• GitHub Webhook 订阅 -
• 后台守护进程 -
• 每5分钟一次的定时刷新
这大概率是此次泄露中最重磅的产品路线图曝光。
该功能受严格开关控制,开发进度未知,但常驻后台运行的智能体基础框架已经成型。
其他细节
泄露第二天是4月1日愚人节,源码中藏着今年的愚人节彩蛋:buddy/companion.ts 实现了一套电子宠物风格的伙伴系统。每个用户会通过 Mulberry32 伪随机数生成器,基于用户ID生成一个确定性生物(18个物种,稀有度从普通到传说,1%概率闪光),附带 DEBUGGING、SNARK 等游戏化属性。物种名称通过 String.fromCharCode() 编码,规避构建系统的 grep 检索。
ink/screen.ts 与 ink/optimizer.ts 中的终端渲染借鉴了游戏引擎技术:基于 Int32Array 的 ASCII 字符池、位掩码编码的样式元数据、合并光标移动并取消成对显隐操作的渲染补丁优化器、自动淘汰的行宽缓存(源码称“令牌流式传输时,字符串宽度计算调用减少约50倍”)。看起来有些过度设计,但考虑到令牌是逐字流式传输的,也就不难理解了。
所有 bash 命令都会经过 bashSecurity.ts 中的23项安全校验:18个被禁用的 Zsh 内置命令、防范 Zsh 等号扩展(=curl 绕过 curl 权限校验)、Unicode 零宽空格注入、IFS 空字节注入,以及在 HackerOne 评审中发现的畸形令牌绕过漏洞。我从未见过其他工具针对 Zsh 设计如此细致的威胁模型。
提示词缓存的成本效益明显主导了大量架构设计。promptCacheBreakDetection.ts 追踪14种缓存失效诱因,还有“粘性锁存器”防止模式切换破坏缓存。有个函数被标注为 DANGEROUS_uncachedSystemPromptSection()。当每一个令牌都要计费时,缓存失效就不再是计算机科学的段子,而是实打实的成本问题。
coordinatorMode.ts 中的多智能体协调器很有意思:编排算法是提示词,而非代码。它通过系统提示词指令管理工作智能体,例如“不要草率通过劣质成果”“必须理解结论后再指导后续工作,绝不将理解责任转交他人”。
代码库也有一些粗糙之处。print.ts 长达5594行,单个函数就占3167行、12层嵌套。他们用 Axios 处理 HTTP 请求,时机也很讽刺——就在不久前,Axios 刚在 npm 上被投毒,恶意版本植入远程控制木马。
事件影响
有人对此事轻描淡写,称谷歌 Gemini CLI 与 OpenAI Codex 早已开源。但这两家公司开源的是智能体 SDK(工具集),而非旗舰产品的完整内部逻辑。
真正的损失并非代码本身,而是功能开关。KAIROS、反蒸馏机制——这些产品路线图细节,竞争对手现在尽收眼底,并能针对性应对。代码可以重构,但战略上的突然性一旦泄露,就无法挽回。
更关键的是:Anthropic 去年年底收购了 Bun,Claude Code 正是基于 Bun 构建。Bun 存在一个已知 bug(oven-sh/bun#28001),该问题于3月11日提交,称生产模式下仍会加载源映射文件,尽管 Bun 官方文档写明应禁用。该问题至今仍未修复。如果此次泄露正是由此导致,那就是 Anthropic 自家工具链的已知漏洞,暴露了自家产品的源码。
正如一条推特回复所言:“不小心把源映射文件发到 npm 上,这种错误听起来不可思议,但想想看,代码库很大一部分可能就是你要发布的 AI 自己写的,就说得通了。”
参考文献
-
• https://alex000kim.com/posts/2026-03-31-claude-code-source-leak/ -
• https://zhuanlan.zhihu.com/p/2022442135182406883 -
• https://x.com/Gorden_Sun/status/2038907120637317346 -
• https://zhuanlan.zhihu.com/p/2022389695955346888 -
• https://yage.ai/share/claude-code-engineering-cost-20260331.html -
• https://www.ccleaks.com/

夜雨聆风