逆向 Claude Code:藏在日期字符串里的隐蔽环境标记
前几天在 X 上看到 AI超元域转了一条消息,说有人发现 Claude Code 里藏了检测代理的逻辑。Reddit 原帖标题用的是"spyware",措辞很重。我用 Claude Code 用得多,决定自己看一眼代码,搞清楚到底是怎么回事。
下面不是转发帖子,是我对本地安装的 Claude Code 以及官方 npm 包做交叉核验后整理出来的结果。
先说结论,避免扩大化
外部讨论里常说的是"proxy",但我本地核验到的代码路径更准确地说是 ANTHROPIC_BASE_URL——一个专门指定 Anthropic API 端点的环境变量,不是普通的 HTTP_PROXY / HTTPS_PROXY。这个区别很重要:如果你没设置自定义 API 网关,这段逻辑根本不会触发。
具体来说:
- 如果
ANTHROPIC_BASE_URL未设置,或者 host 是api.anthropic.com,什么都不会发生。 - 如果
ANTHROPIC_BASE_URL指向一个非 Anthropic 的 host,它会读取这个 host,再检查本机时区是否为Asia/Shanghai或Asia/Urumqi。 - 如果时区命中,日期从
2026-06-30变成2026/06/30——横杠换斜杠。 - 同时,根据 host 是否命中一张内置的 domain list 或 lab keyword list,
Today's里那个撇号会被替换成不同的 Unicode 字符。 - 最终结果进入 prompt/context 的
currentDate字段,不是死代码。
也就是说,一句看起来完全正常的 Today's date is 2026-06-30.,实际上可以通过 Unicode 字符和日期分隔符,编码出几种环境信息。
行为还原
我本地看的是 Claude Code 2.1.196。相关函数名在这个版本里是 Crt()、Rrt(e)、e0t()、Qup()、Zup()、edp()、Vla(),但这些是 minified 名字,不同版本可能会变。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-02T22:37:15.575Z,包里的 cli.js 已经有同类逻辑。官方 changelog 的 2.1.91 条目没有提到这件事。
复现思路:
本地安装版如果是 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 个)
我的看法
我认为这里至少有几个问题值得想想。
第一,透明度。 这是通过自然语言文本里的细微 Unicode 差异做环境标记。一个普通用户看到 Today's date is 2026-06-30.,不会意识到那个撇号被动了手脚——它编码了你的 API 网关分类和时区信息。2.1.91 的 changelog 没有披露这个行为。
第二,有效性存疑。 如果目的是识别 API 转售或蒸馏,这种机制对真正有对抗能力的人来说很容易绕过——混淆后的代码公开在 npm 包里,解码方式就是 base64 + XOR 91。但它对普通用户的透明度影响是实打实的。
第三,边界。 我能确认的只是代码行为本身。不能证明 Anthropic 后端是否解析这些 marker,也不能证明添加这段逻辑的主观动机。更谨慎的说法是:这个实现与环境标记/分类信号的模式一致,而且它隐藏在 currentDate 的自然语言字符串里,选择了不被察觉而不是公开声明。
不过话说回来,在我写这篇文章的时候,我用的就是 Claude Code。