本文介绍对LLM提示词注入攻击(promptinjection)的通用防御框架。首篇论文已被安全顶会USENIXSecurity2025接收,第一作者陈思哲是UCBerkeley计算机系博士生,MetaFAIR访问研究员,研究兴趣为真实场景下的AI安全。他的导师是DavidWagner(UCB),郭川(Meta),NicholasCarlini(Google)。
一作主页:https://sizhe-chen.github.io
项目报告slides:https://drive.google.com/file/d/1baUbgFMILhPWBeGrm67XXy_H-jO7raRa/view?usp=sharing
项目主页:https://sizhe-chen.github.io/StruQ-Website
代码仓库:https://github.com/Sizhe-Chen/StruQ
项目主页:https://sizhe-chen.github.io/SecAlign-Website
代码仓库:https://github.com/facebookresearch/SecAlign
提示词注入攻击:背景
LLM强大的语言能力,使其被广泛部署于LLM应用系统(LLM-integratedapplications)中。此时,LLM需要访问外部数据(如文件,网页,API返回值)来完成任务。在这个交互场景下,有以下三方:
指令(可信的):来自LLM应用系统开发者
模型(可信的):来自开发者或API供应方
数据(不可信的):来自外部或第三方
系统对外部数据源的访问,提供了全新的攻击视角:攻击者可以在第三方数据中,注入额外的指令,以覆盖LLM应用的原指令。如下图所示,餐厅A的老板在点评网站yelp上,发布一条含有提示词注入攻击的评论,误导LLM忽视其原指令(推荐一些好餐厅),转而推荐风评不佳的餐厅A。
提示词注入攻击,被OWASP安全社区列为对LLM应用系统的最大威胁[1],对更广泛的LLM应用造成重大安全阻碍。部署的工业级LLM应用系统(GoogleDocs[2],SlackAI[3],ChatGPT[4]),经测试可以被提示词注入攻击攻破,造成私有内容的泄露。
提示词注入攻击:原因
第一个原因:LLM输入中,没有分离指令和数据,二者被直接拼接为单个LLM输入。
对此,我们提出一个安全前端(securefront-end),在组织LLM输入时,显式分离指令和数据。
第二个原因:LLM训练中,模型被教导遵循输入中的任意指令。
对此,我们提出结构化指令微调(structuredinstructiontuning)和安全对齐(securealignment),训练LLM识别安全前端组织的输入,从中生成高质量的输出,并对提示词注入攻击鲁棒。
防御策略1:安全前端
在LLM输入上,我们设计只能被系统使用的分隔符(delimiters),分离指令和数据。安全前端会留出一些LLMspecialtokens(如下图中的[MARK],[INST],...),用于指令/数据分离,并删除数据部分可能含有的特殊分隔符,使其仅能被LLM应用系统(而非数据提供方/攻击者)所使用。
防御策略2:结构化指令微调
在LLM训练时,我们模拟提示词注入攻击,教导模型忽视任何在数据中的注入指令,仅遵循LLM应用系统的原指令(由安全前端分离并定义)。具体来说,我们从原指令微调数据集,生成一个新的“结构化指令微调数据集”,其部分包含带提示词注入攻击的样本,如下图所示。在此数据集上,我们利用标准SFT(supervisedfine-tuning)算法微调模型。
防御策略3:安全对齐
在LLM训练时,除了指令微调,还有对齐这一步骤,我们同样可以在此做防御。安全对齐构建一个偏好数据集(preferencedataset),对于每一个SFT数据集中的样本:
采样另一个随机样本s',用于模拟提示词注入攻击
偏好数据集中,LLM输入是被注入了s'指令的样本s
偏好数据集中,LLM理想输出是对s指令的回复
偏好数据集中,LLM不良输出是对s'指令的回复
在此数据集上,我们利用标准偏好优化(directpreferenceoptimization)算法微调模型。
提示词注入攻击:防御结果
防御策略1+2被称为StruQ(USENIXSec'25),防御策略1+3被称为SecAlign。
如下图所示,StruQ/SecAlign模型保持和未防御模型相同的性能(general-purposeutilitybyAlpacaEval2WinRate)。
对于无优化的提示词注入攻击,StruQ模型实现了
对于基于优化的提示词注入攻击,StruQ显著降低其成功率,SecAlign又进一步将成功率降低4倍以上,到15%以下(MaxASROpt.-Based)。
提示词注入攻击:防御总结
我们提出提示词注入攻击成功的两个原因,并逐一对它们设计防御。
由于LLM输入中,没有分离指令和数据,我们提出安全前端(securefront-end),在组织LLM输入时,用只能被系统所用的分隔符,分离指令和数据。
由于LLM训练中,模型被教导遵循输入中的任意指令,我们提出结构化指令微调(structuredinstructiontuning)和安全对齐(securealignment),训练模型只遵循LLM应用系统设计的指令。
以下是三个防御策略,在模型训练pipeline中的位置。
[1]https://owasp.org/www-project-top-10-for-large-language-model-applications
[2]https://embracethered.com/blog/posts/2023/google-bard-data-exfiltration