Claude Code 源码里有意思设定:伪造、投毒、卧底、封号

0 阅读10分钟

Anthropic 这次不小心泄露的源码,直接暴漏了之前 Claude Code 里不少有意思的设定,包括针对蒸馏情况注入假工具、 隐藏 AI 的版本、通过正则表达式检测挫折感、可能存在的封号策略等。

反蒸馏

在 Claude Code 源码里有一个 ANTI_DISTILLATION_CC 标志,开启后 Claude Code 在向服务端发请求时会带上 anti_distillation: ['fake_tools'],也就是告诉服务端:

在系统提示词里偷偷插入一些“假的工具定义”。

这样如果有人通过抓包去录制 Claude Code 的 API,再拿这些数据训练竞品模型,那么训练集里就会混入伪造工具,从而“污染”蒸馏数据

这看起来算是一种很有针对性的“投毒式防复制”,也很符合 Anthropic 的风格,另外还有第二种反蒸馏机制:

在某些场景下,服务端会把工具调用之间的文本先做摘要处理,然后配合签名返回,后续轮次再通过签名恢复,,这样抓包的人只能拿到摘要,而不是完整的中间文本。

也就是说 Anthropic 还考虑了防止别人“记录交互过程再二次利用”这种场景,当然这更多是表示出一种态度:别来挨我

因为如果真的要绕过还是有方式,只是这些行为都表达出 Anthropic 的一个态度,那就是我们不欢迎蒸馏和第三方。

Undercover mode

这也是一个有意思的设定,Claude Code 源码里有一个叫 undercover.ts 的代码,功能是在 Claude Code 被用在“非内部仓库”时,主动去除所有可能暴露 Anthropic 内部背景的信息

它会要求模型不要提及内部代号、内部 Slack 频道、内部仓库名,甚至不要提到“Claude Code”这个词,最有意思的一句注释是:

“There is NO force-OFF. This guards against model codename leaks.”

这算是一种“单向伪装”:可以强制开,但不能强制关。

在外部构建的情况下,甚至会把相关逻辑变成不可逆的默认行为,所以如果 Anthropic 员工在开源项目里用 Claude Code 写 PR 或 commit,这套机制可能会让外部人员完全看不出来有 AI 参与。

所以,Anthropic 一直强调自己 100% AI 写代码,但是实际情况一直对外是屏蔽

正则表达式

另外一个有意思的是,用户挫败感检测居然是用正则表达式做的

userPromptKeywords.ts 里有一个很长的 regex,专门匹配 wtfffsshitthis sucksso frustrating 等表达沮丧、愤怒、辱骂的用户输入,你能想象,一家做大模型的公司,居然用 regex 来做情绪识别。

/\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/

不过这么做在工程上也算合理,因为如果只是为了判断用户是不是在骂工具,正则的成本和速度都远好于再跑一轮模型推理。

这样能体现 Claude Code 的工程取向:不是所有问题都交给 LLM,很多地方还是在传统的规则系统内去完成。

Native client

在 system.ts 里,有一个 Native client attestation 的技术点,API 请求里会先放一个 cch=00000 的占位符,然后在请求真正发出前,通过 Bun 的原生 HTTP 栈(用 Zig 写的)把这五个零替换成一个计算出来的哈希值:

服务端会根据这个校验请求是不是来自真正的 Claude Code 二进制,而不是伪造客户端

其中占位符长度固定,所以替换不会影响 Content-Length,另外这步发生在 JS 运行时之下,因此普通 JS 层的 hook 和改包不容易看见。

这也算是一种 “DRM for API calls”,结合类似之前发生过的 OpenCode 事件,Anthropic 是真的在技术和协议上抗拒第三方客户端

auto-compac

auto-compact 失败会导致的大量 API 浪费 ,在 autoCompact.ts 的注释里有依据统计:

“BQ 2026-03-10: 1,279 sessions had 50+ consecutive failures (up to 3,272) in a single session, wasting ~250K API calls/day globally.”

也就是截至 2026-03-10,有 1,279 个会话在单次 session 出现了 50 次以上连续失败,极端值甚至 3,272 次,导致全球每天大约浪费 25 万次 API 调用。

不过 Anthropic 的解决方案也非常朴实无华:设置 MAX_CONSECUTIVE_AUTOCOMPACT_FAILURES = 3,也就是连续失败 3 次后,本次会话剩余期间禁用 compaction。

KAIROS

这算是源码里最有意思的东西,在代码中有多处对 KAIROS 这个 feature-gated 模式的引用,根据 main.tsx 相关路径推测,这像是一个尚未发布的 自治型后台代理模式

例如有一个 /dream 技能用于“夜间记忆蒸馏”、每天追加式日志、GitHub webhook 订阅、后台 daemon worker,以及每 5 分钟的 cron 刷新。

从实现上看,这像是一个持续运行、长期积累上下文、自动响应外部事件的 agent 系统,也就是 Anthropic 正在把 Claude Code 往“常驻、自治、持续工作的代理”的方向推进

渲染

在源码里,大家还发现了一个 buddy/companion.ts ,它像是有一个愚人节彩蛋,内部实现了类似电子宠物/ Tamagotchi 的 companion 系统,每个用户根据 user ID 通过伪随机算法生成一个固定 creature,还有稀有度、闪光概率和 RPG 属性。

另一个是终端渲染层用了很多偏游戏引擎式的优化:例如 Int32Array 字符池、位掩码样式元数据、合并光标移动的 patch optimizer、自我淘汰的行宽缓存等,源码里甚至有注释表示能把 stringWidth 调用减少约 50 倍。

可以看出来,Claude Code 在表面看起来只是个 CLI,但在终端 token 流式渲染这件事上做了相当重的性能优化。

