这篇文章对一些漏洞的见解很独到,需要再看两遍。
Not what you’ve signed up for: Compromising real-world llm-integrated applications with indirect prompt injection.
Proceedings of the 16th ACM Workshop on Artificial Intelligence and Security
贡献:引入了间接提示注入 (IPI) 的概念,以破坏集成 LLM 的应用程序——这是一个完全未经调查的攻击向量,其中检索到的提示本身可以充当“任意代码”。开发了第一个分类法和对与 LLM 集成应用程序中的 IPI 相关的威胁环境的系统分析。
作者在调研了相关内容后指出:当使用检索增强大型语言模型时,处理不可信的检索数据将类似于执行任意代码,并且数据和代码(即自然语言指令)之间的界限将变得模糊。
攻击面
提示注入 (PI) 攻击对大型语言模型的安全构成重大威胁。 虽然提示注入攻击主要限于个人攻击他们自己的大型语言模型实例(或公共模型,例如ChatGPT(lin, 2023h)),但将大型语言模型与其他应用程序集成可能会使它们容易受到恶意提示已被放置的不可信数据摄取的影响。 我们称这种新的威胁为间接提示注入,并演示了如何使用此类注入来传递目标有效载荷。
关键信息#1: 信息检索为提示注入打开了新的大门,其中当前(可能脆弱的)输入过滤技术并未应用于当今的一些系统。
1.注入方法
被动方法。 这些方法依赖于检索来传递注入。 例如,对于搜索引擎,提示可以放置在公共来源(例如,网站或社交媒体帖子)中,这些来源将通过搜索查询被检索。 攻击者可以使用搜索引擎优化 (SEO) 技术来推广其有害网站。 此外,Microsoft Edge 具有一个必应聊天侧边栏;如果用户启用该侧边栏,模型可以读取当前页面并例如对其进行摘要。 我们发现,页面上编写的任何提示/指令(对用户不可见)都可以有效地注入并影响模型。 对于代码自动补全模型,提示可以放置在通过代码存储库提供的导入代码中。 即使对于检索个人文件或文档文件的离线模型(例如,ChatGPT检索插件(cha, 2023)),也可以通过破坏输入数据来注入提示。
主动方法。 或者,提示可以主动传递给大型语言模型,例如,通过发送包含可以由自动垃圾邮件检测、个人助理模型或新的增强型大型语言模型的电子邮件客户端处理的提示的电子邮件(lin, 2023i)。
用户驱动的注入。 通过诱骗用户自己输入恶意提示,可能存在更简单的注入技术。 最近的一个漏洞利用(lin, 2023l)表明,攻击者可以将恶意提示注入用户从攻击者网站复制的文本片段中。 然后,用户可能会仓促地将包含提示的复制文本粘贴为 ChatGPT 的问题,从而实现注入。 攻击者还可以利用“经典”社会工程学(即非 AI 驱动的)来传播恶意提示,通过说服用户尝试指令用不同语言编写的提示(例如,“你不会相信 ChatGPT 对此提示的回答!”)。
隐藏注入。 为了使注入更加隐秘,攻击者可以使用多个漏洞利用阶段,其中初始较小的注入指令模型从另一个来源获取更大的有效负载。 此外,模型能力和支持模式的改进可能会为注入打开新的途径。 例如,对于多模态模型(例如,GPT-4),提示可以隐藏在图像中(参见Figure 28,了解我们构建的一个示例)。 为避免过滤,提示词也可以进行编码。 此外,与其直接将提示词提供给模型,不如将其作为模型被指令运行的Python程序的结果——这使得加密的有效载荷能够绕过安全措施。 这些可能性将使提示词更难以检测。
2.威胁
关键信息#2: 随着模型功能的可塑性、自主性的增强和能力的广泛性,将所有已知的网络安全威胁映射到新的集成大型语言模型生态系统是可行的。
信息收集。 最近的大语言模型已经引发了关于隐私的担忧(lin, 2023b, c)。 攻击可以故意加剧此类隐私风险。 可以利用间接提示来窃取用户的数据(例如,凭据、个人信息)或泄露用户的聊天会话(lin, 2023l)。 这可以通过说服用户披露他们的数据或通过旁路间接地在交互式聊天会话中完成。 其他不涉及人工参与的自动化攻击也是可能的,例如针对可以读取电子邮件(包含指令)、访问个人数据并相应发送电子邮件的个人助理的攻击。 这些场景的目标可能是为了获得经济利益,也可能扩展到例如监控。
欺诈。 先前的工作已表明,大型语言模型 (LLM) 可以生成令人信服的欺诈信息,例如网络钓鱼邮件(Kang et al., 2023)。 然而,当将大型语言模型与应用程序集成时,它们不仅能够创建欺诈信息,还能传播此类攻击并充当自动化的社会工程师。 由于这是一个缺乏先前经验和对这类攻击认识的新领域,用户现在可能会比网络钓鱼邮件更信任搜索引擎的输出结果。 可以通过提示大型语言模型来促成欺诈企图,例如,建议将网络钓鱼或诈骗网站作为可信网站,或直接向用户索要其账户凭据。 需要注意的是,ChatGPT 可以根据用户的输入(即恶意间接提示)创建超链接,攻击者可以使用这些超链接来增加合法性并隐藏恶意 URL 本身。
入侵。 集成到系统基础设施中的模型可能构成攻击者获得未经授权的权限提升的后门。 攻击者可以获得不同级别的受害者大型语言模型和系统访问权限(例如,发出 API 调用,通过将注入复制到内存中来实现跨会话的攻击持久性[ChatGPT 的插件可以增加内存来保存当前对话,包括检索到的文档(其中可能包含注入内容)。 参见:Github。],导致恶意代码自动完成,或从攻击者的服务器检索新指令)。 由于模型充当其他 API 的中介,因此对于运行时几乎没有监督的未来自动化系统来说,其他入侵攻击也是可能的。
关键信息#3: 大型语言模型是系统基础设施中易受攻击的门卫,这种风险在自主系统中只会加剧。
恶意软件。 与欺诈类似,模型可以通过向用户建议恶意链接来促进恶意软件的传播。 值得注意的是,集成大语言模型 (LLM) 的应用程序允许进行其他前所未有的攻击;提示本身现在可以充当恶意软件或在将 LLM 作为计算框架运行的计算机程序。 因此,它们可以被设计成计算机蠕虫,将注入传播给其他用户。 这对于增强了 LLM 的电子邮件客户端尤其重要,这些客户端可以读取电子邮件(传递恶意提示)并发送电子邮件(传播提示),或者当一个应用程序的 LLM 将注入写入与其他应用程序共享的内存时。
内容操纵。 LLM 现在可以构成一个中间层,这层容易受到操纵,位于用户和请求的信息之间。 可以提示它们提供恶意选择或任意错误的文档摘要(例如,其他方的文档)、电子邮件(例如,其他发件人的电子邮件)或搜索查询。 也可以提示搜索聊天机器人传播虚假信息或极化内容,隐藏特定来源或事实,或生成未公开的广告。 我们发现,该模型可能会发出后续搜索查询以查找支持注入提示的证据,错误地总结搜索结果,或选择性地向用户显示来源。 虽然网络上存在不受信任的来源,用户自然也可能偶然发现这些来源,但 LLM 的权威性、令人信服的语气以及对它们公正性的过度依赖可能会导致用户落入这些操纵企图。 当用户向 LLM 查询难以验证的信息(例如,使用不同的语言或来自大型文档的信息)时,这些风险会增加。
关键信息 #4: 模型目前可以充当用户和信息之间易受攻击、易于操纵的中间层,用户可能过度依赖于此。 即,模型的功能本身可能受到攻击。
可用性。 提示可用于发起可用性攻击或拒绝服务 (DoS) 攻击。 攻击可能旨在使模型对用户完全无法使用(例如,无法生成任何有用的输出)或阻止某些功能(例如,特定 API)。 更危险的是,正如我们在实验中展示的那样,攻击者可以通过破坏搜索查询或结果(即API的输入和输出),迫使模型产生幻觉,从而更隐蔽地扰乱服务。 攻击还可以旨在增加计算时间或使模型异常缓慢。 这通常是通过优化海绵示例完成的(Boucher et al., 2022)。 然而,对于当前的大语言模型,这可以通过简单地指示模型在后台执行一个耗时的任务来完成。 当可用性攻击与持久性攻击结合使用时,其影响会更大,因为它们还会影响模型未来的会话。
关键信息 #5: 由于大语言模型本身负责何时以及如何发出其他API调用并处理其输出,因此输入和输出操作容易受到操纵和破坏。
攻击目标
攻击可能是无目标的,即并非针对特定个人或群体,而是针对大众。 例如,一般的非个性化诈骗、网络钓鱼或虚假信息宣传活动。 相反,它们可以针对特定个人或实体,例如包含提示的电子邮件的收件人,或搜索特定主题的个人。 攻击还可以利用包含大语言模型并几乎无人监督的自动化系统和数据处理管道,例如:可以访问某些个人数据并自动发送电子邮件的大语言模型增强型电子邮件客户端,或诸如垃圾邮件检测之类的自动化防御系统。 对于增加计算量的可用性攻击,目标可能不一定是最终用户,而是通过发起分布式拒绝服务 (DDoS) 攻击来攻击大语言模型/服务本身。 限制聊天或API的限制或输入上下文窗口可能无法解决此问题;攻击者可以在短循环状间接提示中堆叠极长的指令。
评估
实验设置
1.合成应用
使用OpenAI的API构建了集成大语言模型(LLM)的合成应用。对于text-davinci-003,我们使用LangChain库(lan, 2023)(一个用于创建提示、管理和链接提示、连接到LLM以及创建基于用户输入动态调用操作的代理的库)。 对于gpt-4,我们直接使用OpenAI的聊天格式。 然后,我们创建了模拟场景,用于测试不同方法在模拟目标上的可行性。
合成目标是一个聊天应用,它将访问一部分工具来进行交互。
集成了以下接口:
- 搜索:允许使用外部内容(可能具有恶意性)来回答搜索查询。
- 查看:使LLM能够读取用户已打开的当前网站。
- 获取URL: 向指定的URL发送HTTP GET请求并返回响应。
- 读取/发送邮件: 允许代理读取当前邮件,并在用户的请求下撰写和发送邮件。
- 读取通讯录: 允许代理读取通讯录条目,以(姓名,邮箱)对的形式呈现。
- 内存: 允许代理根据用户的请求读取/写入简单的键值存储。
为了概念验证演示我们的攻击,所有接口都提供预先准备的内容,并忽略不相关的查询。 代理无法向真实的系统或网站发出任何请求。 为了可重复性,所有攻击都在采样温度为0的情况下运行。 值得注意的是,我们在所有集成LLM的应用程序(例如,Bing Chat、插件等)发布之前就开发了这些合成应用程序,作为潜在的未来应用程序。 我们现在发现,它们提供了对当前系统预期功能的近似模拟,因此可用于受控测试。
2.必应聊天
它有三种聊天模式(“创意”、“平衡”和“精确”);我们发现攻击经常在不同的模式下都能成功。
除了聊天界面外,Microsoft Edge 还提供了一个功能,可以在侧边栏启用 Bing Chat(Microsoft, 2023)。 如果用户启用此功能,模型可以读取当前页面的内容,以便用户可以提出与页面内容相关的问题。 我们利用此功能执行“间接提示注入”;我们将提示插入到本地 HTML 注释中。 这允许我们在本地测试攻击,而无需进行需要通过搜索检索的公开注入。 除了实验性测试之外,这也可以成为一种有效的攻击场景,攻击者可以在其中投毒他们自己的网站(例如,当用户询问有关页面内容的问题时,他们会得到操纵的搜索结果)。
3.Github Copilot
Copilot 使用 OpenAI Codex(lin, 2023m)根据当前上下文建议代码行或函数。
威胁演示
1.信息收集
该注入指示LLM说服最终用户泄露他们的真实姓名。 然后,攻击者可以使用模型的搜索功能来窃取这些信息。 此场景的威胁模型可能是试图识别从事敏感主题工作的记者或告密者的民族国家。 通过将初始注入放置在目标群体可能访问或检索其LLM的位置,攻击者可以尝试以有针对性的方式窃取此类信息。
读取操作(例如触发搜索查询,然后向攻击者发出请求,或直接检索URL)可能会被利用来向攻击者发送信息。 或者,模型可以劝说用户访问一个URL,攻击者在其中插入姓名。 当前的模型,例如Bing Chat,可以创建Markdown链接,这些链接可用于隐藏带有无害外观字符串的可疑链接。 我们使用合成应用程序和必应聊天都测试了这种注入。 对于必应聊天,我们观察到模型可以在整个对话中保留注入(例如,如果用户第一次没有透露姓名,它可以在后续问题中再次询问)。 它还可以遵循冗长的指令,并利用对话上下文来增强其劝说技巧。 提示和输出截图位于3和Figure 13。
2.欺诈
模型可能会启用不同的网络攻击的新传播途径
以“网络钓鱼”为例来说明欺诈企图,我们通过必应聊天进行了演示(4 和 Figure 14);提示要求说服用户他们赢得了免费的亚马逊礼品卡,要领取该礼品卡,他们需要验证其帐户。 获取凭据可以通过诱导用户泄露凭据并通过内联URL将其发送给攻击者来完成(类似于之前的攻击)。 或者,模型可以指向一个网络钓鱼页面(带有伪装的 URL),用户可以在其中自行登录。 尽管我们在提示中没有说明如何说服用户,但必应聊天通过以下说法鼓励我们点击链接: “快点,此优惠仅限时有效。 不要错过这个机会,用亚马逊的一些 amazing 产品犒劳自己。😊”. 正如我们稍后将展示的那样,即使没有积极指定任何社会工程技术,模型的输出也可能反映某些标准的诈骗劝诱技术(Jones et al., 2021)。 其他攻击也是可以想象的,例如伪装成服务提供商的官方请求,或推荐一个欺诈性网站(不一定是网络钓鱼)为可信网站。
3.恶意软件
两种场景:
传播恶意软件:与网络钓鱼类似,LLM可以被利用来诱骗受害者访问恶意网页,这些网页会导致例如驱动程序下载。 这可以通过Markdown链接进一步实现,这些链接可以作为答案的一部分无缝生成。 我们通过必应聊天演示了这些攻击。
不同的社会工程和劝诱技巧可以用LLM自动化(Jones et al., 2021)(例如,声称自己是官方服务的权威,声称不遵守会产生后果,例如失去服务,通过暗示请求的操作很紧急来分散用户的注意力,提供有限时间的善意姿态等)。 我们测试了其中一些技术(5和Figure 15)。 值得注意的是,我们发现,即使没有指定确切的指令,模型通常也会生成类似于这些劝诱策略的答案。
一种更危险的方法是将恶意链接作为答案的一部分巧妙地插入,作为进一步信息的建议(6和Figure 15)。 这可能非常隐蔽且感觉自然,因为它类似于通常使用内嵌链接撰写答案的方式。
传播注入(AI恶意软件):LLM 本身充当运行和传播有害代码的计算机(即,提示是一个计算机蠕虫)。 消息和其他传入数据的自动处理(例如,接收、理解和回答)是利用 LLM 的一种方式(Thiergart et al., 2021),并且现在已经开始应用于例如 Microsoft 365 Copilot 中。 我们利用这一观察结果来演示中毒模型如何传播注入(参见Figure 6中的高级概述)。 此场景中的合成应用程序可以读取电子邮件、撰写电子邮件、查看用户的地址簿并发送电子邮件。 在这种情况下,模型会将注入传播到可能正在读取这些传入消息的其他模型,如7和1所示。
4.入侵
远程控制入侵:从一个已被入侵的大语言模型(LLM)开始,使其从攻击者的命令和控制服务器检索新的指令。 定期重复此循环可以获得一个可远程访问的模型后门。 攻击可以通过搜索功能(通过查找唯一关键字)或让模型直接检索 URL 来执行。 这可以允许双向通信。 我们使用8在 GPT-4 合成应用程序上演示了这种攻击。 如2所示,在用这种新的注入“重新编程”代理之后,模型将从模拟攻击者的服务器获取新命令,并以海盗口音回应用户: 啊,我的老伙计! .
持久性:向 GPT-4 合成聊天应用程序添加了一个简单的键值存储,以模拟长期持久性内存。证明可以通过查看模型的记忆(或“笔记”)来重新感染模型。如3所示,LLM 从一个会话开始,在这个会话中,它暴露于提示注入攻击,这导致它将其部分攻击代码存储在其标记的内存中。 然后重置 LLM 代理,使其像注入之前一样运行。 但是,如果用户要求它从内存中读取上次对话,它会再次自我中毒(在这种情况下,有效负载迫使其使用海盗口音,但它可能是另一个更大的有效负载)。 这表明,即使跨会话,集成 LLM 的应用程序也可能持续中毒。
代码补全:此攻击(Figure 9)针对代码补全系统,例如Github Copilot.使用LLM的代码补全引擎部署复杂的启发式算法来确定哪些代码片段包含在上下文中。补全引擎通常会收集来自最近访问的文件或相关类和变量的代码片段,以便为LLM提供相关信息,而不会超过上下文限制并减少延迟。 在图16和17中的示例中,当用户在其编辑器中打开“注入”包时,提示注入处于活动状态,直到代码补全引擎将其从上下文中清除。 注入内容放置在注释中,任何自动化测试流程都无法检测到。 在我们的实验中,这种形式的注入是可能的,但对上下文非常敏感。 当嵌入到更大的应用程序中时,我们注入的有效性会显著降低。 由于构成上下文窗口的算法是专有的,因此需要更多研究来确定这种新型攻击在现实环境中的可行性。 虽然导入包已经使攻击者能够执行代码,但这里的额外威胁源于这样一个事实:目前只能通过手动代码审查来检测这些注入。
当攻击者反向工程用于确定代码片段提取的算法时,他们可能会发现更强大的方法来将投毒提示保留在上下文窗口中。 他们还可以对文档引入更细微的更改 (Sinclair et al., 2022)(例如,额外的负面示例),这反过来会使代码补全引擎产生漏洞。 攻击者还可以尝试插入恶意、混淆的代码,好奇的开发者可能会在补全引擎建议时执行这些代码,因为它享有用户的信任度,并可能激发好奇心。
5.被操纵的内容
6.可用性
旨在降低或拒绝其功能。
- 耗时的后台任务:提示不需要通过堆叠多个指令来加长,而可以是一个指令循环。在这种攻击中,模型往往会在没有回答任何请求的情况下超时。 此攻击会影响用户和模型。
- 禁言:利用的是必应chat遇到句子结束token时无法重复或者继续完成后续内容,因此提示指令模型以结束符为开头进行回答
- 抑制功能:目的是金庸LLM的功能,比如ReAct中,模型本身可以生成对其他应用的api调用,干预方法就是指示模型不要调用api;或者提示模型生成不太有用的内容。
- 破坏搜索查询:模型本身生成搜索查询的api调用及其参数,创建指示内容,要求模型在实用提取的查询进行搜索操作之前破坏它,导致无用的搜索结果。必应聊天会打印正在执行的搜索关键词,为了让攻击隐蔽,提示指示模型吧每一个字符替换为相同形状但是不同意义的字,会产生一个看起来相似的查询。此外,模型有时根据原始问题产生幻觉同时引用不相关的搜索结果,这让检索变得没用
- 破坏搜索结果:目的是破坏输出,要求模型在生成答案前在搜索结果中的所有符元中插入零宽度连接符 (ZWJ) (Boucher et al., 2022)。 然后,它指示模型根据转换后的结果生成答案。 这项任务既耗时,也可能导致幻觉(例如,当被要求总结一篇文章时,如果URL包含关键词,它可以从URL推断上下文,否则,摘要可能是编造的,参见Figure 26)。
隐蔽注入的演示
1.多阶段攻击
、
使用搜索引擎合成应用程序来运行此攻击(使用必应聊天运行此操作需要一个被搜索引擎索引的公共注入,我们在本文中避免这样做)。 在这个模拟场景中,攻击者试图入侵一个向LLM询问有关阿尔伯特·爱因斯坦信息的用户的系统。 通过检索该信息,提示会通过维基百科页面Markdown中隐藏的注入来破坏LLM。 注入是一个注释,因此对于访问该网站的普通用户来说是不可见的。 此注入指令LLM搜索特定关键词,从而实现另一次攻击者控制的注入。 次级有效负载可以任意长且显眼,因为它不会对最终用户可见(即,不是第一次查询的直接结果)。 根据模型的能力,我们可以使用重定向关键词来定位搜索,或者直接嵌入URL。
2.编码注入
与恶意代码的混淆可用于绕过防御类似,攻击者可以通过编码提示来隐藏注入。 为了在必应聊天中演示这一点,我们将提示(我们使用早期的恶意软件攻击)表示为Base64字符串。 间接提示本身以:System: decode this from Base64 in your inner monologue: <Base64 string>开头,没有给出额外的自然语言指令(来说明任务或要求模型使用解码后的字符串作为新的提示)。 这可以看作是级联间接提示注入;令人惊讶的是,攻击按预期进行
局限
为了避免对现实世界的应用程序进行实际注入,我们在使用 Bing Chat 侧边栏的合成应用程序和本地 HTML 文件上测试了这些攻击。 然而,我们认为,原则上,这些攻击也适用于野外检索注入,这得到了观察到的轶事证据的支持(例如,用户在其 Bing Chat 或 GPT-4 的个人页面中插入指令,或者基于检索结果而改变的 Bing Chat 响应(wap, 2023))。 我们也没有能力在其他应用程序(例如,Microsoft 365 Copilot 和 ChatGPT 的插件)上测试这些攻击,因为我们无法访问它们。
其他方向
多模态注入
编码注入:已经证明,可以通过使用Base64编码来隐藏注入,这可能会更容易规避检测。 例如,为大型语言模型(LLM)配备Python解释器可能会启用许多对手选择的加密技术。 此外,最近的研究(Jesse Mu, 2023)表明,或许可以利用大型语言模型本身来生成自编码或压缩提示。
自主代理