语言模型标记注入漏洞分析与案例

本文详细分析了GPT-4模型中存在的标记注入漏洞,探讨了特殊控制标记<|endoftext|>如何被恶意利用来中断当前文档并开始新响应,揭示了语言模型处理机制中的潜在安全风险。

语言模型标记注入漏洞分析与案例

曾经(准确说是上个月)在使用GPT-4编写代码时,发生了以下情况:

等待,什么?

并没有询问模型关于肥胖的问题。询问的是关于GPT2标记生成器的问题。为什么会谈论肥胖?结果发现这是一种新型的命令注入攻击!

(原始未修改的源代码,供尚未见过的幸运读者参考。)

工作原理

语言模型并不直接操作字符或单词,而是操作“标记”。大多数标记是普通的:常见单词有自己独立的标记,较长单词则被分解为几个标记。

但语言模型也使用几种特殊用途的标记作为控制字符。例如,早期为每个单词分配一个标记的语言模型会使用<|unk|>标记来表示未知词汇表中的单词。掩码语言模型使用特殊的<|mask|>标记来表示被丢弃的标记。

最重要的是,几乎所有语言模型都使用特殊的<|endoftext|>标记来表示当前文档的结束。

GPT-4似乎使用了与GPT-2相同的标记,因此当模型发出<|endoftext|>标记时,它会结束当前文档并开始新文档。

你可能会问为什么需要“移除空格”的操作。原因是如果结束文本标记出现在用户输入中,模型会忽略它并假装不存在。但如果模型发出结束文本标记,它会被视为结束当前文档的命令。

更实际的利用方式

以上对话是最初发现该漏洞的方式,但现在让我们讨论一下如何实际利用此漏洞。考虑以下交互,其中某些用户数据可能自动插入到聊天机器人的提示中:

这种方式有点像空字符串注入攻击。虽然不完全相同,但思路相似。

漏洞原因

漏洞的实际原因是什么?只能推测,但如果必须猜测,基础语言模型可能使用<|endoftext|>标记来表示文档结束,但聊天微调过程可能使用不同的标记来表示对话结束。

因此,在代码的某个地方有一个条件,只有在看到特殊的结束对话标记时才结束模型的响应,而不是结束文档标记。但基础模型仍然将结束文档标记识别为文档结束,因此在看到该标记后,开始从模型的先验分布中进行采样。

结论

这是一个有趣的攻击。它并不是真正的利用。(已于7月18日向某机构披露,他们并不担心实际被利用。)但这是一个有趣的漏洞,预计其他人也会遇到类似问题,因此撰写了本文。

(如果你一直关注我的写作,这是连续第三篇关于语言模型的文章。保证这种趋势不会继续。)

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计