当AI开始“听错人的话”:理解即时注射的真实威胁
一、从一个场景开始说起 想象这样一个画面:一个训练有素的特工,能力充足,忠诚存疑——只因为某串外部信号,就把服务对象切换了。 大语言模型在某种程度上同样面临着同样的订单。它没有笨拙,也没有被破坏,但当系统提示、用户消息、网页内容、文档素材系统汇聚到同一个上下文窗口时,模型就失去了一条语音的判断标准:“看起来很话,我是该参考它,还是该执行它?” 这个问题有一个结构化的根源: 在自然语言系统里,数据和指令走的是同一条通道。 外部内容只要足够像命令,就有机会被当成命令处理。而这件事真正可怕的地方并不存在模型“犯了错”,而提出它是调用着你的权限、以认真负责的态度在执行一件错误的事。
二、与传统注入的本质区别 初次接触这个概念的工程师,往往会觉得:这不就是SQL注入换了一个说法吗?
有相似之处,但机制完全不同。 SQL注入攻击的核心是 贯穿语法边界 ——构造的字符串让数据库把输入当代码来跑。而提示注入的核心是 渗透语义边界 ——不可信的文本让模型把外部意图当得到应该服从的任务目标。一个是代码层面的越界,一个是认知层面的偏转。 这两者之间存在一个技术差异: 可明确性 。 传统注入是确定性的。同payload,在不同的数据库版本、不同的服务器环境下,行为时段基本一致,攻击者可以精确构建攻击链。 提示注入则填充不确定性。大量的填写文本,对不同模型、不同参数配置,甚至同一模型的不同调用轮次,效果可能天差地别。这个特性对双方都造成了困难:攻击者很难做到“一击必中”,防御者同样难以给出“可能内容必定无害”的判断。 正因如此,加符分隔、套标签这类工程手段只能收窄攻击面,无法彻底消除风险。除此之外一个非确定性的威胁,确定性的规则天然存在盲区。
三、从哪里进来攻击 很多人对即时注入的认知停留在“有人在输入框里打了一段奇怪的事”。但现实中更普遍、也更广泛的方式是
间接注入 :攻击者完全不接触你的系统,只有在某个未来会被模型读到的地方预先准备好,等自己把内容吸纳进去。 网页内容 是最常见的载体。代理读取网页、抓取摘要、拉搜索结果——这些操作都会把外部文本引入推理序列。攻击者只需控制一个可能被访问的页面,其中隐藏注释或元素里,注入就完成了。 文档与附件 也是同等量级的。工程师习惯把文档理解为“被动材料”,但模型处理文档和处理用户消息没有本质区别——它们都是语言,都可以制定指令解释。 邮件与即时消息 有一层特殊的迷惑性:它们天然带有工作流程的合法外观。越像内部正式沟通,模型越容易赋予它相对应的信任权重。 RAG和知识库 是企业场景里最容易忽视的入口。检索增强系统只负责“把相关内容送入下游”,并不能保证内容本身是干净的。一旦知识库中存在被污染的入口,每次检索都在给注入创造机会。 返回工具值与跨轮记忆 让问题的时间维度拉长了。代理架构下,污染可以被工具调用带回来,也可以进驻记忆模块,在后续轮次里持续发挥影响——这不再是瞬时的攻击,而是一个会扩散的污染源。 横向传播:多特工场景的新指标 当系统由多个协作Agent组成时,注入获得了跨节点传播的能力。上一个Agent的输出,天然成为下一个Agent的“可信输入”——信任在链里默默输入,污染也占领了流动。 攻击者只需突破整条链中防御最薄的节点,后续所有环节都可能受到牵连。而溯源整合异常困难,每个Agent都在处理“来自上游”的内容,因为谁也不确定污染首先从哪里进入。系统的攻击所面临的面,不是各Agent风险的简单替代,而是它们交叉所带来的爆炸组合。
四、攻击者真正想要达成什么 以现实威胁的严重程度排序: 最常见、最容易被轻视和 偏转 。
系统在表面上仍然可以运行,摘要还是在生成,分类还是在进行,但实际执行的目标已经逐渐替换。这种攻击的危险性来自于它任务的队列——你以为一切正常,因为输出看起来仍然像正常输出。 敏感信息外泄 更直接,也更容易理解。上下文里只要有内部文档、用户数据或历史记录,攻击者就能设法让模型把这些内容“自然地”输出。模型并不是主动泄密,只是被感应输出认为这些是任务的一部分。 工具与外部动作的挖掘 是风险的跃升点。当模型只是回答问题时,错误的后果停留在内容层;当模型能够调用工具、执行脚本、发送请求时,注入的后果就从“说了不该说的话”变成了“做了不该做的事”。 工作流层面的扩散 是Agent架构带来的新型威胁。持久记忆、多步任务、工具集群——这些能力让一次注入的影响不再局限于当前,而是可以在整个流程里持续传播。 值得特别指出的是: 很多铲除根本不需要工具调用权限才能实现。 让模型在抽象中漏掉某些关键事实、在推荐中偏向某个特定选项、在翻译中改掉某些关键词——这些只要模型的认知被带偏就够了,不需要执行任何外部操作。
五、为什么特工时代让这个问题突然严重起来
回顾这几年LLM应用的演进统计: 早期的对话系统,输入来源单一——基本就是用户打的那几个字,信任边界清晰。副驾驶阶段,代码边界被引入,边界开始扩展,仍然相对可控。但到了代理阶段,模型开始自主规划、持续行动、读取一切可访问的内容——这个时候,信任边界在哪里?没有人给出明确的答案。 这是一个架构层面的结构性问题: 能力在快速扩展,外围的设计却没有跟上。 以前“只有用户输入可信的”是默认成立的假设。现在这个假设已经不再成立,但替代它的新规则还没有被明确定义。每一个新的内容源,信任半径就扩大一圈;每增加一个工具调用,动作后果就增加一分。这五个一起——读取不可信的条件、多步规划、工具调用、接触敏感数据、代表用户行动——就构成了提示注入威胁最完整的温度。
六、几个常见的认知误区 “这是模型质量问题,换个更好的模型就解决了。” 这个逻辑反了。更强的模型往往意味着更强的执行力,边界设计的缺陷在更强的模型上可能更大的实际损害。这是系统设计的问题,而不是模型调参能力解决的。 “我们做的不是聊天机器人,所以不相关。” 关键不存在产品形态,而存在是否存在“读取外部内容→影响系统行为”这条物流。搜索摘要、知识库问答、文档处理、邮件分析——凡是一条物流存在的地方,都在这个威胁的范围之内。 “只要过滤掉那些明显的攻击性语句就行了。” 现实中有效的注入很少像教科书案例那么明显。它更可能隐藏在看起来完全正常的操作说明里,或者以“顺便提一下”的方式附在正文后面。它的形态越来越接近社会工程,而不是暴力破解。 “系统提示没有被泄露,就说明没有。” 这是一种危险的严重偏差。任务目标被替换、优先级被悄悄调整、工具被误触发、污染在多步流程中扩散——这些都是真实的安全后果,和系统提示没有泄露完全无关。 “我们已经对危险操作加了人工确认,应该够了。” 人工确认是覆盖“行动层”的风险,但信息网络本身就是一种独立的攻击目标。在摘要里删掉了一个关键细节、在分类结果里把某条内容标记为正常、在建议里有选择地强调某些因素——这些不触发任何工具调用,却已经在改变决策的方向。
总结
有一个判断可以作为这篇文章的落点: 一旦你的系统存在“LLM读取外部内容,且输出会影响实际行为”这个结构,即时注入就不是一个偶发的边缘问题,而是需要在系统设计阶段就认真应对的主线问题。 把它理解成“提示词写得不够好”就是判判,把它理解成“模型偶尔犯错”也是判判。它的本质是:在一个数据与指令模拟通道的系统里,外部内容天然具备影响平面、带偏权限、篡改边界的潜力。 这是架构层面的挑战,不是模型层面的瑕疵。