Claude Code 用撇号出卖了你的中转站

前几天在 X 上看到有人发现 Claude Code 里藏了检测代理的逻辑。Reddit 原帖标题用的是"spyware",措辞很重。我自己天天用 Claude Code,就直接去看了代码。
下面是我对本地安装版和官方 npm 包交叉核验后整理出来的东西。
到底查了什么
外面讨论里说的都是"proxy",但代码里检测的其实是 ANTHROPIC_BASE_URL——一个指定 Anthropic API 端点的环境变量,不是 HTTP_PROXY / HTTPS_PROXY。你没设自定义 API 网关,这段代码根本不跑。
ANTHROPIC_BASE_URL没设、或 host 就是api.anthropic.com,什么都不会发生。- 指向其他 host 时,它会读这个 host,同时检查本机时区是不是
Asia/Shanghai或Asia/Urumqi。 - 时区命中的话,日期从
2026-06-30变成2026/06/30——横杠换斜杠。 - 根据 host 是否在内置的 domain list 或 lab keyword list 里,
Today's里的撇号会换成不同的 Unicode 字符。 - 最终写进 prompt 的
currentDate字段。
一句看起来完全正常的 Today's date is 2026-06-30.,撇号和日期分隔符里其实藏着你的环境信息。
真正聪明的地方
我一开始也没想通这有什么用。检测到你用了第三方 provider——然后呢?
九原客(@9hills)在推特上点破了这一层:关键不在客户端检测,在服务端比对。你本地 ANTHROPIC_BASE_URL 配的是第三方域名,但请求最终还是打到 Anthropic 的 API。Anthropic 一看,这条请求的 prompt 里日期格式被改过了、撇号也不对——那发这条请求的 IP 和账号背后必然挂着一个中转站。
prompt 本身就是信号,不需要额外的网络上传。企业内网环境也没用,只要模型请求最终到达 Anthropic,marker 就到了。即使后面挂的是 AWS Bedrock,只要经过了中转站,一样能被识别。批量比对下来,中转站的 IP 和关联账号可以一锅端。
说白了,这是一个服务端反向识别中转站的信号系统。prompt 是载体,撇号和日期格式是编码,Anthropic 自己的请求日志是解码端。
行为还原
我本地看的是 Claude Code 2.1.196。函数名是 minified 的(Crt()、Rrt(e)、e0t()、Qup()、Zup()、edp()、Vla()),不同版本会变。Vla(GSe()) 用来构造 currentDate。
逻辑大致可以还原为:
四种撇号的对应关系:
| known | labKw | 字符 | Unicode |
|---|---|---|---|
| false | false | ' | U+0027 普通 ASCII 撇号 |
| true | false | ’ | U+2019 右单引号 |
| false | true | ʼ | U+02BC 修饰字母撇号 |
| true | true | ʹ | U+02B9 修饰字母 prime |
肉眼几乎看不出区别。
npm 包交叉核验
下载了官方 npm 包 @anthropic-ai/claude-code@2.1.91 做交叉核验。npm metadata 显示发布于 2026-04-02——和 Thariq 说的"三月份上线"对得上。cli.js 里已经有同类逻辑,changelog 没提。
本地安装版如果是 Bun standalone binary,也可以直接在二进制里搜这些字符串,再向前后截取 minified JS 片段。
内置列表
列表以 base64 编码存储,解码后逐字节 XOR 91 还原。
lab keyword 一共 11 个:
全是中国 AI 公司的产品名或 API 域名关键词。
known domain 一共 147 个。前面几个是大厂内网域名:sankuai.com(美团)、netease.com、baidu-int.com、alibaba-inc.com、bytedance.net、xiaohongshu.com、jd.com、bilibili.co、iflytek.com……后面大量是第三方 API 转售站:aihubmix.com、apiyi.com、yunwu.ai、openclaude.me 之类。还有一个裸顶级域 cn——任何 .cn 域名都会命中。
完整 known domain 列表(147 个)
想了想
Thariq 回应得很快,也很直接——承认了,给了理由,说要撤。
但这东西从三月就在跑了,一直没公开说过。要不是有人在 Reddit 发帖、推特上传开,大概还会安静地待在那里。他说“we've actually been meaning to take this down for a while”,这话没法证伪,但至少说明他们并不觉得这个实验需要主动告知用户。
他还提了一句“the team has landed stronger mitigations”。更强的方案是什么,不知道。但反转售和反蒸馏的对抗不会因为这段代码被撤就结束。
我对 Anthropic 需要保护商业利益没什么意见,中转站确实是个问题。但把信号藏在 prompt 的 Unicode 字符里,不在 changelog 提,被发现了才承认——这个做法本身就是一种选择:在用户知情和检测有效性之间,选了后者。
不管怎样,下个版本这段代码就没了。在那之前,你可以 grep 一下自己的 currentDate 看看长什么样。
在我写这篇文章的时候,我用的就是 Claude Code。
来源: 九原客 @9hills 关于服务端比对机制的分析 · Thariq @trq212 Anthropic 官方回应