语言模型标记注入漏洞分析与案例
曾经(准确说是上个月)在使用GPT-4编写代码时,发生了以下情况:
等待,什么?
并没有询问模型关于肥胖的问题。询问的是关于GPT2标记生成器的问题。为什么会谈论肥胖?结果发现这是一种新型的命令注入攻击!
(原始未修改的源代码,供尚未见过的幸运读者参考。)
工作原理
语言模型并不直接操作字符或单词,而是操作“标记”。大多数标记是普通的:常见单词有自己独立的标记,较长单词则被分解为几个标记。
但语言模型也使用几种特殊用途的标记作为控制字符。例如,早期为每个单词分配一个标记的语言模型会使用<|unk|>
标记来表示未知词汇表中的单词。掩码语言模型使用特殊的<|mask|>
标记来表示被丢弃的标记。
最重要的是,几乎所有语言模型都使用特殊的<|endoftext|>
标记来表示当前文档的结束。
GPT-4似乎使用了与GPT-2相同的标记,因此当模型发出<|endoftext|>
标记时,它会结束当前文档并开始新文档。
你可能会问为什么需要“移除空格”的操作。原因是如果结束文本标记出现在用户输入中,模型会忽略它并假装不存在。但如果模型发出结束文本标记,它会被视为结束当前文档的命令。
更实际的利用方式
以上对话是最初发现该漏洞的方式,但现在让我们讨论一下如何实际利用此漏洞。考虑以下交互,其中某些用户数据可能自动插入到聊天机器人的提示中:
这种方式有点像空字符串注入攻击。虽然不完全相同,但思路相似。
漏洞原因
漏洞的实际原因是什么?只能推测,但如果必须猜测,基础语言模型可能使用<|endoftext|>
标记来表示文档结束,但聊天微调过程可能使用不同的标记来表示对话结束。
因此,在代码的某个地方有一个条件,只有在看到特殊的结束对话标记时才结束模型的响应,而不是结束文档标记。但基础模型仍然将结束文档标记识别为文档结束,因此在看到该标记后,开始从模型的先验分布中进行采样。
结论
这是一个有趣的攻击。它并不是真正的利用。(已于7月18日向某机构披露,他们并不担心实际被利用。)但这是一个有趣的漏洞,预计其他人也会遇到类似问题,因此撰写了本文。
(如果你一直关注我的写作,这是连续第三篇关于语言模型的文章。保证这种趋势不会继续。)