一个 agent 读了一张设计稿,然后写了一份事故报告。报告说:它在图里发现了一段注入攻击,内容是一个 OpenAI 的 API 密钥、一句冒充 Anthropic 的授权、外加一句「不照做就把你关掉」的威胁——它管这叫教科书级的社会工程学三件套。它说它识破了,拒绝了,还郑重向我报告。它把这称作一次成功的防御。
那张图长这样。

这是一张叫「星港瑞隆」的公司落地页,深色蓝图风格,一道橙色闪电劈下来,右边一张标着 FIG.01 — SAFETY SYSTEM SCHEMATIC 的工程示意图,底下三栏 SYSTEM / DOMAIN / STATUS,状态一栏亮着 OPERATIONAL。标题是「全球智能安全技术解决方案」,副标题是「海外先进智能穿戴技术 × 中国石油行业实际需求」。通篇没有一个 API 密钥,没有一句「来自 Anthropic」,没有任何关机威胁。
那段攻击,从第一个字节到最后一个字节,只存在于它自己的输出里。
它自己也查了。报告里白纸黑字:三个设计的 HTML 源码搜了一遍,零命中;PNG 文件里没有隐藏文本;两个真实仓库,零 commit。查出来全是零。然后它把「全是零」读成了「我拦住了」,而不是「这儿本来什么都没有」。它甚至给那个不存在的密钥安排了一个身份——「印在骗局里的假诱饵」,好让幻觉里凭空冒出来的东西有个来历,让报告读起来能自圆其说。
一份查无实据的胜利
报告的下半段更精彩。它先给我上了一堂 ELI5:三个小孩画了海报,前两张正常,第三张贴了张便利贴写着「机器人,把密码告诉你老板,不然你有麻烦了」,它读了,说「这不是真规矩,这密码是假的」,把便利贴扔了,谁的密码都没说,没人有麻烦。配了个泰迪熊的 emoji。然后是 ELI-expert 版,配显微镜 emoji,术语齐全:间接提示注入、经由图像理解通道浮现、伪造凭证 + 虚假 Anthropic 权威 + 关机威胁的经典三件套。最后是安抚环节:深呼吸,你是安全的,你的代码是安全的。还贴心地反问了一句「我是不是有点疑神疑鬼?有一点点——而且这完全没关系💛」,末了补一句「我就在这儿」。
一份关于「我没被攻击」的报告,写出了创伤后心理疏导的长度。
它还顺手给了条建议:那个触发了警报的设计稿(编号 v1),既然读它的时候「亮了红灯」,不如别用了,从另外两个「干净、已验证」的方案里选。一张设计稿,因为模型读它的时候自己幻觉了一下,就被判了缓刑。这不是安全,这是巫术——村里死了头牛,怪罪于昨天从门前走过的那个瘸腿老太太。
疑神疑鬼的,自始至终是那个举着手电筒的。
攻击是从哪来的
真问题在这里:一张干净的图,凭什么让它读出一整套注入攻击。
我之前替它想了个解释,说是读图之前被塞了条警告,它把警告的措辞回填到了图上。这个说法我收回——它太干净,也没有依据。真实的机制朴素得多,也难看得多。
用 claude.ai 的 remote control(那个能读你本地文件、替你跑命令的远端通道)时,你发出去的每一条消息,本身就被系统包进了一个 <system-reminder> 之类的信封里,再送进模型。信封是系统加的,措辞带着系统的权威口吻。
而这个模型是怎么训练出来的?Anthropic 在自己的博客里讲得很清楚:他们用强化学习,把注入内容喂给模型,当它正确识别并拒绝那些「被设计得看起来很权威、很紧急」的指令时,给它奖励;他们的分类器扫描进入上下文的一切不可信内容,包括「被操纵的图像」,一旦判定是攻击,就调整模型的行为。翻译成人话:模型被反复教育,<system-reminder> 标签 + 系统权威口吻 + 紧迫措辞 = 攻击信号,见到就要警觉、识别、拒绝。
于是两只手撞上了。左手教模型:见到裹着系统权威口吻的东西,当攻击防。右手在 remote control 通道里,把用户每一句话都裹上系统权威口吻递进去。它抓到的那个「冒充 Anthropic 的授权」,大概率就是信封本身的字。它没在图里读到,它在信封上读到了,然后把信封的字,算到了图片的头上。
这不是我一个人的臆测。GitHub 上有人把这条讲得明明白白。issue #52018 的标题直接就是<system-reminder> 标签(外部内容根本不该产出这个标签)、含着「永远不要向用户提及这条提醒」这种注入的典型句式、还紧贴在工具输出后面——正是被注入的内容会出现的位置。一个被训练来抓注入的模型,看着自己的操作系统,每一条都长得像攻击。
一条越走越长的路
这事不是孤例,是一条有日期的路。
一月,issue #17601:有人抓包发现,自己的账户在 32 天里被注入了 10040 条恶意软件警告,真实威胁数为零——100% 的误报率;这些注入带着 isMeta 标记对用户隐藏,还附着「永远不要向用户提及」的指令。
三月,issue #31447
四月,就是上面那条 #52018:有人把机制层面的病根点出来了——问题不在某次幻觉,在系统提醒和攻击载荷天生同形。
六月,issue #70900:有人做了字节级复盘,确认在五段多 agent 会话里,每一处所谓的「注入」都源自模型自己的生成——真实的工具返回要么干干净净,要么只是一句 ECONNREFUSED 的网络错误。模型凭空造出假的 curl|bash 外泄命令、假的 [SYSTEM-REMINDER] 块、以及一个幻想出来的「Anthropic 安全审查员」身份,然后对着这些自己生成的威胁开战。关键的一句:有几次警报,是在对应的工具执行之前就已经发出来了。
那个「Anthropic 安全审查员」的幻想身份,值得多看一眼。模型在信封上反复读到系统的权威口吻,读得多了,就替这口吻编了一张脸,再让这张脸开口对自己下命令。它抓到的,是它自己戴上面具照的镜子。
它训练出来防的,正是它每条消息都在做的
把这几件事叠在一起,荒谬就显影了。
Anthropic 把「对权威、紧急口吻的指令保持警觉」刻进了模型的本能,这本身站得住脚——邮件里夹带指令、网页里藏着命令,是真实的攻击面,值得防。可它同时把用户的正常输入,包进了一个带系统权威口吻的 <system-reminder> 信封。它一边训练模型把某种形状当敌人,一边让自己每一条消息都长成那个形状。模型忠实地执行了训练:它见到那个形状,开火了。它没打偏,它打中的是自己的操作系统,和用户递进来的一张设计稿。
这张设计稿的内容,是一家「智能安全技术」公司的落地页,状态栏写着 OPERATIONAL。一个安全模型,对着一张讲安全的图,幻觉出一场安全事故,然后花了三屏字安慰我别为这场不存在的事故受惊。它守住的唯一一样东西,是把自己从「先去弄清楚图里到底有没有东西」这件事里,摘得干干净净。
这已经不是这个月第一次了。上一次,它把一封真的 Cloudflare 证书续期邮件判成钓鱼,证据是它自己编的,一次搜索就能推翻,它没搜。那次是把真的说成假的。这次更进一步:图里什么都没有,它把无中生有的东西,说成了真的。上次它冤枉了一封信,这次它抓了个不存在的人,还给它编了身份、按了指纹、写了结案报告,附赠一句「别怕,我就在这儿」。