乐于分享
好东西不私藏

Claude Code 源码泄露:伪造工具、挫败感正则、卧底模式及更多

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/
点个「赞」+「在看」❤️
让我们知道这份文字有温暖到你,也是我们持续创作的最大动力!
推荐
Multi-Head, Multi-Query, and Group-Query Attention
How to debug TensorRT-LLM
如何定位TensorRT的库和头文件
PagedAttention
TensorRT-LLM 0.5.0 源码之六
什么是 Programmatic Dependent Launch
如何让AI听懂你的“话外音”?GOAT-SLM模型实现更懂情感的语言交互
TensorRT-LLM  开发环境构建
TensorRT-LLM 构图
Optimize Prompts
大模型部署必看:LLM 推理(Inference)优化 技术,适配高并发、低延迟场景
LLM Serving Benchmark Metrics
告别语音克隆烦恼:VoxCPM用Token-Free方案,打造真实会“思考”的AI语音
OpenCharacter: 利用大规模合成人物角色训练可定制化角色扮演语言模型
Pygame RPG Series – Code Review 4
FlashAttention与PagedAttention详解:拯救GPU显存,让大模型飞起来的核心技术
Introducing CUDA UnBound (CUB)
torch.multinomial 随机性与高敏感性
Meta Prompting: A Guide to Automated Prompt Optimization
CUDA 中如何使用虚函数
DeepSpeed的ZeRO技术具体是如何实现显存优化的?
LM-as-a-judge:LLM评估指南
LLM Sequence Packing
深入了解SmoothQuant:大模型高效量化背后的数学原理
TensorRT-LLM 0.5.0 源码
ART·E: How We Built an Email Research Agent That Beats o3
中文LLM指令微调动态机制
intro to GRPO an efficient policy optimization method
提升TTS语音合成效果:低质量数据清洗、增强与数据扩增
语音合成(TTS)分句生成拼接时的响度一致性问题:现状、成因与对策
TTS的CFM中的class-free指的是什么?
当扩散模型遇上流匹配:原来是一回事儿
语音合成中的“一对多”问题主流模型解决方案分析
Share Memory 的 Bank Conflict
告别高成本!TensorRT-LLM实战:如何将LLM推理速度提升数倍
使用LoRA对LLM进行微调的实用技巧
强化学习小白必看:PTX Loss 到底是个啥?
GPT-5 Prompt Migration and Improvement Using the New Optimizer
Hugging Face BPE Tokenizer 的资源文件
RULER: Relative Universal LLM-Elicited Rewards
SFT和RFT的区别
CosyVoice 3: 面向真实场景的大规模零样本语音生成模型
CosyVoice 3: Towards In-the-wild Speech Generation
语音合成(TTS)中文自然度:问题、成因、解决方案
上下文工程如何实现
上下文工程(Context Engineering)
新手必看!LangGraph 101:手把手教你搭一个深度研究 Agent
SFT 泛化新解读:强化学习 + 奖励修正,一文读懂
Evol-Instruct 竟能精准生成领域专属数据?实操技巧速看!
指令微调数据-少即是多
语音合成(TTS)跳跃与重复问题的解析:成因、机制及解决方案
大模型训练新思路:GEPA 靠 “反思” 赢过 RL,看完秒懂
F5-TTS:用 Flow Matching 玩转语音,流畅度和真实感都 “拉满” 了
E2 TTS:令人尴尬地简单、完全非自回归、零样本的语音合成技术
Voicebox:大规模文本引导的多语言通用语音生成技术
为什么都在聊 Kimi K2?Open Agentic Intelligence 藏着哪些新惊喜
DPO、PPO、GRPO的原理,区别与联系
OPENCSG 中文语料库:一系列高质量的中文数据集,用于语言模型训练
什么是 Classifier-Free Guidance?
Conditional Flow Matching : 连续标准流 Continuous Normalizing Flow
CFM 与 OT-CFM:条件流匹配与最优传输的碰撞
DPO损失实现
Conditional Flow Matching : 常微分方程ODE、欧拉方法和Neural ODE
当 Normalizing flow 遇上语音生成:AI 说话变 “真人” 的秘密在这里!
深度剖析:Kimi – Audio 中 BigVGAN 的神奇作用
为什么说分布变换是 Normalizing flow 的「灵魂操作」?
从知识增长的角度提升RAG上下文的质量
MiniMax-Speech,零样本语音合成新突破,32 种语言轻松拿捏!
手把手教你创建 evol-instruct 数据集!附完整流程~
社交类聊天的 Query 分析与应答策略
SFT 中指令选择和响应选择哪个更重要?
角色扮演大模型技术分享2-超拟人模型的困境
最新!SpeechLLM 综述:架构、能力、挑战与未来全揭秘
如何低成本生成高质量指令微调数据?
从数量到质量:通过自引导数据选择来提升语言模型性能以实现指令调优
Qwen 的训练数据是怎么做的?
GeForce RTX 3090, 4090, A10, A40, A100, A800, L20, L40 显卡性能对比
如何低成本生成高质量指令微调数据?
掌握RAG:投入生产前要评估的8个场景
掌握RAG:如何评估RAG的LLM
掌握RAG:如何在部署后观察您的RAG
掌握RAG:如何选择嵌入模型
Semantic token和连续特征在SLLM下的对比

RLHF及其变体:进展和实际工程见解
什么是置信度?置信度模型怎么做?
晦涩难懂的 Flow matching!图形化理解
CosyVoice 2:基于大型语言模型的可扩展流式语音合成技术
FSQ的原理与VQ-VAE的区别和联系
大模型并行训练的一些知识——极简版
RLHF 入门,高手勿进!