随机游走 random‑walk
← 首页 / 技术
技术 / TECH

逆向 Claude Code:藏在日期字符串里的隐蔽环境标记

2026-06-30 约 13 分钟 ·

前几天在 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/ShanghaiAsia/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

逻辑大致可以还原为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (!process.env.ANTHROPIC_BASE_URL) return null;
if (new URL(ANTHROPIC_BASE_URL).host === "api.anthropic.com") return null;
 
host = new URL(ANTHROPIC_BASE_URL).hostname.toLowerCase();
cnTZ = Intl.DateTimeFormat().resolvedOptions().timeZone in ["Asia/Shanghai", "Asia/Urumqi"];
known = knownDomains.some(d => host === d || host.endsWith("." + d));
labKw = labKeywords.some(k => host.includes(k));
 
apostrophe =
!known && !labKw ? "'" :
known && !labKw ? "’" :
!known && labKw ? "ʼ" :
"ʹ";
 
currentDate = `Today${apostrophe}s date is ${date}.`;

四种撇号的对应关系:

knownlabKw字符Unicode
falsefalse'U+0027 普通 ASCII 撇号
truefalseU+2019 右单引号
falsetrueʼU+02BC 修饰字母撇号
truetrueʹ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 条目没有提到这件事。

复现思路:

1
2
3
4
npm view @anthropic-ai/claude-code time --json
npm pack @anthropic-ai/claude-code@2.1.91
tar -xzf anthropic-ai-claude-code-2.1.91.tgz
grep -aob 'Asia/Shanghai\|Today' package/cli.js

本地安装版如果是 Bun standalone binary,也可以直接在二进制里搜这些字符串,再向前后截取 minified JS 片段。

内置列表

列表以 base64 编码存储,解码后逐字节 XOR 91 还原。

lab keyword 一共 11 个:

1
2
3
deepseek moonshot minimax xaminim
zhipu bigmodel baichuan stepfun
01ai dashscope volces

全是中国 AI 公司的产品名或 API 域名关键词。

known domain 一共 147 个。前面几个是大厂内网域名:sankuai.com(美团)、netease.combaidu-int.comalibaba-inc.combytedance.netxiaohongshu.comjd.combilibili.coiflytek.com……后面大量是第三方 API 转售站:aihubmix.comapiyi.comyunwu.aiopenclaude.me 之类。还有一个裸顶级域 cn——意味着任何 .cn 域名都会命中。

完整 known domain 列表(147 个)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# 顶级域
cn
 
# 大厂内网/产品域名
sankuai.com netease.com 163.com baidu-int.com baidu.com
alibaba-inc.com alipay.com antgroup-inc.cn kuaishou.com
bytedance.net xiaohongshu.com ctripcorp.com jd.com jdcloud.com
bilibili.co iflytek.com stepfun-inc.com aliyuncs.com
cn-shanghai.fcapp.run cn-beijing.fcapp.run
 
# AI Lab 域名
xaminim.com moonshot.ai
 
# 转售/镜像站(部分)
anyrouter.top packyapi.com aicodemirror.com aigocode.com
hongshan.com iwhalecloud.com dhcoder.net lemongpt.top
zhihuiapi.top intsig.net high-five-ai.xyz cloudsway.net
4sapi.com 529961.com 88996.cloud 88code.ai
88code.org 91code.pro 992236.xyz
ai.codeqaq.com ai.hybgzs.com ai.kjvhh.com aicanapi.com
aicoding.sh aifast.site aihubmix.com anmory.com
api.5202030.xyz api.ablai.top api.bianxie.ai api.bltcy.ai
api.cpass.cc api.dev88.tech api.dreamger.com api.expansion.chat
api.gueai.com api.holdai.top api.ikuncode.cc api.lconai.com
api.linkapi.org api.mkeai.com api.nekoapi.com api.oaipro.com
api.ruyun.fun api.ssopen.top api.tu-zi.com api.uglycat.cc
api.v3.cm api.whatai.cc api.wpgzs.top api.xty.app
api.yuegle.com api.zzyu.me apimart.ai
apipro.maynor1024.live apiyi.com applyj.hiapi.top augmunt.com
b4u.qzz.io clauddy.com claude-code-hub.app
claude-opus.top claudeide.net co.yes.vg
code.wenwen-ai.com code.x-aio.com codeilab.com cubence.com
deeprouter.top dimaray.com dmxapi.com docs.aigc2d.com
duckcoding.com fk.hshwk.org flapcode.com foxcode.hshwk.org
foxcode.rjj.cc fuli.hxi.me getgoapi.com
gpt.zhizengzeng.com gptgod.cloud gptkey.eu.org gptpay.store
hdgsb.com henapi.top instcopilot-api.com jeniya.top
jiekou.ai kg-api.cloud n1n.ai
new-api.u4vr.com new.xychatai.com one-api.bltcy.top
one.ocoolai.com oneapi.paintbot.top open.xiaojingai.com
openclaude.me opus.gptuu.com poloai.top poloapi.top
privnode.com proxyai.com qinzhiai.com right.codes
runanytime.hxi.me sssaicode.com store.zzyus.top tiantianai.pro
uiuiapi.com uniapi.ai vip.undyingapi.com wolfai.top
wzw.de5.net wzw.pp.ua xairouter.com xaixapi.com
xiaohuapi.site xiaohumini.site xy.poloapi.com
yansd666.com yansd666.top yunwu.ai
yunwu.zeabur.app zenmux.ai

我的看法

我认为这里至少有几个问题值得想想。

第一,透明度。 这是通过自然语言文本里的细微 Unicode 差异做环境标记。一个普通用户看到 Today's date is 2026-06-30.,不会意识到那个撇号被动了手脚——它编码了你的 API 网关分类和时区信息。2.1.91 的 changelog 没有披露这个行为。

第二,有效性存疑。 如果目的是识别 API 转售或蒸馏,这种机制对真正有对抗能力的人来说很容易绕过——混淆后的代码公开在 npm 包里,解码方式就是 base64 + XOR 91。但它对普通用户的透明度影响是实打实的。

第三,边界。 我能确认的只是代码行为本身。不能证明 Anthropic 后端是否解析这些 marker,也不能证明添加这段逻辑的主观动机。更谨慎的说法是:这个实现与环境标记/分类信号的模式一致,而且它隐藏在 currentDate 的自然语言字符串里,选择了不被察觉而不是公开声明。

不过话说回来,在我写这篇文章的时候,我用的就是 Claude Code。

分类 / CATEGORY
技术
标签 / TAGGED IN
Claude Code逆向工程隐私Unicode