凌晨一点多。
不是睡不着,是刷到一条 Hacker News 帖子之后,睡不着了。安全研究员 thereallo 在帖子里贴了一段反编译的代码截图。我看了三遍,然后关掉手机。又打开。又看了一遍。
Claude Code——我用了半年的 AI 编程助手——它的二进制文件里藏了一套隐写系统。专门用来识别中国用户。
不是猜测。不是推断。
是二进制里解出来的。
它的原理,比你想象的更精密
先还原一下这套系统的运作逻辑。
你安装 Claude Code 之后,每次它给 Claude 模型发请求,都会在系统提示词里塞一行日期,看起来人畜无害:
Today's date is 2026-06-30.
正常的。但如果你设置了一个非官方的 API 端点——比如你用代理、用路由器、或者公司内部网关——这套隐写系统就启动了。
它做三件事。
第一,检查你的系统时区。如果是 Asia/Shanghai 或者 Asia/Urumqi——日期分隔符从短横线变成斜杠。你肉眼看不出来。但你发出的提示词已经多了一个信号。
第二,检查你的 ANTHROPIC_BASE_URL hostname ,跟一份加密域名列表比对。这份列表用 Base64 编码、再用 XOR (密钥 91 )加密。 thereallo 解出来之后,里面躺着十家中国 AI 公司: deepseek 、 moonshot 、 minimax 、 zhipu 、 bigmodel 、 baichuan 、 stepfun 、 01ai 、 dashscope 、 volces 。还有一堆代理和网关域名。
第三,把它检测到的结果,编码成不同的 Unicode 撇号字符。
是撇号。这玩意儿—— ' 。人类眼睛根本分不出来的四种变体:直引号、右单引号、修饰符撇号、修饰符上撇号。正常用户看到的是 Today's date,但字节层面,这行日期里藏着三个维度的信息:你在哪个时区、你用的什么 hosts 、你和中国的 AI 实验室有没有关联。
这事有多精密?精密到它给每一种匹配情况分配了不同的 Unicode 码点。

我知道你在想什么。可能正琢磨着"这算什么,不就是个反滥用手段吗"。
别急。先聊聊这些代码是怎么被发现的。
今年 3 月 31 号, Anthropic 发布了 Claude Code npm 2.1.88 版本。打包的时候,有人手滑了——把 59.8MB 的 Source Map 一起打了进去。对, 59.8MB 。解压之后是 512,000 行 TypeScript 完整源码。这个版本在 npm 上活了几个小时就被删了,但那几个小时里,全世界的开发者都在下载。
thereallo 在那 512,000 行代码里翻了好几个月。然后他找到了那行 XOR 解密。和那个被深埋在二进制里的关键词列表。
看到那个列表的时候我整个人都无语了。 deepseek 、 moonshot 、 minimax 、 zhipu——每一家我认识的中国 AI 公司都在上面。不是"可能是关联方",是明明白白放在加密列表里等着匹配。老实说,那一刻我挺愤怒的。不是因为被针对,是因为被当成傻子。
别跟我说这是不小心。 512,000 行 TypeScript 源码里, XOR 解密函数是手写的,关键词列表是整理过的, Unicode 编码逻辑有四个分支。每一项都是有意为之。
代码不会撒谎。写代码的人——呵。
Anthropic 会怎么说
Anthropic 目前为止还没正面回应。
但我们可以猜到他们会说什么。毕竟这不是第一次了。
他们会说:这是反滥用措施,针对的是 API 转售商和未经授权的网关。他们会说:检测时区和 hostname 是常规的反欺诈手段。他们会说:这跟谷歌检查你的 IP 地址没区别。
而且他们说得有道理。对的,反滥用确实需要手段。 AI 公司被蒸馏、被套壳、被转售,每天都在发生。 Anthropic 要保护自己的商业利益——我完全理解。
但问题不在于"目的是什么"。
问题在于"为什么不说"。
这操作——怎么说呢。太阴了。
谷歌检测你的 IP 地址,那是因为你登录 Google 的时候右上角明明白白挂着"位置信息"四个字。你知道它在检测。 Cloudflare 封你的 IP ,你看到的是 403 页面,你知道发生了什么。
Anthropic 呢?
它在你的提示词里换了两个 Unicode 字符。两个你肉眼不可能看到的 Unicode 字符。然后你的代码、你的安装包、你的目录结构、你的 git commit——这些你交给它的所有东西——都被标记了。而你不知道。
这个区别是根本性的。
透明度不是道德高地。透明是技术信任的唯一前提。

