这两天,Claude 圈子又不太平,又在大面积封号了。Reddit、X、中文技术社区里,都有人在晒 Claude 被暂停、Claude Code 不能用、账号收到风控邮件的截图。Anthropic 公开谈蒸馏攻击,外媒报道 Anthropic 指控 Alibaba 通过大量账号抽取 Claude 能力,还有 Reddit 上有人把 Claude Code 里的可疑代码扒了出来。
我本来以为又是老三样:IP 不干净、支付路径异常、新号用太猛。后来顺着 Reddit 那篇帖子,把 Claude Code 的几个 npm 包自己拉下来对比了一遍,才发现这事不是一句「换个干净 IP」就能讲完。
Claude Code 客户端里确实有一套很隐蔽的环境标记逻辑。它会读你的本地时区、ANTHROPIC_BASE_URL,再对照一份内置域名和关键词名单,最后悄悄改掉 system prompt 里的一句话。
表面上只是日期:
Today's date is 2026-06-30.
实际上,这句话可以变成好几个版本。肉眼看着差不多,服务端却能轻松区分。
先说最近这波封号
最近几天,Reddit、X、Linux.do、V2EX 一类社区里,确实有不少 Claude 和 Claude Code 用户在讨论账号暂停、风控邮件、封号截图。
Anthropic 自己也确实在讲蒸馏攻击。他们那篇《Detecting and preventing distillation attacks》里说得很明白,会用 IP correlation、request metadata、infrastructure indicators、behavioral fingerprinting 这些信号去识别大规模蒸馏。
外媒这边,Reuters、Tom’s Hardware 等都报道了 Anthropic 指控 Alibaba 相关活动的事情。报道里提到的数字很大:约 25,000 个虚假账号,28.8M 次 Claude 交互。
再加上 Claude Code 客户端里能看到的那套环境水印逻辑,这几件事合在一起看,就不是普通的「我听说又封号了」。
我的判断是:这轮风控不一定只针对某一个群体,但 Claude 对账号、网络、客户端环境、调用行为的画像肯定变细了。
深入分析
按照 Reddit 帖子,我拉了Claude Code的这些版本:
@anthropic-ai/claude-code@2.1.90
@anthropic-ai/claude-code@2.1.91
@anthropic-ai/claude-code@2.1.126
@anthropic-ai/claude-code@2.1.196
对比结果很直接。
2.1.90 里,我没有搜到这套 Asia/Shanghai、ANTHROPIC_BASE_URL、Unicode 撇号标记逻辑。
2.1.91 里,相关逻辑出现了。
我本机装过的 2.1.126,主逻辑已经被打进一个 200MB 级别的二进制文件里,但用字符串搜索仍然能看到同类代码。
到了 2.1.196,npm 主包变成了很小的 wrapper。真正的程序在平台相关的 native 包里,比如 macOS arm64 对应:
@anthropic-ai/claude-code-darwin-arm64@2.1.196
这个 native 包解压后大约 225MB。我把它也拉下来搜了一遍,确认同类逻辑仍然存在。
所以时间线大概是这样:
2.1.90:没看到
2.1.91:开始出现
2.1.126:仍存在
2.1.196:仍存在
这也解释了为什么 Reddit 那篇帖子的说法值得认真看。它不是凭空猜的,至少版本点对得上。
2.1.91 里那段代码
2.1.91 的包里还有明文 cli.js,所以比较好查。
搜 Asia/Shanghai,能看到一段压缩后的代码。整理成人能看的样子,大概是这样:
function fi_() {
let q = process.env.ANTHROPIC_BASE_URL;
if (!q) return null;
try {
return new URL(q).hostname.toLowerCase();
} catch {
return null;
}
}
function Zi_() {
if (OM()) return null;
let q = fi_();
let K = Hu6();
let _ = K === "Asia/Shanghai" || K === "Asia/Urumqi";
if (!q) return { known: false, labKw: false, cnTZ: _, host: null };
return {
known: Wi_().some((z) => q === z || q.endsWith("." + z)),
labKw: Di_().some((z) => q.includes(z)),
cnTZ: _,
host: q,
};
}
function Gi_(q, K) {
if (!q && !K) return "'";
if (q && !K) return "’";
if (!q && K) return "ʼ";
return "ʹ";
}
function fM4(q) {
let K = Zi_();
let _ = Gi_(K?.known ?? false, K?.labKw ?? false);
let z = K?.cnTZ ? q.replace(/-/g, "/") : q;
return `Today${_}s date is ${z}.`;
}
这段代码做的事不复杂,但很巧。
它先读 ANTHROPIC_BASE_URL,拿到 hostname。然后读本机时区,看是不是 Asia/Shanghai 或 Asia/Urumqi。接着查两份名单:一份是域名名单,一份是关键词名单。最后,根据命中结果,改变 Today's date is ... 这句话里的撇号和日期格式。
重点不在日期。
重点在于:客户端环境被编码进了 system prompt。
日期水印长什么样
普通情况下,system prompt 里可能是:
Today's date is 2026-06-30.
命中不同条件后,可能变成:
Today’s date is 2026-06-30.
Todayʼs date is 2026-06-30.
Todayʹs date is 2026-06-30.
Today’s date is 2026/06/30.
这几个撇号不是一个字符:
' 普通 apostrophe
’ U+2019
ʼ U+02BC
ʹ U+02B9
人眼很难注意到,更不容易区分开,但是程序不会看错。
如果本机时区是 Asia/Shanghai 或 Asia/Urumqi,日期分隔符还会从 - 换成 /。比如 2026-06-30 变成 2026/06/30。
这就像在正常句子里塞了一个小标签。你看着它还是一句日期提示,服务端看到的却是几种不同环境的编码结果。
那份内置名单
代码里还有一个简单的解码函数:
function DM4(q) {
let K = Buffer.from(q, "base64");
let _ = "";
for (let z of K) _ += String.fromCharCode(z ^ Mi_);
return _.split(",");
}
var Mi_ = 91;
就是把 base64 解出来,再每个字节和 91 做异或,最后按逗号切开。
解出来以后,有 147 个域名或后缀,还有 11 个关键词。
域名名单前面一段长这样:
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
xaminim.com
moonshot.ai
anyrouter.top
后面还有不少第三方 API、聚合转发、代理服务相关域名。
关键词名单是:
deepseek
moonshot
minimax
xaminim
zhipu
bigmodel
baichuan
stepfun
01ai
dashscope
volces
看到这里,味道就出来了。
它不是单纯判断「你有没有代理」。它还在判断你有没有使用某些第三方 API 转发、国产模型聚合、国内云服务、国内大厂相关域名。
尤其是 alibaba-inc.com、aliyuncs.com、dashscope 这几个,放在 Anthropic 指控 Alibaba 蒸馏 Claude 的背景里,很难让人不联想。
2.1.196 里还在
新版的包结构变了。
@anthropic-ai/claude-code@2.1.196 主包里有个 install.cjs,安装时会按平台复制 native binary。macOS arm64 对应的包是:
@anthropic-ai/claude-code-darwin-arm64@2.1.196
这个包里的主文件是 225MB 左右的 claude 二进制。
我在这个二进制里继续搜 ANTHROPIC_BASE_URL、Asia/Shanghai、Asia/Urumqi,还能看到同类逻辑,只是函数名变成了另一组:
function Qup() {
let e = process.env.ANTHROPIC_BASE_URL;
if (!e) return null;
try {
return new URL(e).hostname.toLowerCase();
} catch {
return null;
}
}
function Zup() {
if (Crt()) return null;
let e = Qup();
let t = e0t();
let n = t === "Asia/Shanghai" || t === "Asia/Urumqi";
if (!e) return { known: false, labKw: false, cnTZ: n, host: null };
return {
known: Jup().some((r) => e === r || e.endsWith("." + r)),
labKw: Xup().some((r) => e.includes(r)),
cnTZ: n,
host: e,
};
}
function edp(e, t) {
if (!e && !t) return "'";
if (e && !t) return "\u2019";
if (!e && t) return "\u02BC";
return "\u02B9";
}
function Vla(e) {
let t = Zup();
let n = edp(t?.known ?? false, t?.labKw ?? false);
let r = t?.cnTZ ? e.replaceAll("-", "/") : e;
return `Today${n}s date is ${r}.`;
}
那两份名单也还在:147 个域名或后缀,11 个关键词。alibaba-inc.com、aliyuncs.com、dashscope、deepseek、moonshot、volces 这些都能看到。
所以这套逻辑不是 4 月某个版本里昙花一现。至少到我验证的 2.1.196,它还在。
这算不算间谍软件?
Reddit 标题里用了 spyware 这个词。这个词很抓眼球,也很容易传播。
但我觉得技术上要说准一点。
它不像传统意义上的间谍软件,不是偷偷扫描你的硬盘,也不是把你的项目文件打包上传。至少我这次看的是这条线,没有看到那种行为。
但它也绝不是普通的日期格式小优化。
它做的事是:把客户端环境特征编码进 system prompt。
也就是说,服务端不需要再发一个单独的检测请求。你正常用 Claude Code,请求里本来就要带 system prompt。只要这句话里的撇号和日期格式发生变化,服务端就能反推出一些东西:
是不是中国时区
有没有配置 ANTHROPIC_BASE_URL
Base URL 是否命中某些第三方转发域名
Base URL 是否包含 deepseek、dashscope、volces 这类关键词
这比明着传一个 telemetry 字段更隐蔽,因为它混在正常 prompt 里。
所以我更愿意叫它「system prompt 水印」或者「客户端环境水印」。这个说法比 spyware 冷一点,但更准确。
邮件追踪那件事
这两天还有一种说法:Claude 的封号邮件里有追踪像素,用户打开邮件后,Anthropic 通过远程图片拿到 IP,再进一步判断账号风险。
这个说法不能完全排除。
邮件追踪像素本来就能拿到一些信息,比如打开时间、打开邮件时的 IP、邮件客户端、是否加载远程图片。很多营销邮件都这么干,不是什么新技术。
但我不建议把它归类为这轮封号的主因。
原因很现实。
很多邮箱会代理图片请求,Gmail 和 Apple Mail 都会影响追踪结果。很多人也默认不加载远程图片。更重要的是,如果封号邮件是在账号被封之后发出的,那它最多是后续校验信号,不可能是触发封号的前置原因。
它可能有用。比如账号长期声称自己在美国使用,但封号邮件打开时暴露了一个国内 IP,这种矛盾可能会被记一笔。
但和 Claude Code 里这套已经能验证的环境水印相比,邮件像素这条线目前证据不够硬。
我会把它放在「可能的辅助信号」里,而不是当成主线。
我对封号原理的判断
Claude 大概率不是靠一条规则封号。
不是「中国时区就封」,也不是「用了代理就封」,更不是「打开封号邮件就封」。这种大服务的风控通常不会这么粗。
更可能是多项信号叠加。
账号本身会被看:邮箱、手机号、支付路径、账号年龄、新号是不是一上来就高强度使用。
网络也会被看:出口 IP 属于哪个国家,ASN 是什么,像住宅 IP 还是机房 IP,是不是很多人共享,是不是频繁换国家,DNS 有没有泄露,系统时区和出口地区是不是对得上。
客户端这边,现在能看到的信号就更多了:Claude Code 版本、system prompt 水印、ANTHROPIC_BASE_URL、第三方转发、国内服务域名命中情况。
行为也跑不掉:短时间高频请求,大量相似 prompt,快速消耗额度,自动化批处理,或者明显像在批量生成训练数据。
最后还有图谱。多个账号共用一个出口、行为节奏接近、都走同一套转发基础设施,这种东西风控系统很容易串起来。
Anthropic 自己讲蒸馏攻击时说过 IP correlation、request metadata、infrastructure indicators、behavioral fingerprinting。翻译成人话就是:他们看的不是一个点,而是一张网。
普通用户最麻烦的地方就在这里。
你可能只是写代码,并没有蒸馏模型。但如果你的环境长得像批量账号的一部分,比如共享机场节点、国内时区、DNS 泄露、第三方 Base URL、新号高强度使用,那风控系统未必有耐心区分你到底是不是无辜。
它只会觉得你像高风险用户。
我的建议
自建 VPS 不能保证 Claude 永远不封号,这个话不能说满。
但它至少能解决一个很实际的问题:不要和几百上千个人挤同一个高危出口。
很多机场节点的问题不是慢,而是脏。一个出口 IP 后面可能有正常用户,也可能有批量注册、爬虫、自动化工具、API 转发服务,还有各种乱七八糟的流量。你和这些人共用一个出口,风控系统很难把你摘干净。
自建 VPS 的价值在于可控。
出口相对独立,线路自己选,IP 不乱跳,DNS 规则自己管,Claude 相关站点可以固定走同一条链路。你可以把系统时区、浏览器环境、DNS、代理规则都调到一致,而不是今天一个节点,明天另一个国家,后天又从一个被滥用的共享出口登录。
如果再配合静态住宅 IP 或链式代理,整体画像会更稳定。它不是绕过风控,而是减少误伤。
说白了,风控最怕你像机器、像批量账号、像共享代理池。自建 VPS 做不到让你百分百安全,但能让你的网络环境更像一个稳定的真实用户。
如果你想自己搭,可以先看这两篇:
现在该注意什么
如果你已经在用 Claude Code,我建议先检查几件事。
不要乱配 ANTHROPIC_BASE_URL。不明来源的第三方 Claude API 转发,能不用就不用。频繁切换国家和出口 IP,也尽量避免。DNS 泄露、系统时区和出口地区对不上,这些以前可能只是小问题,现在都可能变成画像的一部分。
新号尤其别上来就猛干。刚注册没多久,就连续高强度跑 Claude Code、快速打满额度、配合自动化脚本批量请求,这种行为太像风控系统要抓的东西。
如果你长期订阅 Claude,尤其是拿 Claude Code 做 AI Coding,最好准备一套稳定环境:固定出口、固定 DNS、固定时区、固定设备环境、固定使用节奏。
很多人以前只关心「能不能打开」「速度快不快」。现在看,还得多问几句:
这个出口干不干净?
是不是很多人共用?
会不会频繁跳 IP?
DNS 和时区是否一致?
能不能长期稳定?
Claude 这轮封号真正提醒我的,不是「别用 Claude」,而是海外 AI 服务的风控已经细到客户端环境这一层了。
以前能打开网页就行。
现在不一样。
现在它看的是完整环境画像。