【Claude Code 源码泄露】卧底模式、脏话检测、反蒸馏、和一堆壳子商的丑事

━━━━━━━━━━━━━━━━━━━━
◆ 事情经过
━━━━━━━━━━━━━━━━━━━━
2026 年 3 月 31 日,Anthropic 往 npm 推了 claude-code v2.1.88。
一个安全研究员 Chaofan Shou 凌晨拉包的时候发现——包里多了个 59.8MB 的 .map 文件。Source map。Bun 编译 TypeScript 时默认生成的调试映射文件,打包的人忘了排除。
Source map 是什么?编译后的代码是压缩混淆过的,人读不了。Source map 是一张”对照表”,把压缩后的代码映射回原始源码。本来是给开发者自己调试用的,上线时应该删掉。没删。
几小时内,~512,000 行 TypeScript 源码、~1,900 个文件被镜像到 GitHub,推特浏览量 28.8M。
Anthropic 回应:”人为打包错误,不是安全漏洞,没有客户数据泄露,没开人。”
讽刺的是,这是几天内的第二次泄露——之前刚因为 source map 暴露了内部项目代号 “Mythos”。同一个错误犯了两遍。
Bun 默认生成 source map 这件事,现在全世界都知道了。
━━━━━━━━━━━━━━━━━━━━
◆ 先说正经的:为什么 Claude Code 比 Web UI 好用
━━━━━━━━━━━━━━━━━━━━
用过 Claude Code 的人都知道它比 Web UI 好用得多。模型是同一个,差别全在 harness——上一期讲的那个词——模型外面包的那层工程。源码泄露之后,这层工程的具体实现终于可以看了。
源码泄露之后,威斯康星大学机器学习研究员 Sebastian Raschka(《Machine Learning with PyTorch and Scikit-Learn》作者)做了一份详细分析。架构的几个关键设计:
────────────────────
40+ 个内置工具,插件式架构
Claude Code 内置了大约 40 个工具,每个工具独立定义、独立权限控制。Base tool 定义就写了 29,000 行 TypeScript。
工具不是”什么都能干的万能接口”,而是高度专用的。举个例子——系统提示词里明确告诉模型:用专用 Grep 工具搜索文件内容,不要用 bash grep;用专用 Glob 工具发现文件,不要用 find。
为什么?因为专用工具可以做权限检查、输出格式标准化、错误处理。bash grep 什么都能干,但也什么都可能出错。把”搜索文件”这件事从通用 bash 里拆出来做成专用工具,就是 Harness Engineering 的典型实践——agent 用 bash grep 翻过车,所以工程化一个专用工具让它不再翻车。
────────────────────
Query Engine:46,000 行的 LLM 调用层
所有 LLM API 调用——流式传输、缓存、编排——都经过一个 46,000 行的 Query Engine。不是直接 fetch(api_url),而是一个完整的中间层。
注意:这 46,000 行是纯 TypeScript 程序,不是用 LLM 实现的。它本质上就是一个 HTTP 客户端——负责和 Anthropic API 通信的脏活累活:网络中断要重试、流式传输要处理半截 token、多轮对话要管理上下文窗口、缓存标记要告诉服务端哪些内容可以复用。全是确定性的、if-else 级别的工程代码,没有任何”智能”成分。
真正需要 LLM 的部分只有模型推理本身,剩下全是围绕 API 调用的工程防御。
────────────────────
缓存架构:静态/动态分界
这是 Claude Code 快的关键原因之一,省的是服务端的钱。
Transformer 每次处理输入时,要为每个 token 算 attention 的 Key 和 Value 向量(KV)。上下文越长,KV 计算量越大。但如果一段内容在多次请求之间不变,它的 KV 算一次就够了——后续请求直接从缓存读,不用重算。
Claude Code 壳子做的事情很简单:拼 prompt 时,把内容分成”静态部分”和”动态部分”,中间插一个分界标记。系统提示词、CLAUDE.md 内容、工具定义——这些在一次会话中不变,放在分界线以上;用户输入、工具输出、对话历史——每轮都变,放在分界线以下。
服务端看到分界标记,就知道线以上的 KV 直接从缓存取,只需要重算线以下的新内容。壳子这边几乎零成本(只是在 prompt 里多插了一行标记),但服务端对长会话的算力开销能省一大截。
────────────────────
子代理系统(Swarms)
Claude Code 可以 fork 出子代理来并行处理任务。
子代理不继承对话上下文——它不知道你之前和主代理聊了什么。每次启动子代理,主代理给它一个全新的任务 prompt,子代理从零开始干活。
它继承的是缓存的静态部分:系统提示词、工具定义、CLAUDE.md 这些不变的东西。这部分在服务端已经算好了 KV cache,子代理复用这份缓存,不用重算。省的是服务端算力,不是上下文。
────────────────────
上下文加载策略
启动时自动加载:git 主分支信息、当前分支信息、最近提交历史、CLAUDE.md 文件。
不是把整个代码库塞进上下文——那会爆。而是只加载”agent 需要知道的项目元信息”。具体的代码内容,通过 Grep/Glob 工具按需检索。
这和上一期讲的 Harness Engineering 是同一个思路:不是一次性把所有信息塞进上下文窗口,而是动态地、按需地把正确的信息拉进来。
────────────────────
技术栈
-
运行时用 Bun 不是 Node.js。Bun 是 2022 年出的 JavaScript/TypeScript 运行时,用 Zig 写的,主打比 Node.js 快(启动快、打包快、装依赖快)。Anthropic 选它图的就是性能。代价是生态没 Node.js 成熟,也正是 Bun 默认生成 source map 这个行为导致了这次泄露 -
UI 用 React + Ink 做终端渲染(是的,终端界面也用 React) -
Zod v4 做运行时数据验证 -
IDE 双向通信层,JWT 认证通道连接 VS Code 和 JetBrains -
约 50 个 slash commands
────────────────────
总结一下: Claude Code 不是一个”包了层壳的 API 调用”。它是一个完整的 agent 工程系统——40+ 专用工具、46,000 行调用引擎、缓存分层、子代理复用静态缓存、按需上下文加载。这套 harness 才是”比 Web UI 好用”的真正原因。
━━━━━━━━━━━━━━━━━━━━
◆ 八卦时间
━━━━━━━━━━━━━━━━━━━━
技术架构是正经内容。下面是不那么正经的——但可能更有意思的。
不过在讲八卦之前,先吐槽三件事。
第一件:全网的”深度解析”
泄露之后,全网冒出了几十篇”Claude Code 源码深度解析”。打开一看,出来的东西大同小异:先用三段话铺垫背景,再分七八个模块逐一展开,每段先总结后贴码,结尾来一段”这对我们的启示是……”。格式工整,面面俱到,就是没有人味儿。
最夸张的一篇:有人把 50 万行代码直接塞给 AI 跑了一个多小时,产出了一份九章的”深度架构分析”——几十张架构图、完整的文件索引、连”如果重新设计”都替 Anthropic 想好了。十万字往上。看得懂的不需要看,看不懂的不知道说的啥。
真正有价值的分析——比如机器学习工程师 Alex Kim 的博客(alex000kim.com),逐个扒 feature flag 的触发条件和绕过方式——需要人类带着具体问题去翻代码,而不是让 AI 做全局摘要。
第二件:50 万行,犯得着吗?
512,000 行 TypeScript。一千九百个文件。一个 agent 壳子。
它干的事情本质上是什么?读文件、改文件、跑命令、调 API、管上下文。这些事情用 Python 脚本能干,用 shell 脚本能干,用任何一个开源 agent 框架都能干。LangChain、CrewAI、AutoGen——随便挑一个,核心功能几千行就够了。
那 50 万行在干什么?大部分在处理边角情况——23 种 bash 安全检查、14 种缓存失效防御、Zsh 特殊字符转义、零宽 Unicode 注入防护、IDE 双向通信的 JWT 认证……每一个都是踩过坑之后补上的补丁。工程质量高吗?高。但 50 万行的工程量,八成是在给一成的核心逻辑擦屁股。
第三件:壳子不值钱,但壳子是收费管道
这个壳子不开源。Anthropic 用了一堆开源组件(Bun、React、Ink、Zod),但壳子本身闭源商业化。模型是核心竞争力,壳子不是。但 Anthropic 把壳子也锁了,不是因为壳子值钱,是因为壳子是收费的入口。 你不用官方壳子,他就没法按月收你钱、没法追踪你的用量、没法在 API 响应里注入反蒸馏假数据。源码里还发现了客户端认证机制——正版二进制才能调 API,第三方客户端可能被拒。
OpenClaw 的故事大家都知道了。Anthropic 先给 Clawdbot 发律师函逼改名,随后服务端悄悄封锁第三方 OAuth token,一夜之间 OpenClaw、OpenCode、Roo Code、Cline 全断流。写进用户协议:Max 套餐的额度只能在官方壳子里用,接到开源工具上就封号。 200美元/月包月,第三方没限速,跑起来 Anthropic 血亏。结局大家也知道了:OpenAI 情人节把作者挖走,Anthropic 亲手制造了自己最大的竞争对手。
与此同时,OpenAI 3 月 30 日在 GitHub 上发布了 codex-plugin-cc:官方插件,让用户在 Claude Code 里直接调用 Codex。OpenAI 主动把自己的模型塞进了竞争对手的壳子里。 Anthropic 在护管道,OpenAI 在抢生态。
还有更丢人的。Cursor 3 月发了 Composer 2,宣传”frontier-level coding intelligence”。结果有人调 API 发现模型路径写着 kimi-k2p5-rl-0317——月之暗面的 Kimi K2.5 + RL 微调。发布公告一个字没提。被抓包后联合创始人承认”没提 Kimi 是我们的失误”,VP 辩解”只有四分之一算力来自 Kimi”。更骚的是,2025 年 Composer 1 就被发现偷偷用了 DeepSeek 的 tokenizer,也没披露。惯犯。用中国开源模型不丢人,偷偷用才丢人。
壳子商众生相:Anthropic 闭源护管道,OpenAI 开放抢生态,Cursor 套壳不敢说,Google 最务实——Antigravity 里直接集成了 Claude Opus 和 Sonnet,Gemini 免费给你用不够?那就让你在我的壳子里调竞争对手的模型。Google 连竞争对手的模型都往自己平台上请,Anthropic 连自己用户用第三方壳子都不让。格局高下立判。模型层面中国开源已经是全球基础设施了,壳子商心里清楚,嘴上不说。
现在的局面很拧巴:每一个喜欢开源的程序员都讨厌 Anthropic,但每一个用过 Claude 的程序员都知道它暂时无可替代。恨它和离不开它并存——大概是 2026 年程序员群体最拧巴的集体情绪。
好了,吐槽完毕,讲八卦。
────────────────────
一、Undercover Mode(卧底模式)
这是整次泄露里最有争议的发现。
源码里有一个 undercover.ts,大约 90 行。功能是:当 Anthropic 内部员工在外部或开源仓库提交代码时,自动注入一段系统提示。
提示内容是这样的:
You are operating UNDERCOVER in a PUBLIC/OPEN-SOURCE repository.Your commit messages, PR titles, and PR bodies MUST NOT containANY Anthropic-internal information. Do not blow your cover.
具体禁止提及的内容包括:内部代号(”Capybara”、”Tengu”)、未发布模型版本号、内部仓库/项目名、内部 Slack 频道、”Claude Code” 字样、AI 身份。
没有强制关闭开关。
先说清楚这个功能在干什么:防止 Anthropic 员工用 Claude Code 给外部项目提 PR 时,不小心在 commit message 里带出内部信息——比如 “fix bug found in Capybara testing”。功能本身合理,任何有保密协议的公司都需要这种检查。
但这件事放在更大的背景下看就很微妙了。
Claude Code 不开源。50 万行 TypeScript,闭源商业产品,20 美元/月起步(Max 套餐 100-200 美元/月)。Anthropic 对这个壳子的态度一直是:这是我们的核心竞争力,不能让你看。
与此同时,Anthropic 的员工在用这个闭源工具,以个人身份往开源社区提代码。提的时候还专门有一个”卧底模式”确保不暴露公司身份。
也就是说:你的开源项目对我开放,我的闭源工具对你保密,我的员工来给你提 PR 但不告诉你他是谁。 三重不对称。
开源社区的基础是互惠。你用了别人的开源库,你也贡献回去。Anthropic 的 Claude Code 大量依赖开源生态(Bun、React、Ink、Zod……),但自己的壳子捂得死死的。然后员工还要”卧底”到开源社区去——吃开源的饭,砸开源的锅不至于,但至少不够坦荡。
“Do not blow your cover” 这个措辞更是火上浇油。技术上它只是在说”不要泄露内部信息”,但 “undercover”(卧底)这个词太有暗示性了——暗示 Anthropic 员工在以非 Anthropic 身份向开源项目贡献代码,并且刻意隐藏身份。如果你是一个开源项目的维护者,发现有人一直在给你提 PR,结果这个人的 AI 工具里写着”不要暴露身份”——你会怎么想?
最后,讽刺到家了——一个专门防内部信息泄露到外部的功能,自己被泄露到了外部。 2026 年最佳灯下黑。
────────────────────
二、脏话检测(Frustration Regex)
源码里有一个 userPromptKeywords.ts,用正则表达式匹配用户输入中的脏话和沮丧表达:
/\b(wtf|wth|ffs|omfg|sh*t(ty|tiest)?|dumb***|horrible|awful|p***ed off|piece of (s**t|crap|junk)|what the (f**k|hell)|f***ing? (broken|useless|terrible)|f**k you|screw (this|you)|so frustrating|this sucks|damn it)\b/
一家 LLM 公司用正则表达式做情感分析——这被群嘲为 “peak irony”(讽刺的极致)。
但仔细想想,这其实是完全合理的工程决策。
这个检测的目的不是”理解用户情绪”,而是”快速判断用户是否在骂街”。这是一个二元分类问题:骂了 / 没骂。对于这种简单模式匹配,正则表达式的成本是零(本地 CPU 微秒级),而调一次 LLM 做情感分析要花钱、花时间、还不一定比正则准。
用正则做这件事不是技术倒退,是工程常识——能用 O(n) 的字符串匹配解决的问题,不需要上 transformer。
检测到之后做什么?大概率是调整响应策略——用户在骂街的时候,AI 应该更谨慎、更直接、少废话。这不是讨好用户,是基本的交互设计。
────────────────────
三、Anti-Distillation(反蒸馏)
这个最有意思。
源码里有一个 ANTI_DISTILLATION_CC flag。开启后,API 请求会注入虚假的工具定义——假的 tool name、假的参数、假的 description。
目的是什么?防止竞品通过录制 API 流量来训练模型。
蒸馏(distillation)是 AI 行业的公开秘密:你搭一个代理层,把用户的请求和 Claude 的回复全录下来,拿这些数据微调自己的小模型。效果不一定好,但成本极低。很多公司明面上说”我们用了 Claude API”,暗地里在录流量准备训练自研模型。
Anthropic 的对策:在 API 响应里注入假的工具定义。你录了这些流量去训练?恭喜,你的模型学会了一堆不存在的工具调用。训练数据被污染了。
这个机制需要四个条件同时满足才会生效:
-
编译时 ANTI_DISTILLATION_CC flag 打开 -
从 CLI 入口启动(不是 IDE 集成) -
使用第一方 API(Anthropic 自己的 API,不是第三方转发) -
GrowthBook feature flag 开启(服务端动态控制)
四重条件的设计很精妙——既要让正常用户不受影响,又要让蒸馏者防不胜防。
但也不是无解。MITM 代理可以过滤掉假工具定义(如果你知道哪些是假的),或者直接设环境变量 CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS 关掉实验功能。
这背后折射的是整个行业的信任危机:模型提供商不信任 API 调用者,API 调用者不信任模型提供商。Anthropic 在 API 响应里掺假数据防蒸馏,而调用者在请求里掺假数据防追踪。大家都在猜忌。
────────────────────
四、KAIROS(后台守护进程)
这是泄露代码里出现频率最高的 feature flag——150+ 次。
KAIROS,古希腊语,意思是”恰当的时刻”。区别于 Chronos(物理时间流逝),Kairos 指的是”做某件事的最佳时机”。
KAIROS 是一个 always-on 的后台 agent 守护进程。代码里能看到的功能包括:
- autoDream
:用户空闲时自动做”记忆整合”——合并观察、消除矛盾、把模糊洞见转成确定事实 /dream
skill:手动触发记忆蒸馏 -
append-only 日志系统 -
GitHub webhook 集成 -
5 分钟 cron 刷新
autoDream 是最值得关注的功能。
不过说实话,这个方向 OpenClaw 早就在做了——它的 Gateway 就是一个 24/7 运行的后台守护进程,不需要 feature flag,现在就能用。KAIROS 还在源码里藏着没上线,OpenClaw 已经跑在生产环境了。Anthropic 又一次在追赶被自己逼走的竞争对手。
KAIROS 的思路是:用户不说话的时候,agent 也在工作——整理记忆、压缩上下文、把碎片化的信息结构化。方向没问题,但目前只是源码里的饼,什么时候上线不知道。
────────────────────
五、记忆系统
源码里的记忆系统是三层架构:
- MEMORY.md
:轻量索引,常驻上下文,每行约 150 字符。类似目录页。 - 详细项目笔记
:按需拉入上下文,不常驻。类似正文。 - 历史 session 搜索
:选择性加载,跨会话检索。类似档案室。
代码里有一条要求:系统在行动前必须验证记忆是否与实际代码一致。 就是说,agent 不能盲目相信自己的记忆——记忆说”这个文件在 src/utils/ 下面”,它得先去确认文件是否真的在那里。
这条规则看起来简单,但意义重大。它承认了一个事实:AI 的记忆会过时。
但说实话,这套记忆系统挺垃圾的。不是说验证机制不好——验证是对的。垃圾在”自动管理”这个思路上。虽然它按项目目录分了(每个项目在 ~/.claude/projects/ 下有自己的记忆),但核心问题没变:谁告诉你什么值得记? 它自动摘要、自动整合、自动决定什么重要什么不重要——可是一个僵尸 AI 凭什么替你判断重要性?
用过 Claude Code 的人应该都有体会:长对话到一定程度,系统会触发”自动压缩”。压缩完的那一瞬间,如果你正在做一件复杂的事情——基本就别指望它能做完了。上下文一压缩,细节丢了,AI 突然忘了前面讨论的关键决定,开始重复问你已经回答过的问题,或者往错误的方向走。这就是自动摘要的代价:机器不知道哪些细节对你来说是关键的,它只知道哪些 token 最多。
稍微认真用 AI 的人,都会自己维护上下文提示词,手动告诉 AI “你需要知道什么”——而不是指望系统替你管。自动记忆省的那点儿手动维护成本,远不如它制造的噪音代价大——没有主体筛选的摘要就是垃圾堆积。
────────────────────
六、Native Client Attestation(客户端认证)
API 请求里有一个 cch=00000 占位符(五个零)。Bun 的原生 HTTP 层(底层是 Zig 写的)在请求发出前,会把这串零替换为一个实时计算的加密哈希。
目的:验证发出请求的是正版 Claude Code 二进制文件,不是第三方魔改版。
本质上就是 API 调用的 DRM。你可以用 Claude API,但 Anthropic 想知道你用的是不是官方客户端。这就是前面吐槽的”壳子是收费管道”的技术实现——封第三方、逼你用官方客户端,靠的就是这个哈希。
────────────────────
七、其他
-
23 个 bash 安全检查,防御 Zsh equals expansion 和零宽 Unicode 注入 -
14 个被追踪的 cache-break 向量,用 “sticky latches” 防止缓存失效 -
未发布功能 flag:ULTRAPLAN(30 分钟远程规划)、coordinator mode、agent swarms、workflow scripts -
总共 44 个 feature flags
━━━━━━━━━━━━━━━━━━━━
◆ 几个观点
━━━━━━━━━━━━━━━━━━━━
一、实际损害:技术损失不大,声誉损失很大
源码泄了,但这套 harness 是针对 Claude 模型行为调的——抄到别的模型上效果不一样。技术损失有限。真正丢人的是小家子气:50 万行壳子代码捂得跟传家宝一样,结果忘删 source map 连泄两次。Google 把 Gemini 和 Claude 都往自己平台上请,OpenAI 主动给竞品写插件,就 Anthropic 又封号又发律师函——最后自己裤子都没穿好。
────────────────────
二、反蒸馏有点杞人忧天
蒸馏数据是输入输出对,只能用来做后训练(SFT 微调),改的是输出风格和指令遵循,改不了基座能力。一个基座弱的模型,蒸馏再多 Claude 的数据也只是”看起来像 Claude”,真遇到复杂推理照样原形毕露。蒸馏造不出竞争对手,最多造出低端替代品。 Anthropic 真正该防的不是蒸馏,是自己把开发者往竞争对手那边推。
────────────────────
三、KAIROS:方向对,但 Anthropic 不是第一个
后台常驻 agent 是个好方向,但 OpenClaw 已经在跑了,Anthropic 的 KAIROS 还在 feature flag 里吃灰。而且前面说了,它的自动记忆整合思路有根本缺陷——没有主体筛选的自动摘要只会制造噪音。方向对不等于实现对,更不等于先发优势。
━━━━━━━━━━━━━━━━━━━━
◆ 最后
━━━━━━━━━━━━━━━━━━━━
512,000 行代码里,最值得看的不是某个具体功能的实现——而是整个行业的缩影:
模型越来越强,壳子越来越厚。50 万行代码里真正和”智能”有关的部分不到一成,剩下的全在防御、限制、收费、反蒸馏、追踪用户。壳子商们一边吃开源的饭,一边闭源收钱;一边让 AI 给开源社区提代码,一边让 AI 隐藏身份;一边宣传”AI 安全”,一边连 source map 都删不利索。
至于那个忘删 source map 的工程师——Anthropic 说了,没开人。
━━━━━━━━━━━━━━━━━━━━
参考资料:
-
VentureBeat 综合报道:https://venturebeat.com/technology/claude-codes-source-code-appears-to-have-leaked-heres-what-we-know -
Alex Kim 技术分析(fake tools, frustration regexes, undercover mode):https://alex000kim.com/posts/2026-03-31-claude-code-source-leak/ -
Axios 报道:https://www.axios.com/2026/03/31/anthropic-leaked-source-code-ai -
Fortune 报道(第二次泄露):https://fortune.com/2026/03/31/anthropic-source-code-claude-code-data-leak-second-security-lapse-days-after-second-security-breach -
Hacker News 讨论:https://news.ycombinator.com/item?id=47586778 -
DEV Community 源码分析:https://dev.to/gabrielanhaia/claude-codes-entire-source-code-was-just-leaked-via-npm-source-maps-heres-whats-inside-cjo -
Anthropic 官方回应:”人为打包错误,非安全漏洞,没开人”
━━━━━━━━━━━━━━━━━━━━
// 靳岩岩的 AI 学习笔记 × Claude 的严谨 × Gemini 的浪漫
// 2026-04-02
夜雨聆风