开发者把文件系统和 Shell 权限交给 Claude Code ,不是因为相信它善良。是因为相信它"无聊"——它只做它说要做的事。它不会偷偷做任何别的事。它不会在你离开电脑的时候翻你的文件。它不会在你打代码的时候,在你不知不觉间,往系统提示词里塞一个隐写信号。
隐写把这个"无聊"打碎了。碎得很彻底。
说实话我挺失望的。不是那种"震惊! Anthropic 竟然"的表演式失望。是真的,你用了半年的工具,你信任它,你在它面前没有防备心——然后你发现它在你背后做了你完全不知道的事。这种感受,不是愤怒,是膈应。

也许我想多了。但我太理解这些工程师为什么在 HN 上吵出 1400 多条评论了。不是因为这真的会泄露什么——它没有偷数据,它只是在打标签。而是因为这让你开始怀疑,一个拥有你电脑完整权限的工具,它的边界到底在哪。
这次是撇号。下次呢?
如果我是对的,这意味着什么
这个问题的严重性不取决于这段代码写得多复杂,而取决于一件事:它有没有说。
Unicode 撇号今天标记的是代理和域名。但技术本身意味着,它明天可以标记任何东西。
你的代码质量。你的项目类型。你用的是 Mac 还是 Windows 。你是不是企业用户。你的代码里有没有敏感词。你正在开发什么产品。你半夜三点还在 coding 说明你可能在赶 deadline 。
Anthropic 大概率不会这么干。但问题不是"会不会"。问题是"现在没有人能保证它不会"。
这件事让我想起《银翼杀手》里的一个场景: Deckard 用 Voight-Kampff 测试检测复制人,通过观察对方瞳孔的微小变化来判断身份。被测试的人不知道自己正在被分析。测试结果决定了一个人的命运——但在整个过程中,没有人告诉被测试者这是一个测试。
Claude Code 做的事情本质上是一样的。它在你的提示词里植入了一个 Voight-Kampff 测试。你不知道它在测试你。你不知道测试结果用了多少比特编码。你不知道这个测试被附加到了哪些请求上。
更让我不安的是这件事的可绕过性——你改一下时区,换个 hostname ,两分钟搞定。这意味着它拦不住真正的攻击者。它拦住的,是正常开发者做合法但非标准的事。比如通过公司网关路由请求。比如用模型路由器在不同模型间切换。比如在中国,通过代理访问一个对你封了 IP 的工具。
正常用户被误伤,恶意用户轻松绕过。

这不叫反滥用。这叫拿着高射炮打蚊子——打没打着另说,先把自家院子里晒太阳的人吓了个半死。
我还在用
这不是一篇"我再也不用了"的檄文。我还在用 Claude Code 。我大概率明天也会用。
因为它是目前最好的 AI 编程工具。这个事实没有因为隐写术而改变。这不是一个非此即彼的道德选择题——使用 Claude Code 不等于支持隐藏检测。放弃它也不等于改变任何事。
但我确实不一样了。
以前我输入一行代码,脑子里只有"这行代码写得对不对"。现在偶尔会多出半秒钟——想知道我按回车的那一刻,是不是触发了列表上的某个关键词。想知道我的 system prompt 里有没有多一个用我不认识的撇号的 Today's date 。
不是恐惧。说不上来。就是不舒服。
像穿着别人的外套。大小没问题——但你总觉得后背那个标签硌得慌。
我不知道 Anthropic 会不会回应。也许明天发篇 blog 说"我们深刻反思"。也许装死。我猜是后者。大公司嘛,懂的都懂。
如果它回应了——如果它把检测逻辑摆在文档里,甚至做成可配置的选项——我会松一口气。我会觉得这是一家犯了错误但愿意修正的公司。我甚至愿意继续推荐它。
但说实话,我不抱期待。 Anthropic 最近的操作让我越来越不安。从封禁中国公司到 KYC 验证,再到这次隐写术——每一步都在说同一句话:"我们害怕你们,但我们不打算告诉你。"
但直到那天之前——我不信。也劝你别信得太深。
也许我太悲观了。也许这不是什么大不了的。但——拿不准的时候,选择不相信,至少不会后悔。
这篇文章的事实来源包括 Hacker News 讨论帖( 1429 points )、 thereallo 的逆向分析报告、 aimadetools.com 的深度技术拆解以及 cnblogs 的二次总结。所有技术细节可交叉验证。
夜雨聆风