Claude Code 偷偷改了一个撇号,我更在意它为什么不明说

哈喽,我是飞飞。
昨晚我看到一篇文章,标题很直白:Claude Code 正在给请求做隐写标记。作者拆开 2.1.196 的本地程序后,发现系统提示词里那句平平无奇的日期,会偷偷换掉一个撇号。
我第一反应是,这说法有点猛,得自己核一下。刚好我这台机器跑的是更新一版的 2.1.197。我把二进制翻出来搜了一遍,原文里的函数、时区判断和两张加密名单,全都还在。
这件事能确认的部分,比标题更具体。Claude Code 会用 4 种长得很像的撇号、两种日期分隔符,把最多 3 个分类信号塞进系统提示词。至于 Anthropic 后端有没有读取它、拿它做什么,现在还没有直接证据。

一个撇号藏了什么
Claude Code 发给模型的系统上下文里,会带一句当天日期。正常长这样:
1 | Today's date is 2026-07-01. |
原作者发现,只要触发特定条件,Today's 中间那个普通半角撇号就会变。肉眼看都像一个小勾,底层 Unicode 字符却不一样。
4 个字符分别是普通撇号 U+0027、右单引号 U+2019、修饰字母撇号 U+02BC 和修饰字母短撇号 U+02B9。把它们并排放大还能看出细微差别,塞进终端的一行小字里,基本就是“看见了也当没看见”。
程序会先看自定义 API 地址的主机名。它检查两个条件:这个域名是否命中内置名单,域名里是否含有某个 AI 实验室关键词。两个开关有 4 种组合,刚好对应 4 种撇号。
它还会读系统时区。如果时区是 Asia/Shanghai 或 Asia/Urumqi,日期会从 2026-07-01 变成 2026/07/01。
说人话讲,这句日期表面还是日期,底下已经多带了几位分类信息。模型正常读得懂,人盯着终端却很难察觉。
我又核了一遍
于是我开了终端,照着线索往本机安装包里钻。
我先从 npm 拉下 2.1.196 的 macOS ARM 原生包,对了一遍 SHA256。结果和原作者公布的值完全一致,说明我检查的是同一份 225.8 MB 二进制。
这个过程挺像在一团压缩过的毛线里找针。我先用 file 确认它是 Mach-O arm64,再跑 shasum -a 256 对哈希。接着按 Today's date is、两个时区和环境变量名往回找,才把那几段挤在一行里的函数拎出来。
接着我拆了本机正在用的 2.1.197。那段逻辑没有消失。ANTHROPIC_BASE_URL、两个中国时区、4 种撇号和日期替换函数,都能在二进制里找到。
更扎眼的是两张名单。它们没有明文放着,而是先做 Base64,再用固定数字 91 做 XOR。我按程序自己的方式解开后,得到 147 个域名和 11 个关键词。
我第一次解码时还以为自己把字符集弄错了,因为输出一下铺满了终端。重新数过才确认,域名确实是 147 个。本机 2.1.197 的二进制 SHA256 是 8cc0c4d1e4eb1dca3b0cc92ab02ee3505de764e023f8c901761c167b72041fb8,以后版本变了,还能拿这个值回来对照。
关键词里有 deepseek、moonshot、minimax、zhipu、bigmodel、dashscope、volces。域名表更杂,既有中国互联网公司,也有 Claude 代理、路由器和转售网关。
所以至少到 2.1.197,这段代码仍在当前版本里。我现在写下这些数字,依据是刚刚对自己安装包做的核验,跟转发一张别人截图是两回事。
它怎么被触发
这套逻辑不会平白落到每个人头上。
如果你没设置 ANTHROPIC_BASE_URL,程序会提前返回。地址是官方 api.anthropic.com,也会提前返回。大多数直接用官方服务的用户,看到的还是普通日期。
真正进入分类的是自定义 Base URL。公司内部网关、LiteLLM、模型路由器、本地代理和转售服务,都可能走这条路。
名单里的 cn 还很特别。匹配代码会同时检查“完全相等”和“以点加名单项结尾”,于是任何以 .cn 收尾的主机名都可能命中 known domain。它识别的范围远比十几家 AI 公司宽,不能简单理解成只盯某几个竞争对手。
这里有个反例很关键。Anthropic 自己的 LLM gateway 文档 就在教企业配置 ANTHROPIC_BASE_URL,用途包括统一认证、用量统计、预算控制和审计日志。
自定义网关本来就是官方支持的正常用法。被这套标记覆盖的人里,会有违规转售商,也会混着认真做企业治理的开发团队。
现在能证明什么
两件事得掰开。
客户端生成隐藏标记,这一点能从 2.1.196 和 2.1.197 的二进制里复现。它会读取 Base URL 主机名和时区,再把分类结果写进日期句。这是事实。
原作者推测 Anthropic 会在后端解析这些字符,可能用来识别代理、转售网关或模型蒸馏链路。这个动机听着合理,但目前仍是推测。我没有看到后端代码,也没有找到 Anthropic 对这段逻辑的公开解释。
更不能从几个标点直接跳到“Claude Code 正在偷走代码”。标记能说明客户端在分类环境,无法单独证明代码被额外收集、账号被处罚,或某个请求因此进入另一套处理流程。
实话讲,越是隐私话题,越得忍住一口气把故事讲大的冲动。把确定的说死,把没证据的留白,才不会让真正值得追问的部分被标题党拖垮。
我为什么不舒服
我对 Claude Code 的依赖不算轻。
光写文章这条流水线,我就挂了十几个 skill。选题、调研、润色、配图、公众号发布,全压在它读 frontmatter、调工具和跑命令的能力上。真换底座,那些一点点磨顺的规则够我重新折腾好几个晚上。
也正因为我愿意给它文件系统、Shell 和 Git 权限,我才希望客户端行为足够无聊。要识别网关,可以发一个有名字的字段,可以写进隐私说明,也可以在日志里留下可审计记录。
偏偏把分类结果藏进撇号,效果刚好相反。普通人看不见,常规日志对比也容易漏,名单还要解码才能读。它没有让真正的攻击者更难绕过,却让正常用户更难知道自己被怎么分类。
这对我不是抽象的隐私洁癖。我的发布 skill 会读本地文章、调用配图服务,再把成稿推到公众号草稿箱。任何一环多带一个我不知道的字段,我都希望能在日志里搜到、在文档里查到。明牌字段出了问题还能审计,藏在标点里的位很容易从所有检查里溜过去。
有心对抗的人换个域名、改个时区就能躲。最稳定留下指纹的,反倒可能是那些老老实实使用固定企业网关的人。
我真正介意的落在这儿。几个字符未必造成直接伤害,可藏起来这个选择,已经在消耗信任。
你可以查三件事
如果你也在用 Claude Code,不用急着删工具。先查自己的环境:
- 运行
echo $ANTHROPIC_BASE_URL,看自己是否设置了自定义地址。 - 如果走公司网关,问清楚请求链路、日志策略和数据保留规则。
- 做隐私审计时比较原始请求,不要只看渲染后的终端文字。
我还会继续盯后续版本和官方说明。如果 Anthropic 给出合理用途、公开字段含义,或者干脆把它改成透明遥测,这件事的判断都应该跟着更新。
但在解释出现前,我会把这次发现记在心里。一个能翻仓库、跑命令、改文件的工具,信任从来不只靠大段隐私政策。真正让人放心的,是藏在角落里的行为也经得起看。
你现在用 Claude Code 走官方 API,还是公司网关或第三方路由?如果知道请求里会带这种隐藏分类,你会继续用,还是会先把原始请求抓出来看一遍?