逆向 Claude Code 请求签名:cch 是怎么算出来的

Claude Code 的神秘请求头

使用 Claude Code 时,每次向 Anthropic API 发出的请求都会包含一个特殊的 system 块:

json
{
  "type": "text",
  "text": "x-anthropic-billing-header: cc_version=2.1.37.fbe; cc_entrypoint=cli; cch=a112b;"
}

这不是 system prompt,而是被伪装成文本的请求元数据。其中 cch 字段是请求完整性校验值——算错了,API 直接返回错误;算对了,fast mode 等功能才解锁。

有人从编译后的 Bun 二进制里逆向出了整个签名机制。

签名不在 JavaScript 层

Claude Code 以 Bun 二进制发布,所有 JavaScript 被打包进单个可执行文件。在提取出的压缩 JS 源码中,能找到构造 billing header 的函数,但 cch 字段始终是占位符 00000——JavaScript 层面从未计算过真正的哈希值。

追踪整个 JS 调用栈,从 header 构造到 JSON.stringify 再到 fetch(),占位符始终不变。

替换发生在 Bun 的原生 fetch 实现中——编译后的 Zig 代码,不在 JavaScript 层面。Claude Code 使用定制的 Bun 构建(1.3.9-canary.51+d5628db23),一个公开仓库中不存在的私有分支。(Anthropic 收购了 Bun 背后的 Oven 公司。)

定制 runtime 的 nativeFetch 只在三个条件同时满足时激活:URL 路径包含 /v1/messages、存在 anthropic-version header、请求体中包含 cch=00000 占位符。满足后,它对整个请求体(含占位符)计算哈希,然后原地替换 5 字符结果。

一个值得注意的细节:Bun 的 nativeFetch 直接修改了 JS 字符串的内存,违反了 JavaScript 字符串不可变的语言规范。由于 JSC(Bun 使用的 JS 引擎)共享字符串底层存储,这种修改会影响所有指向同一内存的引用——Map/Set 键、字符串别名、interned strings 全部会受影响。

从内存入手的逆向

研究者没有从代码入手,而是从内存入手。用 LLDB 附加到运行中的 Bun 进程,在 cch=00000 所在的内存位置设置 watchpoint。请求触发时 watchpoint 命中,反汇编指向的函数虽无符号名,但包含 xxHash64 的五个素数常量和标准 avalanche 收尾序列——教科书级实现。

种子值位于二进制数据段,是一个 64 位常量。研究者收集了 142 组已知的输入/输出对,全部验证通过。

签名算法

签名分两部分。

cc_version 后缀(JavaScript 层):

  1. 取对话中第一条用户消息的第 4、7、20 位字符(不足补 0
  2. 拼接:盐值 + 提取的字符 + 版本号
  3. 计算 SHA-256,取前 3 位 hex

盐值是一个 12 字符的 hex 常量,嵌在 JS 源码中。

cch 哈希(原生层):

  1. 构建包含 cch=00000 占位符的完整请求体
  2. 序列化为 JSON
  3. 计算 xxHash64(body, seed) & 0xFFFFF
  4. 格式化为 5 位零填充小写 hex
  5. 原地替换占位符

Python 实现大约 30 行代码。

安全模型:混淆而非加密

研究者系统性排除了其他可能的访问控制机制:

  • TLS 指纹:Python + OpenSSL(HTTP/1.1)可以成功重放
  • 二进制证明:没有嵌入证书
  • 预注册握手:单次重放即可工作,无需预先建立连接
  • 连接关联:普通 fetch() 即可
  • 重放检测:同一请求体可多次发送

cch 是唯一的服务端门控。

验证实验也表明,哈希覆盖整个序列化后的请求体——messages、tools、metadata、model、thinking config 全部在内。修改 tool 描述中的一个词,请求就会被拒绝。唯一可以安全修改的是 system prompt 中的非计费块,因为它们在 billing header 构建之后才被注入。

选择 xxHash64(非密码学哈希)进一步说明意图:速度优先,安全次之。一旦知道算法和常量,重新实现几乎没有门槛。常量随版本更新而变,但提取过程是机械性的——JS 源码可以从 Bun 二进制中提取,种子需要一点二进制分析。

研究者总结:这是计费管道,不是访问控制边界。Anthropic 本可以选择代码签名、二进制证明、加密 blob 等更强的保护手段,但没有这么做。这本身就说明了定位。

逆向示意图

来源: https://a10k.co/b/reverse-engineering-claude-code-cch.html

相关推荐