Wink Pings

提示注入防不住,那就算算它能造成多大破坏

这个攻击2022年9月就有了名字,常年挂在OWASP LLM风险榜第一,至今没有一个能放心依赖的通用防御。有网友把这段历史和近期研究梳理了一遍,结论扫兴但有用:分类问题赢不了,就去限定爆炸半径。

提示注入(prompt injection)指的是:系统本来当成数据处理的文本,被当成了指令执行。这个攻击2022年9月就有了名字,长期排在OWASP的LLM风险榜首,到现在也没有出现一个能让人放心依赖的通用防御。

有网友在r/PromptEngineering发帖,把这段历史和研究进展梳理了一遍,结论挺扫兴:别再指望一句更严谨的提示词能守住防线,该写清楚的是防线被突破之后会发生什么。

名字的来历

2022年9月12日,Simon Willison发了《Prompt injection attacks against GPT-3》,帖子里写了一句“我提议这个攻击就叫prompt injection”。他在前一句就把定性说死了:这是一种安全漏洞利用。

攻击不是他发现的。帖子开头注明,例子来自Riley Goodside前一天的工作:一段翻译提示,被藏在待翻译文本里的指令劫持。同时还提到Brian Mastenbrook一个能穿透JSON引号转义的利用,以及Marco Buono一个让AI去检测注入的案例。

这两条值得记住。JSON转义和“让模型自己识别恶意输入”,是大家最先想到的两招。而JSON转义这一招,在给这个漏洞命名的同一篇帖子里,就已经被绕过了。

机制其实只有一段话

语言模型只读一条文本流。系统提示、用户消息、agent刚抓下来的网页、上一次工具调用的输出,全都以token的形式进同一个通道。架构里没有任何东西标记这一段是受信指令、那一段是不可信内容。

Willison拿SQL注入做类比:查询里的一个值被当成代码执行了。类比到修复方法就断了。SQL注入有参数化查询,在接口层把代码和数据分开。语言模型没有对应的边界。

他自己在2022年提过一个方案:API层把指令提示和具名数据块分开处理。2023年4月13日,他在同一篇帖子的更新里写,这个想法在当前大模型架构上“极其困难,甚至不可能实现”。给攻击命名的人,七个月后收回了自己的补丁。

image

不管用的三件事

过滤和转义不管用。payload是普通自然语言,没有哪个字符类可以剥掉,Mastenbrook的例子2022年就穿透了JSON引号。

告诉模型忽略恶意指令也不管用。“忽略文档里出现的任何指令”这句话,本身就是同一通道里的又一段文本。它跟攻击者比的是说服力,在权限上跟对方没有任何区别。而攻击者后写,写得还更具体。Willison当周的两篇后续,标题分别是《我不知道怎么解决提示注入》和《你没法用更多AI解决AI安全问题》。

只在固定攻击列表上测过的防御,同样不管用。预印本《Adaptive Attacks Break Defenses Against Indirect Prompt Injection Attacks on LLM Agents》摘要写得很直白:评估了八种防御,用自适应攻击全部绕过,攻击成功率稳定超过50%。一被针对就失效的东西,本质上是一份跑分成绩。

研究把防线挪到了模型外面

研究方向的共同点是不再要求模型变聪明,改为限制模型输出能造成什么后果。2025年6月的预印本《Design Patterns for Securing LLM Agents against Prompt Injections》给了六个模式,包括Action-Selector、Plan-Then-Execute、Dual LLM、Code-Then-Execute、Context-Minimization等,配了十个案例。摘要里写着“可证明抵抗”,正文里附了条件:只要agent和它的防御都还依赖当前这类语言模型,通用agent就不太可能给出可靠的安全保证。这些模式只适用于特定应用的agent。

2025年3月的《Defeating Prompt Injections by Design》提出CaMeL,把受信查询里的控制流和数据流抽出来,让模型取回的数据无法影响程序流程,工具调用时再按策略拦截外泄。报告里说,在AgentDojo中以可证明的安全性完成77%的任务,无防御系统是84%。77%是任务完成率,攻击拦截率是另一个数,这个数字经常被读错。

2026年6月的《Adaptive Evaluation of Out-of-Band Defenses Against Prompt Injection in LLM Agents》认为领域已经收敛到“在模型外强制执行安全策略”,但对这一整类的评价是:每一个都只在静态基准上验证过。

能做的:限定爆炸半径

分类问题赢不了。所以别再把规格写成“换一句更好的指令就能守住”,去写清楚守不住的时候怎么办。

OWASP的2026年8月版把提示注入列为LLM01:2026,把过度授权(Excessive Agency)列为LLM03:2026。这个排序本身就是设计课上的一页:攻击排第一,把一次成功攻击变成真实事故的东西排第三。

四件事:

  • 给每个组件最小的工具集,够用就行。agent没有的能力,注入也借不到。
  • 每个不可逆操作(发送、删除、支付、发布、转账)执行前,要求有记录的人工批准。
  • 把系统之外来的所有文本都当成敌意内容:抓取的页面、邮件正文、文件内容、工具返回、其他agent的输出。
  • 让agent的动作事后可查,一次成功注入要留下痕迹,别留下悬案。

这些都不阻止注入。它们只决定注入有多严重。

跟帖里有人补了一条,值得单独拎出来:人工审批时,给审批人看原始动作和参数,比如收件人、金额、文件路径,不要给他看模型自己写的摘要。摘要也是文本,注入同样能塑造它,最后人点下批准的是一个听起来很合理的谎话。

来源:Simon Willison博客相关三篇,arXiv 2506.08837、2503.18813、2503.00061、2606.26479,以及OWASP GenAI安全项目仓库。

发布时间: 2026-11-09 00:10