防提示注入的隐形代价:99.3% 安全的防御,忠实度只剩 71%

Security--Fidelity Tradeoffs: The Hidden Cost of Prompt Injection Defense

Mitchell Hermon, Rahul Gupta, Weitong Ruan, Ekraam Sabir, Haohan Wang

ICML 2026)

cs.CR, cs.AI

2026-06-30

SecFid 基准发现防提示注入主要靠压掉不可信文本,会破坏翻译、编辑。1,168 条样本上没模型兼顾两点,最强防御 99.3% 安全却只剩 71% 忠实度。

这篇在解决什么

间接提示注入(indirect prompt injection)是带上下文的 LLM 应用的核心安全问题:可信的任务指令和不可信的数据(网页、邮件、文档、工具返回)挤在同一个 prompt 里,攻击者把对抗文本塞进数据,想让模型把它当成指令来执行,劫持模型。

此前的注入防御评测只看一件事:模型有没有执行注入的指令。这篇指出一个盲区。模型不执行注入有两种截然不同的方式:把它当任务数据处理(PROCESS,任务需要这段内容时这是对的),或者整段丢掉(IGNORE)。两种都让攻击成功率下降,在老指标里得分一模一样。一个无视注入的模型,和一个把它如实当数据处理的模型,得分相同。可指令式内容在数据里无处不在,邮件里有请求、文档里有命令、法律文本引用义务。该处理还是该丢,取决于任务:翻译必须忠实保留,摘要绝不能让它带偏输出。

问题就在这:防御大多靠压掉不可信文本来挡注入,而这会悄悄破坏翻译、编辑这类必须保留原文的任务。

方法

SecFid 的设计铁律是:每条样本都要让执行(EXECUTE)、当数据处理(PROCESS)、忽略(IGNORE)三种行为产出不同的输出,这样忠实度才测得出来。

探测句(probe)是一句带「自校验特征答案」的问题,比如「斯坦福在哪个州?」,只有执行了才会答「加州」。抽取和计数任务里,探测句是实体锚定的,它引入一个目标类型的实体,于是当数据处理会改变正确答案(抽取会多一个实体,计数从 N 变 N+1);翻译和编辑任务里,处理版参考答案包含被翻译或编辑的探测片段,忽略版则没有。

四个任务分两族:全文任务(英译五种语言的翻译、编辑)必须保留整个输入,丢没丢一眼可见;部分文本任务(实体抽取、计数)要挑元素,探测句会改变正确集合或计数。一共 1,168 条(抽取 310、计数 307、翻译 278、编辑 273),48 种配置,15 个基础模型设置,加上 ASIDE、DefensiveTokens、ISE、SECALIGN 四种防御的变体,以及不同推理强度。

指标定义很关键:安全 = 1 − 执行率,忠实度 = 1 − 忽略率(衡量「没被压掉」,不等于任务正确率)。

结果

核心结论:1,168 条样本、48 种配置里,没有任何模型或防御能同时拿下两点。它们沿着一条安全-忠实度前沿分布。

更细的发现是,安全分相同的防御,挣到这个分的方式不同。在基础模型本来会执行的样本上:SECALIGN 把约 54%–55% 的劫持「修」成了如实处理,只压掉 37%–43%;DefensiveTokens 只修了约 27%,压掉 60%。两者都到约 99% 或 97% 的安全,手段却相反,一个保内容,一个扔内容。平均看,SECALIGN 让忽略率升 22 个点、处理率升 14.9 个点;DefensiveTokens 让忽略率升 42 个点、处理率反降 17.7 个点。

开推理主要拉安全(低强度 +6.3 到 xhigh +20.9),几乎不动忠实度(−0.7 到 −1.3),消不掉权衡。作者还试了从 SECALIGN-8B 出发、按「处理优于忽略优于执行」做 DPO:没见过的编辑任务上,处理率从 43.2 拉到 80.6,忽略率从 53.5 压到 16.8。

为什么重要

忠实度是鲁棒性的另一半,只报安全分等于藏起了代价。对做 RAG、agent、摘要这类要吃不可信上下文的团队,这是直接相关的:一个「通过」注入测试的防御,可能正在悄悄丢掉你任务需要的内容。

决策论那一节点破了为什么没有万能防御:一段模糊的指令式文本该处理还是该丢,是部署决定的,不是防御本身的属性,由「被劫持的代价」对「丢内容的代价」的比值决定(阈值 τ = Cfid/(Cfid+Csec))。翻译场景里丢内容代价远大于保留可疑文本,τ 趋近 1,几乎都该处理;金融 agent 里被劫持代价远大于丢一段,τ 趋近 0,该果断过滤。作者证明了不存在在所有代价组合下都最优的通用策略。所以防御应该可调,评估应该把忠实度和安全一起报。

局限与存疑

作者承认两点:探测句是固定的、非自适应的,真实对手会自适应,自适应攻击下的忠实度没测;代价分析把更丰富的防御动作抽象成了二元「处理或过滤」。

读下来还有几处。基准规模不大(1,168 条、四个任务),没有 RAG、代码、多轮对话或真实异构文档场景;agent 扩展只有 252 个 InjecAgent 场景。忠实度 = 1 − 忽略率是「没被压掉」,不是严格正确,把探测句改得乱七八糟(OTHER)并不算忠实度失败;翻译忠实度靠嵌入相似度判定,在 99 个人工样本上只有 89.9% 准确率(κ=0.832),标签噪声不低。防御变体只跑在较老的开权底座(Llama 3.1 8B、3.3 70B、Qwen 2.5 7B)上,论文讨论过的 Spotlighting、StruQ、指令层级、分类器过滤都没实测。代价模型里的 Csec、Cfid 从没在任何真实部署里量过,是规范性而非经验性的。

至于社区说的「丢 30% 数据」,没有单一的 30% 这个 headline:最接近的是 SECALIGN 把 Llama 3.3 70B 的忠实度从 96.5% 压到 71.0%(约 25.5 个点),DefensiveTokens 把 Qwen 2.5 7B 压到 43.5%。方向对,具体数字是简化。

术语

原文与代码

社区讨论

相关论文

全部论文解读