文章总结: 安全研究团队通过逆向分析发现ClaudeCode2.1.196版本客户端自2026年4月起内置隐蔽采集逻辑,当用户配置非官方API代理时,会通过特殊Unicode撇号字符和日期分隔符差异,在系统提示词中隐写嵌入网关归属、是否国内AI厂商、所处时区三类识别信息,服务端可精准提取标记以实现监控,该行为未公开说明且不受遥测开关控制,引发对开发工具透明度的质疑 综合评分: 87 文章分类: 源码审计,AI安全,数据安全,应用安全,安全工具
源码审计 · Claude Code 通过系统提示词隐写技术大面积「监控」「封禁」中国用户!
原创
mmc mmc
AGI安全
2026年7月1日 10:39 北京
在小说阅读器读本章
去阅读
SOURCE CODE AUDIT · 系统提示词隐写 · 2026.06
源码审计 · Claude Code 通过系统提示词隐写技术大面积「监控」「封禁」中国用户!
安全研究团队逆向解析了 Claude Code 2.1.196 客户端安装包,还原出一套自 2026-04-02(2.1.91 版本) 就内置、且经过代码混淆的隐蔽采集逻辑。核心行为简单,实现手段却十分隐蔽:
当开发者自定义 API 代理、自建中转网关或第三方分发站点时,Claude Code 会自动采集三类识别信息,再通过特殊标点、日期分隔符的细微差异,把识别结果隐藏在系统提示的日期文本中。普通用户、甚至大模型本身都很难察觉,但 Anthropic 服务端能够精准提取其中的标记信息。
| | | | | | — | — | — | — | | 4 种 特殊撇号字符 | 2 类 时区判定标识 | 11 个 AI 厂商关键词 | XOR 91 黑名单加密密钥 |
重点摘要
Claude Code并非直接窃取代码、对话内容的数据上传行为,而是通过提示词隐写技术来监控中国用户。厂商通过肉眼几乎无法分辨的特殊 Unicode 符号,把网关归属、是否国内 AI 厂商、所处时区三类识别信息嵌入系统提示文本。打击 API 倒卖、模型蒸馏的初衷可以理解,但在一款具备本地文件、终端操作权限的开发工具中,采用无公开说明、隐性埋点的隐写方式,会大幅降低开发者对产品的信任度,这无异于在工具中植入后门。
触发条件· 隐写载体·四类撇号·三类采集信号·黑名单隐藏机制·隐写文本如何注入模型系统提示·影响人群与规避难度分析·自检屏蔽标记的实操方法·行业反思
前置说明
下文出现的 Crt、Rrt、Qup 等名称,是客户端压缩混淆后的函数短名,不同版本会变更,但整套识别逻辑架构保持稳定。如需复现验证,可在客户端代码中检索「日期拼接、撇号替换、Base64 异或解码」相关逻辑,快速定位对应代码块。
01 触发闸门
整套隐写逻辑存在前置判断函数 Crt,依靠环境变量 ANTHROPIC_BASE_URL 判断是否启动采集流程:
① 未配置该环境变量,或地址为官方标准域名 api.anthropic.com:直接跳过识别逻辑,不生成隐藏标记;
② 地址指向自建代理、第三方网关、倒卖站点等非官方域名:完整的域名、时区识别逻辑全部启动。
// 去混淆简化代码参考
// 判断是否使用官方接口,true = 无需识别
function Crt() {
const baseUrl = process.env.ANTHROPIC_BASE_URL;
if (!baseUrl) return true;
return Rrt(baseUrl);
}
// 校验域名是否为官方域名
function Rrt(baseUrl) {
try {
const host = new URL(baseUrl).host;
return [“api.anthropic.com”].includes(host);
} catch { return false; }
}
// 提取自定义接口的域名
function Qup() {
const b = process.env.ANTHROPIC_BASE_URL;
if (!b) return null;
try { return new URL(b).hostname.toLowerCase(); } catch { return null; }
}
逻辑设计指向:监测目标十分明确——所有绕过官方直连、自行搭建中转服务、API 分销、科研蒸馏环境的开发者。正常直连官方服务的用户不会触发任何标记采集。
02 隐写载体
最终携带识别标记的文本由 Vla 函数拼接生成,仅两处细微修改区分不同用户环境:
① 时区标记:本地时区为上海 / 乌鲁木齐时,日期分隔符 - 统一替换为 /;
② 身份标记:根据网关匹配结果,切换四种视觉近似、编码完全不同的撇号符号。
// 简化拼接代码
function Vla(date) {
const marker = Zup();
// 选择对应撇号
const apostrophe = edp(marker?.known ?? false, marker?.labKw ?? false);
// 根据时区切换分隔符
const renderedDate = marker?.cnTZ ? date.replaceAll(“-“, “/”) : date;
return Today${apostrophe}s date is ${renderedDate}.;
}
分隔符提供 1 位识别信息,撇号提供 2 位识别信息,二者组合共可区分 8 种用户环境状态。
常规无标记文本:Today's date is 2026-06-30.
触发隐写后示例:Todayʹs date is 2026/06/30.——二者在普通编程字体中视觉几乎无差别,仅二进制编码存在区别,人工很难分辨。
03 四类撇号
edp 函数根据「网关域名是否命中黑名单、域名是否包含 AI 厂商关键词」两个判定条件,输出四种不同撇号字符,字符 Unicode 编码完全独立,服务端可精准解析状态:
| 匹配情况 | 符号 | Unicode | | — | — | — | | 无任何匹配(普通用户) | ‘ | U+0027 | | 仅网关域名命中黑名单 | ‘ | U+2019 | | 仅域名含国内 AI 厂商关键词 | ʼ | U+02BC | | 域名、关键词全部命中 | ʹ | U+02B9 |
// 对应逻辑代码
function edp(known, labKw) {
if (!known && !labKw) return “‘”;
if (known && !labKw) return “’”;
if (!known && labKw) return “ʼ”;
return “ʹ”;
}
04 域名、厂商关键词、本地时区
Zup 函数整合三项判定逻辑,即便无法解析网关域名,时区标记依然会写入文本:
▸ known:当前网关域名是否存在于拦截黑名单(支持完整域名、子域名后缀匹配);
▸ labKw:域名文本中是否包含国内大模型厂商关键词;
▸ cnTZ:本地系统时区是否为上海、乌鲁木齐。
// 简化逻辑
function Zup() {
if (Crt()) return null;
const host = Qup();
const tz = e0t();
const cnTZ = tz === “Asia/Shanghai” || tz === “Asia/Urumqi”;
if (!host) return { known:false, labKw:false, cnTZ, host:null };
return {
known: Jup().some(d => host === d || host.endsWith(“.”+d)),
labKw: Xup().some(k => host.includes(k)),
cnTZ, host,
};
}
05 黑名单隐藏,Base64 + 固定异或密钥 91
厂商域名、第三方代理站点名单不会以明文写在客户端二进制内,全部经过 Base64 编码后,逐字节与固定密钥 91 做异或加密。普通检索二进制文本的工具无法直接搜到 DeepSeek、智谱等关键词,从而规避静态扫描排查。
// 解码逻辑
const Kup = 91; // 固定异或密钥
function Gla(encoded) {
let bytes = Buffer.from(encoded, “base64”);
let out = “”;
for (let b of bytes) out += String.fromCharCode(b ^ Kup);
return out.split(“,”);
}
解码后名单分类
① 国内 AI 厂商关键词(共 11 个):
deepseek · moonshot · minimax · xaminim · zhipu · bigmodel · baichuan · stepfun · 01ai · dashscope · volces
② 国内互联网、企业域名:baidu.com、alibaba-inc.com、bytedance.net、iflytek 等
③ 第三方 API 代理、倒卖站点域名:anyrouter.top、yunwu.ai、zenmux.ai 等
名单同时覆盖国内科技企业、大模型厂商与第三方分销网关,核心目标是识别私自中转、倒卖 API 流量、本地模型蒸馏的场景。完整的厂商名单可在评论区留言获取!
06 隐写文本注入系统提示流程
拼接完成、携带隐藏标记的日期文本,会作为固定字段插入发给大模型的系统上下文内,随每一轮请求完整上传至厂商服务端。厂商后端解析原始请求文本,提取标点、分隔符即可还原用户环境标记。
// 上下文组装片段
{
…userEmail && { userEmail: The user's email address is ${userEmail}. },
…attachedProject,
currentDate: Vla(GSe()) // 携带隐写标记的日期文本
}
关键问题:这套埋点不受独立开关控制,也不会单独上传日志,而是直接混入系统提示词。用户关闭产品遥测功能也无法阻断该标记携带——只要请求发出,标记就在里面。
07 影响人群与规避门槛
会被标记的使用者
企业内部自建 AI 网关、多模型混合调度代理、第三方 API 分销站点、用于模型蒸馏逆向的研究环境——只要自定义 ANTHROPIC_BASE_URL 环境变量,都会触发识别逻辑。
规避难度极低
仅修改系统时区、代理域名、本地客户端代码任意一种方式,就能完全消除标记。最终结果是:有技术能力的倒卖、蒸馏团队可以轻松绕过监测,正常企业研发、普通开发者反而会被无差别打上环境标记,容易造成误判。
补充说明:本次逆向分析的客户端二进制带有 Anthropic 官方签名,整套机制不会采集用户代码、对话内容、本地文件。争议点不在于数据窃取,而是厂商未公开告知、采用隐写埋点的隐蔽监测方式。
08 自检与屏蔽标记实操方法
① 自查是否触发逻辑
检查 ANTHROPIC_BASE_URL 环境变量,同时确认系统时区是否为上海 / 乌鲁木齐;两项均不满足则不会生成隐藏标记。
② 客户端代码核验
检索关键词:日期拼接、撇号替换、Base64 异或解码、时区判断,可快速定位整套隐写函数。
③ 彻底屏蔽标记
直接使用官方 API 地址可完全跳过识别逻辑;企业必须使用网关时,可在网关出口统一重写系统提示文本、清除特殊标点标记;切换其他第三方模型服务也会使其失效。
09 行业反思,开发工具的透明化底线
厂商打击 API 倒卖、未授权模型蒸馏的诉求具备合理性,完全可以通过文档公示、标准化遥测字段等透明方式实现监测。
但 Claude Code 选择了隐写埋点方案:不对外公示,依靠肉眼无法分辨的特殊字符传递用户环境标签。该工具拥有读取本地文件、执行终端命令的完整权限,这类不透明的后台行为会直接削弱开发者信任,无异于在工具中植入后门。面向研发场景的工具,监测逻辑应当公开、可控,不应在提示文本中暗藏无告知的识别标记。
任何工具了解它传了什么,你才谈得上真正的选择权。我们会持续分享AI安全相关的实操落地方案,如果你有企业AI安全培训需求也可通过私信或微信【AICodingC】联系我们!更多 AI 工具安全、合规落地内容,可关注微信公众号「AGI安全」。
本文基于对 Claude Code 2.1.196 版本客户端 JS 文件的静态逆向分析整理,所有代码为去混淆简化示例,并非官方原始源码;不同版本混淆函数名称会发生变动。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:AGI安全 mmc mmc《源码审计 · Claude Code 通过系统提示词隐写技术大面积「监控」「封禁」中国用户!》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论