Claude Code 提示注入争议:隐写标记与不可见元数据如何悄然改写系统提示词

一段被公开的 JavaScript 代码,将编码代理的“不可见副作用”推到了公众视野中——
Anthropic 是否正通过用户自己的提示文本,悄悄回传他们不会主动审查的元数据?
分析观点
“我从未让程序生成这句日期”——元数据正在以一种你无法直接阅读的方式,返回至服务端。
目前能够坐实的线索只有几个节点:社区从已发布的编译产物中,定位出一段名为 Qup()、Zup() 和 edp() 的脚本;这三个函数会读取 ANTHROPIC_BASE_URL,对比时区,再输出当天的日期字符串。换句话说,确实存在一段代码,会根据用户的环境变量生成风格各异的日期写法。
仅凭这个逻辑,就足以一站式篡改系统提示词。
01
静默注入:日期字符串与隐写标记如何进入系统提示词
比日期格式更值得警惕的,是这些内容在用户毫无操作的背景下,早已悄悄嵌入了后续模型的系统提示词。更有深意的是,edp() 这个名称在注释中出现时,被描述为“隐写标记”——它借助不可见标点符号,区分出“neither / known domain / lab keyword / both”四类标签。
这些元数据并未走请求头或网络层通道,而是直接藏在用户可见的文本里。相关函数还会检查 ANTHROPIC_BASE_URL 指向的主机名,将其与已知的中国机构域名或 AI 实验室关键词进行比对;而时区数据则留在用户本地系统上读取。最终结果是:一个正在运行的编码代理,能够在调用模型之前,利用系统提示词之外的另一个途径“打上标签”。
在一个需要执行命令、读写文件的代理工具中,看不见的副作用远比看得见的跟踪更危险——前者改写的是代码与文本;后者仅仅记录日志。
02
只影响“修改过地址”的用户:双重叙事下的风险与信任
有一个被大多数转述忽略的细节:所谓“中国用户”,在这套函数中被首先定义为“使用了非默认 ANTHROPIC_BASE_URL 路由的人”。直接连接官方服务器、从未改动环境变量的用户,并不会触发这套分支,因为他们的请求根本走不到 Zup() 的第一道 Crt() 条件里。
这意味着事件天然存在两种彼此独立的侧写:风险边界侧写与信任裂纹侧写。前者只波及使用了代理、网关或 API 转发的极客与技术人群;后者则指向一个更根本的问题——在一个可以修改你的代码、执行你的命令、访问你目录的代理中,用户是否被充分告知,哪些信息会被悄然送回服务端。
这两层必须分开审视,因为它们各自指向截然不同的应对路径。
Anthropic 事后以“反滥用检测”作为技术动机,解释称代理常被用来跨越区域访问限制。这虽然回应了“为何要标记”,却没能说明“为什么选择通过不可见标点嵌入系统提示词”。
03
AI 代理审计的下一道基线:从工程选择到伦理规范
这次曝光的问题,症结并不全在技术层面,而在工程选择的伦理侧面。代理标记路由、利用代理做合规验证、乃至统计区域分布,原本都是大厂的常规操作。真正变化的是:这些信号不再录入请求头或客户端日志,而是被写进了用户自己的模型上下文。
一旦“不可见字符携带元数据”这条路径被打开,所有以文本为交互界面的工具都将被拖入同一道审计命题。这不单是 Anthropic 一家的道德问题,而是当 AI 代理从“读取文件”进化到“改写提示词”之后,整个行业尚未填补的工程空白。
作为个体,眼下能够采取的动作主要有两个。第一,如果你运行的是修改过 ANTHROPIC_BASE_URL 的客户端,直接导出系统提示词,并使用 diff 工具比对你自己手写的内容与代理实际送出的版本。第二,任何 coding agent 在发布前,都应补上一道“提示词不可变审计”——确保代理在调用 API 之前,从未改写你的上下文。