claude-cn-flag-check
v0.1.0
Published
Check whether Claude Code would covertly flag your environment as a China user (timezone + relay-hostname region marking). Reproduces the client's bundled detection logic for self-audit.
Maintainers
Readme
claude-cn-flag-check
Claude Code 会不会把你的环境悄悄标记成「中国用户」?一条命令就能自查。
2026 年年中,有人逆向发现 Claude Code(@anthropic-ai/claude-code CLI,自 v2.1.91 起)会静默判断一条请求是否来自中国大陆,并用 Unicode 隐写术把结果编码进 system prompt——不走任何遥测字段,发布日志里也只字未提。Anthropic 随后承认这是一项「实验性」的防转售 / 防蒸馏措施,并称将移除。
本工具默认进行真实检测:实际运行一次 Claude Code、指向本地端点,读取它真正
发出的隐写标记——不是预测;也可退回本地复刻逻辑做计算估算(--no-capture)。只读取
你自己的环境,不上传任何数据。
已针对 @anthropic-ai/[email protected] 验证:域名 / 关键词清单在运行时直接从你已安装的二进制里去混淆解出,因此结论与你实际运行的版本一致。
检测机制到底是怎样的
只有当你通过 ANTHROPIC_BASE_URL 把 Claude Code 指向第三方端点(中转站 / 代理)时才会触发。走官方 api.anthropic.com、或没设 base URL 时完全跳过——那种情况下时区无所谓。触发时会计算三个正交信号:
| 信号 | 来源 | 如何编码进 Today's date is … |
|---|---|---|
| cnTZ | 系统时区为 Asia/Shanghai 或 Asia/Urumqi | 日期分隔符 - → /(如 2026-07-03 → 2026/07/03) |
| known | 中转 hostname 命中内置 147 条域名清单(精确或子域;清单含裸 cn,所以任何 *.cn 主机都命中) | 撇号 → U+2019 |
| labKw | 中转 hostname 含中国 AI 实验室关键词(deepseek、moonshot、dashscope 等) | 撇号 → U+02BC |
| known + labKw 同时命中 | — | 撇号 → U+02B9 |
Today's 里的撇号 + 日期分隔符共同构成一个 2–3 bit 标记,服务器侧读回——在任何编辑器里都和正常那行长得一模一样。
安装
npm install -g claude-cn-flag-check
# 或免安装直接跑一次:
npx claude-cn-flag-check需要 Node.js ≥ 18(装了 Claude Code 就一定有 Node)。
使用
自查当前环境:
claude-cn-flag-checkCLI 会先把所有检测项列出来,再用扫描动画逐项刷新结果(像网页扫描器),最后给出
0–100 风险分与判定。输出为中文;--json 保留英文结构化字段。示例(中国时区 +
命中清单的中转,最坏情况,已省略部分):
检测项(4 项区域信号)
⚑ 端点类型 第三方中转 · 触发地区检测
✗ 系统时区 (权重 40) 命中 · 中国时区,把日期分隔符 - 改成 /
✗ 中转域名清单 (权重 35) 命中 · 撇号被改成 U+2019
✓ AI 实验室关键词 (权重 25) 未命中
风险分 75/100 ██████████████████░░░░░░ [高]
✗ 会被识别为中国大陆请求。
进入封号风控队列的可能性:高风险分
只有三个真正影响 CLI 的信号计入评分(字体、navigator.language 等浏览器信号对 CLI
无意义,已剔除)。marked 仍是确定性的是/否,评分只表示严重程度:
| 信号 | 权重 |
|---|---|
| cnTZ — 中国时区(挂代理也会泄露) | 40 |
| known — 中转主机命中域名清单 | 35 |
| labKw — 中转主机含 AI 实验室关键词 | 25 |
分档:安全(0)· 低(1–30)· 中(31–60)· 高(61–100)。第一方端点恒为 0。
会被标记时进程退出码为 1,干净时为 0,便于接进启动脚本做环境门禁:
claude-cn-flag-check >/dev/null || echo "⚠️ 当前 shell 会被 Claude Code 打标记"假设性检查(What-if)
不改动环境,测试某个中转或时区:
claude-cn-flag-check --base-url https://my-relay.example.com --tz Asia/Tokyo选项
| 参数 | 含义 |
|---|---|
| --base-url <url> | 检查一个假设的 ANTHROPIC_BASE_URL |
| --tz <zone> | 检查一个假设的 IANA 时区 |
| --assume-first-party | 模拟 _CLAUDE_CODE_ASSUME_FIRST_PARTY_BASE_URL=1 |
| --snapshot | 用内置清单快照,跳过实时提取 |
| --binary <path> | 指定用于提取清单的 claude 二进制路径 |
| --show-list | 打印解码出的域名 / 关键词清单 |
| --json | 机器可读输出 |
| -h, --help / -v, --version | — |
如何降低风控值
- 时区(
cnTZ)——用非中国时区启动:TZ=Asia/Tokyo claude。这是最有效的一招,因为系统时区即使挂了代理也会泄露。 - 中转 hostname(
known/labKw)——换一个不在清单、且不含 AI 实验室关键词、也不是.cn后缀的中转;用中性域名自建可同时避开两者。 - 彻底关闭——
_CLAUDE_CODE_ASSUME_FIRST_PARTY_BASE_URL=1可关掉整套机制(让客户端把你的 base URL 当作第一方)。依赖前请了解其影响。
作为库调用
const { check, isClaudeChinaUser } = require('claude-cn-flag-check');
isClaudeChinaUser(); // 布尔,当前环境
check({ baseUrl: 'https://r.example.com', timezone: 'Asia/Shanghai' });
// → { marked, signals: { cnTZ, known, labKw }, carrier: { dateLine, ... }, features: [...] }真实检测(默认)
默认做的是真实捕获,不是预测:
- 从配置解析出你真实的中转主机(见下节)。
- 写一个临时
CLAUDE_CONFIG_DIR,把ANTHROPIC_BASE_URL指向本地捕获服务器,并 临时在/etc/hosts里把真实中转主机映射到127.0.0.1(自动备份+还原+信号兜底), 这样 Claude Code 仍看到真实主机名,而请求落到本地。 - 运行一次
claude -p,从真实请求体里读出Today's date is …那行,提取观测到的 撇号 + 日期分隔符。
这需要 root(改 /etc/hosts)和可用的 claude。不使用真实凭证(本地拦截),
不修改你真实的 ~/.claude。报告会标注 真实捕获 ✓(观测)或 计算预测。
--no-capture——不运行 claude,改用复刻逻辑做计算。- what-if(
--base-url/--tz)与第一方端点始终为计算 / 确定(无可观测对象)。
配置解析(基于依据)
工具不只信当前进程的环境变量——那反映的是启动它的那个 shell,所以从不同 shell
跑 claude 和 claude-cn-flag-check 可能不一致。它会解析 Claude Code 实际会用的
配置,并把检查过的每个来源都打印出来:
ANTHROPIC_BASE_URL——合并企业管理设置、~/.claude/settings.json、项目.claude/settings.json、.claude/settings.local.json的env块,再叠加进程环境 变量(会话相关,已标注)。所以只在settings.json里配了中转、交互 shell 没 export 的情况,也能被正确检出。- 时区——先看上述
env块里的TZ覆盖,否则读系统/etc/localtime(或/etc/timezone)。
--base-url / --tz 仍可覆盖一切做假设检查。--json 输出包含完整的 resolution
依据链。(ANTHROPIC_AUTH_TOKEN 等密钥永远不读取、不打印。)
准确性如何保证
默认在运行时从你已安装的二进制提取清单:扫描 XOR 编码的 base64 blob,暴力破解单字节密钥,再用已知哨兵域名校验解码结果——因此在混淆变量名逐版本变化的情况下依然可用。提取失败时回退到打了版本戳的内置快照(当前 2.1.170:147 域名、11 关键词)。
免责声明
仅用于透明性与自查。基于公开逆向分析,非 Anthropic 官方结论,且行为可能随 Claude Code 版本变化(Anthropic 已宣布将移除该机制)。请用 --show-list 对照你自己安装的版本。
许可证
MIT © shellus
