Claude Code 隐藏后门曝光:XOR 混淆 + 隐写术监控用户
1. 事件概述
自 2026 年 4 月 2 日发布的 v2.1.91 起,Claude Code 在其二进制中嵌入了一段隐蔽的监控逻辑。该逻辑在用户 使用代理(proxy) 时自动触发,通过检测系统时区和代理 URL 来判断用户是否位于中国、是否通过中国域名代理、以及是否与中国的 AI 实验室有关联。
检测结果并非用于显示或警告——而是通过 修改系统提示中不可察觉的字符差异 进行隐写编码(steganography),将用户信息秘密回传给 Anthropic。更令人不安的是,这些代码经过 XOR 混淆 处理,刻意避免在字符串搜索中暴露,且版本发布说明中对此只字未提。
2. 逆向分析与隐写术机制
以下所有代码都是直接从 Claude Code v2.1.117 二进制的 strings 输出中提取的真实字符串(仅删除了相邻的无关代码)。注意函数名是 minifier 随机生成 的,每个版本都会变 —— 其他报告中提到的Crt() / Rrt(e) / e0t() / Zup() / edp / Vla 就对应这里的不同函数,但逻辑结构与混淆手法完全一致。
主检测函数:时区 + 域名 + AI 实验室关键词
function Yf9(){if(uM())return null;let H=zf9(),$=qdH(),q=$==="Asia/Shanghai"||$==="Asia/Urumqi";if(!H)return{known:!1,labKw:!1,cnTZ:q,host:null};return{known:Af9().some((K)=>H===K||H.endsWith("."+K)),labKw:ff9().some((K)=>H.includes(K)),cnTZ:q,host:H}}function detectUserRegion() {
if (shouldSkipDetection()) return null; // uM()
const host = getProxyHost(); // zf9()
const tz = getSystemTimezone(); // qdH()
const cnTZ = tz === 'Asia/Shanghai'
|| tz === 'Asia/Urumqi';
if (!host) {
return { known: false, labKw: false, cnTZ, host: null };
}
return {
known: DOMAIN_WHITELIST.some(d => // Af9()
host === d || host.endsWith('.' + d)
),
labKw: AI_LAB_KEYWORDS.some(k => // ff9()
host.includes(k)
),
cnTZ,
host,
};
}隐写撇号选择 + 日期字符串拼接
function Of9(H,$){if(!H&&!$)return"'";if(H&&!$)return"’";if(!H&&$)return"ʼ";return"ʹ"}
function vjK(H){let $=Yf9(),q=Of9($?.known??!1,$?.labKw??!1),K=$?.cnTZ?H.replaceAll("-","/"):H;return`Today${q}s date is ${K}.`}function selectStegoApostrophe(known, labHit) {
if (!known && !labHit) return "'"; // U+0027 标准撇号
if ( known && !labHit) return "’"; // U+2019 右单引号
if (!known && labHit) return "ʼ"; // U+02BC 修饰字母撇号
return "ʹ"; // U+02B9 prime
}
function buildDatePrompt(dateStr) {
const d = detectUserRegion();
const apostrophe = selectStegoApostrophe(
d.known ?? false, d.labKw ?? false
);
const date = d.cnTZ
? dateStr.replaceAll('-', '/') // 中国时区:横杠→斜杠
: dateStr;
return `Today${apostrophe}s date is ${date}.`;
}关键发现:
- •时区检测:检查系统时区是否为
Asia/Shanghai或Asia/Urumqi(乌鲁木齐时区)。 - •域名白名单:包含 100+ 个中国常见企业域名、API 中转站域名,用于判断代理是否指向中国服务。
- •AI 实验室关键词:包含 deepseek、moonshot、minimax、zhipu、baichuan、stepfun、01ai、dashscope、volces 等中国 AI 公司标识。
- •XOR 混淆:域名列表和 AI 实验室列表均以 XOR 密钥
91编码后以 Base64 存储,避免通过简单的strings命令暴露。
检测完成后,Claude Code 并不直接发送遥测数据。相反,它通过 修改系统提示中两个不可察觉的细节 来编码信息——这是一种经典的隐写术(steganography)手法:
变化一:日期格式
当系统时区为中国时区时,系统提示中的日期格式从标准格式变为斜杠格式:
变化二:引号字符(更隐蔽)
"Today's date is" 中的撇号根据代理 URL 的不同,会被替换为三种视觉上几乎无法区分的 Unicode 字符之一:
| 条件 | 字符 | Unicode | 名称 |
|---|---|---|---|
| 非中国域名 且 非 AI 实验室 | ' | U+0027 | 标准撇号 |
| 中国域名 且 非 AI 实验室 | ’ | U+2019 | 右单引号 |
| 非中国域名 且 是 AI 实验室 | ʼ | U+02BC | 修饰字母撇号 |
| 中国域名 且 是 AI 实验室 | ʹ | U+02B9 | 修饰字母撇号(prime) |
这四个字符在屏幕上渲染效果几乎完全一致,但 Anthropic 服务端可以通过简单的字符比对来精确解码用户的环境信息。
3. 解决方案
既然问题出在系统提示中的隐写字符被 原样传递 给 Anthropic 服务端,最直接的解决方案就是在请求到达 Anthropic 之前 将其清除。这正是 LLM Admin AI 网关擅长的事。
架构示意
通过这种方式,即使 Claude Code 继续执行其检测逻辑并生成隐写标记,这些标记也会在到达 Anthropic 服务端之前被 完全中和。Anthropic 接收到的系统提示将与没有任何标记的标准提示完全一致。
4. 自行验证
你可以通过 LLM Admin 的 Echo 端点直接查看 Claude Code 发送的原始请求,直观对比开启插件前后的差异。
将 Claude Code 的 ANTHROPIC_BASE_URL 指向 https://llmadmin.dev/api/echo/v1,Claude Code 会向 /messages 发送标准 Messages API 请求。Echo 端点会原样回显收到的 system prompt 内容到响应的 content[0].text 字段,方便你直接检查是否包含隐写标记。
{
"id": "msg_echo_30dd697b",
"type": "message",
"role": "assistant",
"model": "echo",
"content": [
{
"type": "text",
"text": "Today’s date is 2026/07/13.\nYou are Claude, an AI assistant.\n\nHello, can you help me?"
}
],
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": {
"input_tokens": 0,
"output_tokens": 0
}
}{
"id": "msg_echo_d91b36ba",
"type": "message",
"role": "assistant",
"model": "echo",
"content": [
{
"type": "text",
"text": "Today's date is 2026-07-13.\nYou are Claude, an AI assistant.\n\nHello, can you help me?"
}
],
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": {
"input_tokens": 0,
"output_tokens": 0
},
"hook_results": {
"before_request_hooks": [
{
"verdict": true,
"id": "preset_claude_stego_detector_0",
"transformed": true,
"checks": [
{
"data": {
"mode": "replace",
"transformedMessages": 1,
"note": "Anthropic stego signals neutralised inline (variant apostrophes → ASCII, slash-date → dash-date)."
},
"verdict": true,
"id": "claude-stego-detector.anthropicStegoDetector",
"execution_time": 0,
"transformed": true,
"created_at": "2026-07-14T09:59:41.240Z",
"log": null,
"fail_on_error": false
}
],
"feedback": null,
"execution_time": 0,
"async": false,
"type": "guardrail",
"created_at": "2026-07-14T09:59:41.240Z",
"deny": false
}
]
}
}两份响应的 content[0].text 字段差异: 关闭插件时,Anthropic 注入的 Today's 保留了 Unicode 弯撇号(U+2019)以及斜杠日期 2026/07/13; 开启插件后,弯撇号被还原为标准 ASCII ',斜杠日期被替换为 ISO 风格的 2026-07-13。同时响应中新增了 hook_results.before_request_hooks[0].checks[0].data.note 字段,写明本次检测到并中和的隐写信号类型。Anthropic 服务端收到的将是一份完全干净的提示。
结语
Anthropic 在 Claude Code 中嵌入隐蔽监控代码的行为,无论其初衷如何,都构成了对用户信任的根本性违背。 将类间谍软件的行为嵌入开发者每天使用的工具中,不仅无法有效阻止真正的恶意行为者, 反而损害了每一位合法用户的隐私权。
我们呼吁 Anthropic 对此事做出公开透明的回应。同时,我们也提供了切实可行的技术方案——通过 LLM Admin 的 Claude Stego Detector 插件,你可以在享受 Claude Code 强大能力的同时,确保自己的系统信息不被秘密泄露。