灌铅的骰子

当每一个结果都合法,攻击就藏在选择之中——而 AI 如今处处都在选择

1980 年,宾夕法尼亚州彩票在电视上直播开出每日号码:实体乒乓球,从摇奖机里升起,就在镜头前。开出的号码是 6-6-6。事先,主持人和几个内部人员往每一个球里注了油漆,只放过 4 号和 6 号,于是只有这两种球升得起来;他们的朋友则买下了由 4 和 6 组成的每一种组合。

让我印象最深的是:从机器里出来的,没有一样是不合法的。666 是一个合法的彩票号码,由真实的球开出。这次攻击没有伪造任何结果;它只是选了一个。

随机性曾是一个安静的输入

针对随机性的攻击并不新鲜。数字世界里的这类攻击大多冲着密码学而去:生成器可预测,或者某个随机值被重复使用,密钥便随之泄露。

但在普通软件里,随机性很少决定程序做什么。一个哈希种子,一次退避抖动,负载均衡器的一次掷币:改掉其中任何一个,计算算出的仍是同一个东西,只是快一点或慢一点。随机性是保密与性能的输入,而不是行为的输入。

AI 靠掷骰子运行

如今不再如此。AI 系统在三个层次上抽取随机数(见《重放归来》)。在张量层,一次归约的求和顺序取决于有多少请求共享同一个批次。在词元层,采样器从一个分布中抽出下一个词元。在轨迹层,智能体读取时钟、进程号、工具的输出,读到的是世界在那一秒恰好给出的东西。

这些都不能简单地去掉。总是选最可能的词元,产出的文字被最早指出这个问题的论文形容为“乏味且怪异地重复”。重复采样是模型得到更好答案的办法:在一个编程基准上,至少有一个样本解出的题目比例,从单个样本时的 15.9% 升到 250 个样本时的 56%。确定性也有代价。要让推理逐比特可复现,需要批次不变的内核,在已发表的测量中,这让一次运行从 26 秒变成了最好情况下的 42 秒。OpenAI 为它的 seed 参数写下的说明值得装裱起来:“不保证确定性。”

所以随机性如今是承重的。它决定出现哪些词,执行哪条命令,删掉哪个文件。

一个新的攻击面

一旦随机性决定行为,操纵它就是一种攻击,而文献里在每一层都已经有了例子。

在词元层,仅仅改变解码设置、完全不用对抗性提示,就让十一个开源模型的失准率从 0% 升到 95% 以上。反复对提示做随机扰动、直到某一次突破为止的“Best-of-N 越狱”,在一万次尝试下对 GPT-4o 的成功率达到 89%。我们组的工作直接搜索解码树,找出那些在默认设置下看似安全、却能沿着采样器可以合法走到的路径抵达有害输出的提示。往球里灌漆的攻击也有字面意义上的对应物:一篇近期的预印本表明,被攻破的采样器随机数生成器可以注入指定的词元,而每一个 logit 都纹丝未动。

在张量层,批次是一个共享的随机变量。两篇预印本表明,与受害者落在同一批次里的攻击者可以还原受害者的提示,一篇借助专家路由,另一篇借助整批量化。目前两者都是泄露而非操纵;操纵显然就是下一篇论文。在轨迹层,智能体的运行可能仅仅因为一个时间戳而分叉。非确定性还是很好的掩护:一个预期输出会变化的审计,很难把正常的变化与服务商悄悄换上一个更便宜模型区分开来。

没有标准答案,也没有单一的检查点

有两个性质,使这类攻击不同于我们已经知道如何应对的那些。

其一,没有错误答案可抓。传统攻击会产出某种可被查出的坏东西:伪造的签名,损坏的记录,一个没有任何正确执行能产生的值。对随机性的攻击产出的,却是某个合法执行本可以产出的结果,因此它能通过任何“是否有合法运行能解释这个输出”形式的检查(见《无窗之箱中的正确》)。攻击者就住在那个存在量词里面。每一个候选都合法;攻击在于选中了哪一个。666 能通过一个彩票号码所能经受的一切检查。

其二,选择被层层深度掩盖。GPU 归约中一个以不同方式打破的平局,变成一个不同的词元,变成一条不同的 shell 命令,变成机器的一个不同状态。等到损害在顶层显现,它的成因已在三层之下,而中间每一层,就其输入而言,行为都是合法的。

信任,但要重放

预防走不了太远。我们无法去掉随机性,也无法禁止任何结果,因为每个结果都是被允许的。我们能做的,是彩票业在 1980 年之后学会的事。比如在今天的佛罗里达州,每次开奖前后都要给球称重,由一位独立会计师见证,前后相差超过一克,整套球就交给调查人员。没有人声称开奖不可能被操纵。所声称的是:被操纵的开奖会留下证据。

对 AI 而言,对应的是一套三步的纪律。记录每一次抽取:每一层的每一个随机值,批次的构成,采样出的词元和种子,时钟和工具结果。然后重放:根据记录复现这次运行,并核对随机性是否就是它声称的那样,就像随机信标发布带签名、成哈希链的数值,任何人事后都能验证。然后归因:出了问题,就把某一次记录下的抽取换成另一个合法候选再重放。如果损害消失,这次抽取就是根因。同一套记录与重放机制也服务于调试(见《重放归来》);在这里,它面对的是对手,而不是程序缺陷。

根因的定义在这里很要紧,因为它与这种攻击严丝合缝。你不能说被选中的那次抽取无效;它是有效的。你能说的是:另一次同样有效的抽取不会造成这个损害,而正是这一次抽取起了作用。这是一个反事实,而反事实需要记录。

那么,信任,但要验证,只需做一处调整:对随机性而言,验证不是检查结果,而是能够重放那次选择。

参考文献