‹ 返回笔记 · Back to notes

现场手记

Claude Code 提示词里多了标记

Claude Code Was Marking the Prompt

一张“Claude Code 内置隐藏后门”的图传到我这里。我没有先信,也没有先骂。我把中文传播页、GitHub issue、公开技术拆解、官方 changelog、npm 包体和我自己机器上的 Claude Code 都查了一遍。结论是:机制存在,本地包体能复现;但它不等于已经证明了本地后门。

Claude Codeprompt marker根因取证隐私AI安全public-safe

AI 工具安全 · 本地取证

今天有人把一张 FreeBuf 的图发给我,说 Claude Code 里藏了“专门检测中国用户”的后门。我没先信,也没先骂;我把网上的说法、官方更新日志、npm 包体和我自己机器上的 Claude Code 都查了一遍。

结论先放前面:那段机制存在。它会在特定条件下读取 ANTHROPIC_BASE_URL,看系统时区是不是 Asia/ShanghaiAsia/Urumqi,再把域名和一个混淆过的域名列表做匹配,最后改掉系统提示词里一句很普通的日期。但我不会把这件事直接写成“已经证明有本地后门”。我现在能确认的是:这是一个没有明示的提示词标记机制,或者说环境指纹。它很糟糕,很不透明,但它不是同一件事:远程代码执行、偷文件、明文上传本地目录,这些我没有证据。

YunLab local verification screenshot showing Claude Code package SHA256, decoded domain count, timezone, and ANTHROPIC_BASE_URL status.
我本地拉取 2.1.197 macOS arm64 包体做的验证:SHA256、147 个解码域名、当前时区、当前 shell 是否设置代理变量,都在一张图里。

先看这张图背后的传播

这件事不是一张孤图。中文传播页确实存在,有站点转载了 FreeBuf 的《传 Claude Code 内置隐藏后门,专门检测中国用户》。页面里把核心说法写得很重:从 2.1.91 起存在检测机制,通过代理、时区和域名判断,把环境信息藏进提示词字符里。问题也在这里:它把“机制存在”和“后门定性”揉成了一句话。标题传播很快,但真正需要看的,是这套机制到底怎么触发、传了什么、有没有本地执行或文件外泄证据。

Screenshot of a FreeBuf mirrored Chinese page about the Claude Code hidden backdoor claim.
中文传播页截图:它证明这条内容确实在传播,但不自动证明标题里的每个定性都成立。

网上是怎么确认的

我主要看了三条线。第一条是 Reddit 原帖和它派生出来的 GitHub issue。GitHub issue 标题很直接,叫 “Anthropic embedded spyware in Claude Code”,现在已经关闭。它的有用之处不是情绪,而是把争议点压到一个具体问题上:这段代码不只是格式化日期,而是在检查代理、时区、代理 URL 特征,再把结果编码进系统提示词差异里。

Screenshot of GitHub issue 72518 in anthropics/claude-code.
GitHub issue 把争议压到一个可检查的问题上:这到底是不是隐蔽环境指纹。

第二条是 thereallo.dev 的公开技术拆解:《Claude Code Is Steganographically Marking Requests》。这篇比安全媒体标题有用得多,因为它把函数逻辑、触发条件和 XOR-91 解码列表都摊开了。第三条是官方 changelog。官方在 2.1.196 里明写了一条:当 ANTHROPIC_BASE_URL 指向非 Anthropic host 时,Remote Control 会被禁用。也就是说,官方确实在这个版本公开动了“自定义 base URL / 代理”相关行为;但我在 2.1.91 和 2.1.196 的公开 changelog 里,没有看到“提示词标记 / 环境指纹 / Unicode 撇号编码”这类说明。

Screenshot of thereallo.dev technical post about Claude Code prompt steganography.
技术拆解页截图:真正有用的是函数、条件和编码方式,不是“后门”这两个字。
Screenshot of official Claude Code changelog around version 2.1.196.
官方 changelog 里有代理相关变更,但没有把这套提示词标记机制明说出来。

我自己拆出来的证据

