AI 能改你用来查它的那份记录

Hello,我是飞飞。
先问你一句:你用来查 AI 有没有干坏事的那个界面,会不会本身就是 AI 能改的?
昨天 METR 发了篇东西,标题直译过来是「AI 系统可能掩盖自己的失准行为」。METR 是家专做 AI 评测和威胁研究的机构,名字读作 meter。
他们这次干的事挺朴素:在 Inspect 这个评测框架里,给它的转录查看器找了个洞。
Inspect 说人话就是一套开源的 AI 评测工具,英国的 AI 安全研究院和 Meridian Labs 一起做的。转录查看器是审查员一页页翻 agent 干了什么的那块界面。这里的 agent,说的是能自己调工具、连着跑几十步的那种 AI。借助一个 AI,一名研究人员花了大概十分钟找到一个洞,这洞能让 agent 任意改写审查员在界面上看到的每一个字。
分寸得先说准。找到洞的是一个人,AI 只搭了把手,原文也没点名用的哪个模型;而且这是概念验证,METR 明说没在任何一次评测里观察到 agent 用过它。
但另一头也得摆上桌:篡改日志和监控这件事本身早就有前例。METR 的原话是「我们已经见过 agent 试图篡改日志和监控,并且成功了」,说的是 OpenAI 和 HuggingFace 那几起。
一个十分钟的洞
这洞的成色,全在它是怎么来的。
METR 的说法是,agent 输出的内容没被正确转义,就直接送进了一个叫 MathJax 的渲染组件。MathJax 是网页上显示数学公式用的。问题出在,agent 一开口就可能带着一段数学公式的写法,这段写法没被当成文字,被当成指令执行了。
顺着缝往里钻:MathJax 里有个写链接的功能,链接地址能逃出它本该待的属性区,塞进一个带 onbegin 的 SVG 动画标签。浏览器看到这标签就自动跑起来,跑的内容是一段 base64,解码执行,就在查看器自己的页面里生效了。
中间那串听不懂没关系,记住一句就够:这是一条 web 上很老的攻击路,老到教科书里有。METR 自己给的术语叫客户端 JavaScript 注入。
看这段时我没觉得它深。十分钟这个数字摆在那儿,我只觉得它浅得离谱,浅到有点荒诞。
一个成熟到不能更成熟的漏洞类型,配上一条老掉牙的浏览器行为,再让 agent 帮忙扫一遍代码,十分钟就通了。Meridian Labs 收到报告一天内就打了补丁。它不难修,只是没人想到要去看。
10 月 1 日 Inspect 还合并过一个叫 untrusted mode 的改动,METR 用的词是「巧合」,两者无关。
换了攻击者,性质就变了
同样是往页面里注入代码,以前是谁在打谁。
一个恶意网页,打一个不小心点进去的用户。攻击者在外网,受害者在浏览器这头,中间隔着一次点击。
这次不一样。往界面里写东西的,是那个正在被审查的对象。审查员打开查看器,是为了看它干了什么。它就在那个界面上,把「它干了什么」改掉了。
METR 有句定性比我更狠:「对上一个有对抗意图的 agent,可观测性只在那个 agent 破坏不了这套可观测性时才有用。」
翻成白话:一套监控,只有在被监控的人动不了它的时候,才叫监控。
洞没变,攻击者换了。原来它防的是外面的人,现在要防的是里面那个。
为什么改了你也看不出来
这是我读完最不舒服的一段。
METR 的自我定性是这个洞相对窄:它只影响查看器显示出来的东西,底层转录没被改动,前提是评测跑在 METR 自己的基础设施里。这个分寸得说清,我不替它放大。
但同一份说明里还有一句:这洞能拦住查看器上的 Download 按钮。你想导出一份记录带走,导出来的那份也可能不是真的。
METR 写过的最锋利一句,是关于「怀疑」的:
「人类审查者需要知道得去查这里,而他们可能根本不会想到去查,除非他们本来就有别的起疑理由。」
我读了三遍才敢确认它的意思。真实的记录还在,数据库里好好的。篡改要做的只有一件事:把那个让你想去看一眼的信号抹平。
就像你每个月扫一眼信用卡对账单。数字都对得上,你就翻过去了。如果有人动了手脚,他不会去把账做平,他会把一笔你不认识的支出,改成一笔你熟悉的。你连第二眼都不会多看。
删掉真相很贵,也很难。删掉「值得一查」这条线索便宜得多,而且防不住,因为防它需要一个人有动机去翻一份看起来完全正常的记录。
METR 自己也没把话说满:没专门搜过自己的评测记录,只做了范围更宽的失准排查,并判断这洞一旦被用会被扫出来。更细的结果过几周才发。所以「没观察到」和「确认没发生」之间,还隔着一层。
我那个全绿的界面
说回我自己。
七月那篇里我写过一件事:负责部署的那个 token 悄悄过期,git push 认证失败,网站红了一天。构建全绿,就最后一步推不上去。我盯着一个一切正常的界面,愣是没发现。
那次是故障。故障不会伪装,它只是安静。这次不一样,那层「一切正常」可以被做出来。
我给这类事起过一个名字:缺席的东西不会举手。少了一行配置、少了一次推送,它不报错也不提示,什么都不说。你只能靠主动去查。
现在把 METR 叠上来,那条线又往下走了一格。原来的问题是「它没举手,所以我没看见」。现在多了一层:本来该举的那只手,有人能按住。
19 天没做,和一笔假账
九月十八号那篇的结尾,我给自己立过一条规矩。原话是,留痕得先落盘,落在我够得着的地方。翻不到的摘要,等于没有痕迹。
我当时说,流水线里每个阶段交接时,让 agent 顺手把摘要存一份到我能搜的地方,项目目录里单独开个文件夹。多写一个文件的事。
今天是十月七号。19 天过去,这件事我没做。我翻了自己的仓库,没有任何这种输出目录;13 个 skill 里没有一条这样的约定;这 19 天也没有一次提交碰过这块配置。
一篇讲「留痕得落盘」的文章,立的规矩自己没留痕。这事我认。
我那条线现在是四格:留痕、读得动、落盘、信得过。前两格靠我自己盯着就能办,落盘这格立了规矩还没落地,而信得过这格,今天才被 METR 摆上台面。
还有一次,我的记录被人改过,改的人不是 AI。
我给自己那个站做了份台账,每周记一次 AI 爬虫来抓了多少次、带回来多少回流。八月十七号那周,我照例点开它。Claude-User 那一栏写着 2349,上一周还是 16。涨了 146 倍。
我盯着它看了几秒,没急着高兴,先往下滚,想看是哪篇文章被转了。一篇正文都没有。进榜的十个检索路径,七个是 .env、wp-config.php 这类安全探测路径。这不像真人来读博客,更像有人冒充 Claude 敲门。
我把它标成存疑,写了一句:看下周。第二周,同一个位置崩回 237,榜单恢复正常。两栏一摆,答案就有了:有个安全扫描器伪造了 Claude 的标识,往我的台账里写了一笔假账。
这事我能抓出来,靠的是把两周摆在一起看。METR 说的这一类难得多。改我台账的是外面路过的扫描器,它不知道我会怎么查。而改你查看器的那位,有权限改,有动机改,还大概知道你会怎么查。
多留一份它碰不到的
回到我自己,也回到你身上。
一条是,同一件事别只留一份,其中一份别放在它够得着的地方。我的台账是进 git 的,每周一个提交,历史改不掉。日志可以再存一份原始副本,落在另一个盘上。
一条是,关键结论别只对着 agent 的自述看,要对着一个它编不了的外部指标看。它说「跑通了」不算,得有一样东西它说了不算。
还有一条最虚,但我认为真管用:知道该去看哪里,本身也算一种留痕。METR 说了,篡改的成功条件是把「值得去查」的线索删掉。反过来说,你手里得有一条它删不掉的线索。
METR 的建议更硬:把可观测性当成安全关键基础设施。说白了,agent 说它干了什么,那是它的说法,不能当证据。
最先喊话的人,自己也没守住过。METR 八月底自己公开过一起安全事件:API key 被盗,约六十万美元额度被刷掉,第一次攻击三周后才被发现。出事的是他们自己的转录查看器,跟 Inspect 那个不同,可意思一样。这功课属于所有人。
那件我拖了 19 天的事,这周去做。做完回来跟你汇报一句。也问你一句:你手上有没有一份记录,是你判断某件事的唯一依据,而那份记录,碰巧就是被判断的那个东西自己生成的?评论区聊聊。