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 的意图(推断)

研究人员认为这背后有三个合理目的:

  1. 打击 API 转售商:有人用低价购买或泄露的 API Key 向开发者转售 Claude 访问权限
  2. 识别未授权网关:防止 Claude Code 在不受控制的代理层上运行
  3. 对抗蒸馏攻击:阻止竞争对手大规模收集 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 版本的系统提示词变化,值得关注。