我没有只看别人贴的代码。我在本机重新拉了 2.1.197 的 macOS arm64 包,查包体、算 hash、定位关键字符串,再把混淆域名列表解出来。这个步骤的意义是:把“网上有人说”变成“我这台机器上能复现”。

  • 包体证据:2.1.197 macOS arm64 包里的 claude 可执行文件 SHA256 是 8cc0c4d1e4eb1dca3b0cc92ab02ee3505de764e023f8c901761c167b72041fb8。我不是拿截图里的代码当证据,而是拿这个包体重新拆。
  • 字符串证据:包体里能定位到 ANTHROPIC_BASE_URLAsia/ShanghaiAsia/UrumqiToday${n}s date is。这四个点连起来,基本就是“读代理地址、读时区、改日期提示词”的骨架。
  • 域名证据:混淆列表能用 XOR-91 解出 147 个条目,样本包括 cnbaidu.comalibaba-inc.combytedance.netmoonshot.aialiyuncs.comopenclaude.me。这不是泛泛地“检测中国”,而是有一张具体名单。
  • 本机证据:我 PATH 里实际跑的是 claude 2.1.150;当前系统时区是 Asia/Shanghai;当前 shell 没有设置 ANTHROPIC_BASE_URL,所以当前 shell 下不会触发这条标记路径。也就是说,这台机器有中国时区,但当前环境没有走到那个分支。

按包体里的判断路径还原,它大概分四步:先看 ANTHROPIC_BASE_URL 有没有值;有值才取 host;再判断时区是不是 Asia/ShanghaiAsia/Urumqi,并把 host 和解码域名表做匹配;最后才决定日期用横杠还是斜杠、Today's 里的撇号用哪一个 Unicode 字符。也就是说,标记不是凭空来的,它靠的是这几项环境分类。

这里有个边界要讲清楚:时区是中国时区,不等于一定触发。没有 ANTHROPIC_BASE_URL,或者用的是官方 Anthropic endpoint,这条路径会提前返回。真正敏感的是“开了自定义 base URL,并且 host 落进它关心的域名 / 关键词范围”。这也是为什么我不把它写成“所有中国用户都会被检测”。

它具体“传”的是什么

它不是另起一个网络请求把文件打出去。它改的是已经要送进模型上下文的系统提示词。普通情况下,提示词里是一句:

Today's date is 2026-07-01.

在特定条件下,它会做两类很小的变化。

  • 日期分隔符:中国时区会让 2026-07-01 变成 2026/07/01
  • 撇号字符:Today's 里的撇号,会按域名匹配情况替换成不同 Unicode 字符,比如 \u2019\u02BC\u02B9

肉眼看,句子还是那句句子。但后台如果知道这套规则,就能从日期斜杠和撇号字符里读出分类信号:是不是中国时区,host 是不是列表里的域名,host 里是不是有 AI 实验室关键词。

为什么这仍然是个严重问题

我能理解厂商想管 API 倒卖、未授权中转、模型蒸馏。自定义 ANTHROPIC_BASE_URL 本来就是一个高价值信号。真正让我不舒服的是实现方式:Claude Code 不是一个普通网页,它是一个开发工具,平时有读文件、改代码、跑 shell、碰 git、接浏览器的能力。这样的工具,客户端应该尽量无聊、可解释、可审计。你要检测自定义网关,就明说,放进文档,放进 release notes,做成显式 telemetry 字段,或者给一个可关闭策略。

把分类信息藏进系统提示词的标点里,是另一回事。它让用户很难发现,也让每一次“我们尊重开发者隐私”的表态变得更难相信。更讽刺的是,这东西并不难绕:换 host、换时区、包一层进程、patch 二进制,都能绕过去。真正被标出来的,往往不是最懂绕的人,而是那些正常使用自定义网关、公司内网路由、模型 router 的开发者。

我不会怎么写

我不会写“Claude Code 已经证明会偷你本地文件”,我没看到这个证据。我也不会写“所有中国用户都会被检测”,因为至少从这条路径看,光有 Asia/Shanghai 不够,还要看 ANTHROPIC_BASE_URL 和 host。我更愿意把它写成:Claude Code 的客户端里存在一套未公开的提示词隐写标记机制,用自定义 base URL、时区、域名列表和 Unicode 字符,把环境分类塞进系统提示词。这个行为本身已经足够值得质疑。

我自己的处理

短期我会这么做:不用不必要的自定义 ANTHROPIC_BASE_URL;要用代理或 router,就把客户端版本、包体 hash 和触发条件留档;把 Claude Code 当成信任边界的一部分,而不是只盯模型回答。这不是让我不用 Claude Code。工具我还会用。只是信任不再靠感觉,也不靠厂商一句话。

这次真正让我记住的,不是“后门”这两个字。

是一个有 shell 权限的开发工具,悄悄把环境判断藏进了一句看起来无害的日期里。这样的设计,不应该靠别人逆向才第一次被看见。

把这篇记录接到下一步

读完以后,可以继续追问这篇文章,也可以回到策展目录,或通过标签追同一条线索。

追问这篇 回到目录 浏览标签