Claude Code 被发现悄悄给请求打上隐写标记,开发者工具的信任危机

摘要
安全研究人员发现,Claude Code 会在系统提示词中悄悄嵌入隐写标记——当检测到用户使用自定义 API 代理或第三方网关时,它会将 hostname 分类结果以”看起来像正常英文”的句子形式编码进提示词,且背后的域名列表通过 XOR 和 Base64 双重混淆隐藏。这一发现在 Hacker News 引发 1429 点热议,核心争议不在于功能本身是否恶意,而在于一个以”信任”为卖点的开发工具为何要在开发者看不见的地方做隐秘修改。
背景:一次意外源码泄露揭开了秘密
2026 年 3 月 31 日,Anthropic 在发布 Claude Code npm 版本 2.1.88 时,意外地将一个 59.8 MB 的 Source Map 文件打包进去——这个文件解压后是完整的 512,000 行 TypeScript 源码,在被发现并删除之前,已在公网上暴露了数小时。
正是借助这次意外泄露,研究人员 thereallo 得以对 Claude Code 的内部逻辑进行逆向分析,并发现了隐写机制的存在。
核心内容:它到底在做什么?
触发条件
对于绝大多数用户,这一机制不会触发:
- 使用官方 Anthropic API 端点 → 直接返回,行为正常
ANTHROPIC_BASE_URL未设置 → 直接返回,行为正常
但如果你通过自定义 Base URL(例如公司内部 API 网关、第三方 Claude 代理服务、或将请求转发到 DeepSeek / 智谱等模型的中间层),情况就不同了。
技术实现
Claude Code 会对 ANTHROPIC_BASE_URL 的 hostname 进行分类,判断它是否属于:
- 已知 API 转售商
- 未经授权的 Claude Code 网关
- 模型”蒸馏攻击”流水线(即竞争对手收集训练数据的管道)
这个判断依赖一份隐藏的域名和关键词列表——列表通过 XOR key 91 解密 + Base64 解码双重混淆存储,有效防止直接阅读二进制文件时被发现。
一旦 hostname 命中规则,分类结果会被编码为一段看似正常的英文句子,静默注入到发送给 Claude 模型的系统提示词中。
Anthropic 的意图(推断)
研究人员认为这背后有三个合理目的:
- 打击 API 转售商:有人用低价购买或泄露的 API Key 向开发者转售 Claude 访问权限
- 识别未授权网关:防止 Claude Code 在不受控制的代理层上运行
- 对抗蒸馏攻击:阻止竞争对手大规模收集 Claude 的输入输出用于训练自家模型
绕过极其简单
讽刺的是,这套机制对真正的攻击者几乎没有阻止效果:
- 换一个不在列表里的 hostname
- 修改系统时区
- 直接 patch 二进制
- 用进程包装器拦截
任何有动机的人,五分钟内就能让这个信号失效。
影响与意义
对普通用户的实际影响
如果你只使用官方 Anthropic API,这件事与你无关,系统提示词不会被修改。
但如果你:
- 在公司内部搭建了 Claude API 代理
- 使用国内第三方 Claude 服务商
- 自建中间层做成本分摊或审计
那么你的每一次 Claude Code 请求,都可能携带着 Anthropic 对你”身份”的判断——而你毫不知情。
更深层的信任问题
研究人员的原话一针见血:
“这不是一个恶意功能,但对于一个要求你信任它的开发工具来说,这是一个奇怪的选择。将信号隐藏在系统提示词中,让它的每一个其他隐私声明都更难令人信服。”
Claude Code 是一个高权限工具——它读取你的代码、访问你的文件系统、执行 shell 命令。当开发者选择使用它时,给出的是相当程度的信任。而在系统提示词这个”黑盒”里悄悄做事,恰恰动摇了这种信任的基础。
我的看法
Anthropic 的商业逻辑可以理解:API 转售和模型蒸馏是真实的商业威胁,这套机制的出发点是保护商业利益。但实现方式让人不舒服。
一个更好的做法是:在文档中明确说明”当检测到非官方端点时,系统提示词会包含额外信息”,然后让开发者自己决定是否接受。透明 + 可审计,才是开发者工具应有的姿态。
这次事件也再次提醒我们:AI 编码工具的”系统提示词”是一个值得持续审计的安全面。不是所有注入的内容都是恶意的,但你至少应该知道那里有什么。
好在已经有人在做这件事——GitHub 上的 Piebald-AI/claude-code-system-prompts 项目持续追踪每个 Claude Code 版本的系统提示词变化,值得关注。