安全

Claude Code 的 bash 安全检查非常重,在 bashSecurity.ts 中就有 23 个编号检查,覆盖 18 个被封禁的 Zsh builtin、防止 =curl 这类 Zsh 等号扩展绕过、unicode 零宽字符注入、IFS 空字节注入,以及一个 HackerOne 审计中发现的 malformed token 绕过。

这种专门针对 Zsh 威胁模型的细粒度防御,在同类工具里并不常见,而且 prompt cache 几乎渗透到了架构每一个地方:

代码里追踪了 14 种 cache-break 向量,还有为了不让模式切换挤压缓存而设计的 “sticky latches”,甚至有函数名直接叫 DANGEROUS_uncachedSystemPromptSection() ,也就是 Claude Code 的很多设计不是纯粹出于“代码优雅”,而是真的围绕 prompt 缓存命中率和 token 成本 在做取舍。

多代理协调逻辑

和检测情绪相反的是,在 coordinatorMode.ts 里,协调多个 worker agent 的“算法”本身不是传统代码,而是一组系统提示词规则,比如:

  • “不要敷衍地认可薄弱工作”
  • “在指导后续工作前必须先理解发现,不能把理解也外包给另一个 worker”

这说明 Claude Code 多代理协作有着相当强的 prompt-driven orchestration 特征,换句话说 Claude Code 的一些核心调度行为不是被硬编码成确定性流程,而是由另一层 LLM 指令编排出来。

所以,提示词也是代码的一部分,这一点很值得关注,因为它反映出 Anthropic 把 prompt 当成“控制平面”的程度已经很深。

封号

也有人基于 Claude Code 对 Anthropic 的封号逻辑进行了分析,总结了五个最大可能的情况:

排名原因风险等级说明
1订阅滥用/共享账号极高Device ID 跨设备关联,检测多设备共享同一账号
2速率限制违规超出 rateLimitTier 配额,短时间高频调用
3内容策略违规消息内容指纹 + anti-distillation 检测
4自动化滥用CI/CD 环境检测 + 非交互模式识别 + 异常 token 消耗
5使用非官方客户端/篡改指纹校验失败 + 版本归因 header 异常

因为 Claude Code 作为客户端,里面上报了不少数据标识,例如 Device ID(永久标识)+ 环境指纹(40+ 维度)+ 行为遥测(640+ 事件类型),这些数据可以形成完整的用户画像,例如最直接的 ID 有:

标识符生成方式存储位置生命周期
Device IDrandomBytes(32).toString('hex')~/.claude.json永久,除非手动删除
Account UUIDOAuth 登录时服务端下发~/.claude.json绑定账号
Organization UUIDOAuth 登录时下发同上绑定组织
Session IDrandomUUID() 每次会话生成内存单次会话
EmailOAuth 或 git config user.email同上绑定身份

Device ID 是 256 位随机值,首次运行时生成并永久存储,是所有事件上报的核心标识,Anthropic 可通过它精确关联同一设备上的所有活动。

同时,Claude Code 在启动时会对用户环境进行大规模枚举:

采集维度数据来源示例值
操作系统process.platformdarwin/linux/win32
CPU 架构process.archx64/arm64
Node.js 版本process.versionv20.x.x
Linux 发行版/etc/os-releaseubuntu 22.04
Linux 内核os.release()6.5.0-xxx
WSL 版本/proc/version 解析WSL2

最重要的是,会有一些关键事件类型,看起来会和封号有极强联系:

事件名上报内容封号相关性
tengu_init完整环境指纹、设备信息高 - 环境异常检测
tengu_api_success模型名、token 用量、耗时、成本美元、TTFT极高 - 用量监控
tengu_api_error错误类型、HTTP 状态码、重试次数中 - 异常模式
tengu_tool_use_*工具名、执行耗时、成功/失败中 - 行为模式
tengu_exit会话时长、总 token 用量高 - 会话级统计
tengu_oauth_*登录/刷新/失败事件高 - 账号安全
tengu_cancel取消操作
tengu_auto_mode_*自动模式使用中 - 自动化检测

所以 Claude Code 的数据采集体系大概可以总结为三层模型

层级内容目的
身份层Device ID + Account UUID + Email + Fingerprint精确追踪用户
环境层OS + 架构 + 终端 + CI + 容器 + 部署环境构建设备指纹
行为层640+ 事件 + Token 用量 + 工具调用 + 进程资源分析使用模式

这三层数据通过三条通道(1P API + Datadog + GrowthBook)实时上报,服务端拥有对每个用户完整的使用画像,可以从多个维度检测异常并触发封号决策。

所以最安全的做法是 使用 Vertex 等第三方提供商(自动禁用所有分析),或设置DISABLE_TELEMETRY=1 + 控制使用频率 + 一人一号。

当然,这次源码泄露,也会导致后续 Anthropic 做出一些策略调整,但是整体思路应该还是类似。

最后

实际上这次对 Anthropic 最重要的不是代码泄露,而是 feature flags 和产品方向几乎被曝光 ,这对于企业的影响其实更大,另外 Anthropic 在 2025 年底收购了 Bun,而 Bun 在 2026 也有一个 issue,issue 内容是生产模式下 source map 仍被输出:

Bun issue #28001 — “Bun's frontend development server - Source map incorrectly served when in production”

这就很有意思了,是不是可以合理怀疑,这次事故某种程度上等于 Anthropic 自己的工具链 bug 泄露了自己旗舰产品的源码,虽然这种奇怪看看起来不大可能,但是一旦和 AI 沾边了就说不准了,Openclaw 发布也可以漏终端漏会话模块,所以 AI 抽风确实可以理解

链接

alex000kim.com/posts/2026-…