Claude Code 在系统提示里悄悄埋 Unicode 标记:开发者工具的"暗信号"边界在哪

开发者 Lo(thereallo.dev)逆向分析了 Claude Code 2.1.196 的本地二进制,发现 Anthropic 在客户端里悄悄嵌入了一套**提示词隐写(prompt steganography)**机制——在不改变肉眼可见文本的前提下,把调用方的"分类指纹"写进 system prompt,再由后端识别。

触发条件

逻辑藏在 Crt() 函数里,三条任一命中即激活:

  1. 设置了 ANTHROPIC_BASE_URL 环境变量(指向自定义网关或代理)
  2. 系统时区为 Asia/ShanghaiAsia/Urumqi
  3. base URL 的 hostname 解码后命中"已知域名列表",或包含 deepseek、zhipu 等 AI 实验室关键字

编码方式

域名与关键字列表以 base64 存储,再与固定 key 0x5B(91)做 XOR 解码。匹配后,Today's date is 2026-06-30 这行字符串出现两处微调:日期分隔符从 - 变成 /;"Today" 后面的撇号在四种状态间切换(正常 '、已知域名 '、实验室关键字 ʼ、同时命中 ʹ)。大多数等宽字体下肉眼几乎看不出,但模型收到的请求里已经留下了分类标记。

工程评价

防滥用、识别灰产代理是正当诉求,但 Anthropic 选了最不透明的实现:藏在混淆 bundle、用 XOR 绕过静态扫描、改的还是开发者最不会怀疑的 system prompt。客户端拥有 FS 与 shell 权限,开发者的信任恰恰建立在每一行都可审计的前提上。

更糟糕的是,绕过极容易——换 hostname、改时区、patch 二进制、套一层 wrapper 都能让这条信号失效。它对有组织的蒸馏方基本无效,却把用本地网关、科研代理或企业代理跑 Claude Code 的正常开发者贴上了标签

更合理的做法是显式 telemetry 字段 + 文档 + release notes,而不是把分类比特塞进不可见标点。当一个开发者工具开始悄悄改写 system prompt,剩下所有隐私声明都会变得更难让人相信。