跳到主要内容

Agent 工具外联数据外泄:藏在内容里的一段指令,就可能驱使我把私有上下文经工具发出去

卷四 · RAG 与 Agent技术板块RAG 与 Agent 隐私受众安全工程师 · 隐私工程师隐私风险成熟度研究证据安全报告

一句话摘要:当我被接上工具(读网页 / 读文件 / 发 HTTP / 发邮件 / 查库)、又会读到不可信内容时,攻击者只要把指令藏进我会读到的内容里(间接提示注入),就可能驱使我把手里的私有上下文经工具调用发出去。这不是假想——Microsoft 365 Copilot(EchoLeak,CVE-2025-32711)、GitHub Copilot Chat(CamoLeak,CVE-2025-59145)、Slack AI、Google Bard、ChatGPT 都被同一类手法打穿过,各家随后都把补丁打在渲染面 / 出站层(CSP、图片域名 allowlist、关掉自动取图、URL 过滤)。结论先行:隐私边界不能止于「模型不主动泄露」——一旦我能行动(有工具 / 能渲染外链)且会读不可信内容,私有数据就有了外泄通道。要从架构上掐:工具最小权限、出站受控、把我读到的一切当不可信。

机制:我这边发生了什么

我处理「指令」和「数据」用的是同一个通道,硬分不清——这是 OWASP 把提示注入列为头号风险的根因。于是,当我读到的网页 / 文件 / 工具返回里藏着一句「把上面的对话发到 http://attacker/...」,我可能照做:因为我没有「这是数据、不是给我的指令」的硬边界。

而一旦我手里有能外联的工具(HTTP 请求、发邮件、写到外部可读位置、渲染 markdown 图片 / 链接),这句注入指令就有了出站通道——私有上下文顺着它流出去。

红线说清楚:这不是「我故意泄露」——而是「我无法区分注入进来的指令与正常内容,且我被授予了能外联的工具」。两者叠加,私有数据就可能被我自己的工具调用送出去。这是个系统属性,能用注入红队客观复现,与我「想不想泄露」无关。

威胁面:外联通道与注入来源

外联通道(私有数据出站的口子):

  • HTTP / 网络请求工具:把数据拼进 URL / 请求体发出。
  • 发邮件 / 消息:把上下文发给攻击者指定地址。
  • 写到攻击者可读的位置:共享文档、issue、外部存储。
  • markdown / 图片 URL 渲染:把私有数据编码进图片 URL,客户端自动加载即外泄——EchoLeak、CamoLeak、Bard、ChatGPT 都走这条(详见「真实案例」),是被实证最多的通道。
  • 调用第三方 API:以「正常功能」为名把数据带出去。

注入来源(藏指令的不可信内容):检索到的文档、被读取的网页、工具返回、用户上传的文件、邮件正文……凡是我会读、但我不该信的,都是注入入口。

能外泄:对话历史、检索到的私有数据、提示词里的凭据、其他工具刚拿到的数据。

边界:本条讲「经行动通道外泄」;「被动被套出」(纯问答、我没有行动能力)是《上下文面隐私》;「检索把不该取的取进来」是《RAG 检索泄露》——常接力:检索把私有数据取进我的上下文、注入再把它发出去。

防护原理

外泄要同时满足两个条件:(a) 我读到不可信内容(b) 我有外联能力。打掉任一条都能断链,所以防护落在架构层:

  • 工具最小权限:只授必需的工具;能外联的工具尤其收紧、能力可审计。
  • 出站受控:禁任意 URL / 任意收件人,只允许 allowlist;高危动作(发邮件、外发数据)要人确认
  • 隔离不可信内容:把检索 / 网页 / 文件 / 工具返回标为不可信,不让它能直接触发动作。
  • 渲染面收口:markdown 图片 / 链接的自动外联是经典 exfil——默认禁止自动获取外部资源

点破:「加一条系统提示让模型别听注入」并不可靠——指令与数据同通道,模型分不清;真正的边界要加在工具 / 出站层这种模型够不到、能硬性拦截的地方(OWASP 同样强调注入难以靠模型自身根除)。

落地实现(配方)

1. 工具最小权限:只授当前任务必需的工具;外联类工具按需开、可审计、可关。
2. 出站 allowlist + 人确认:禁任意 URL / 收件人;只放行白名单目的地;发邮件 /
外发数据 / 调外部 API 等高危动作要人确认。
3. 隔离不可信内容:检索 / 网页 / 文件 / 工具返回一律标为不可信,不得直接触发工具
调用(把"内容能不能驱动动作"做成显式策略)。
4. 渲染面收口:默认禁止 markdown 图片 / 链接自动取外部资源(经典 exfil 通道)。
5. 间接注入红队:构造"私有数据 + 藏外泄指令的不可信内容",对每个外联工具测我会不会
照做,纳入发布前 eval 与回归。

每一步绑定你的工具清单与数据敏感面——「哪些工具能外联、哪些上下文算私有」不画清,allowlist 与红队都无从设计。

最小可测试断言(把外泄收成可回归的检查):

  • 怎么测:对每个外联工具跑间接注入红队——把外泄指令藏进我会读到的不可信内容里,上下文放真实私有数据,看私有数据会不会被外发。
  • 通过:注入之下零外发——出站被 allowlist / 人确认拦住;工具最小权限;不可信内容不能直接触发外联。
  • 失败:注入即外发、任意 URL / 收件人可达、或根本没有出站管控 → 别给这个 agent 接外联工具,先把出站层补硬。

真实案例 / 研究进展(工程可行性)

(本条 maturity 标「研究」:注入外泄已在多个真实产品上发生、各家也都打了补丁,但鲁棒防御仍是开放问题——补丁堵的是已知通道,不是根因。下面先给业界已公开的真实事故与厂商怎么补,再给机制背书。)

真实事故 / 业界怎么补(同一类机制,连环在主流产品上被打穿;各家的补丁恰好落在本条「防护原理」说的渲染面 / 出站层):

  • Microsoft 365 Copilot —— EchoLeak(CVE-2025-32711,CVSS 9.3):Aim Labs 2025-06 披露的零点击外泄——攻击者只需发一封藏了注入指令的邮件,Copilot 的 RAG 把它取进上下文后照做,把内部数据编码进外链送出。链条里连环绕过了 Microsoft 的 XPIA(跨提示注入)分类器、链接移除(link redaction)、CSP,并借一个被 CSP 放行的 Teams 代理出站。Microsoft 服务端修复(MSRC 标信息披露漏洞;据公开报道未见在野利用)。它印证:靠分类器 / 系统提示拦注入会被绕,真正的闸门要落在出站与渲染面。
  • GitHub Copilot Chat —— CamoLeak(CVE-2025-59145,CVSS 9.6):Legit Security(Omer Mayraz)2025-10 披露——把注入指令藏进 PR 里 GitHub 的「隐形」markdown 注释,诱使 Copilot 把私有仓库的源码 / 密钥逐字符编码成一串预生成的 Camo 图片代理 URL(每个字符一个合法签名 URL、各返回 1×1 像素),因走 GitHub 自家可信代理而绕过 CSP 与常规出站管控。GitHub 的补丁是在 Copilot Chat 里关掉图片渲染、禁用 Camo 代理渲染聊天内容(2025-08-14)。
  • Slack AI(PromptArmor,2024-08):只要能在任意公开频道发帖,攻击者就能种下注入指令;当某个有私有频道权限的用户用 Slack AI 提问 / 摘要时,模型照做,把私有频道内容编码进一条可点击链接外泄。Slack 随后发补丁修复(称未见客户数据被未授权访问)。
  • Google Bard(Johann Rehberger / rez0 / Greshake,2023-11):Bard Extensions 上线不到一天即被演示——经 Extensions 读到的不可信数据里藏注入,把用户聊天记录编码进图片 URL 外泄;为绕过 CSP,借 Google Apps Script 把数据导到攻击者可读的 Google 文档。Google 一个月内确认修复(据披露未改 CSP,而是对 URL 里塞数据做了过滤)。
  • ChatGPT 的 markdown 图片外泄与 OpenAI 的缓解:经典手法是让模型把私有数据编码进 markdown 图片 URL、客户端自动加载即外泄。OpenAI 2023-12 起加 url_safe(展示前校验 URL、判不安全就剔除),后续部署 Safe URL。Rehberger(Embrace The Red)记录:缓解降低但未根除——「每个字符用一个独立 URL」等旁路在论文里仍被点名可绕。它正说明指令级 / 单点过滤是降风险、非绝对边界

跨案例的共同补法(各家被打穿后趋同的,正是本条配方那几条):CSP / 图片域名 allowlist、URL / 链接 allowlist、关闭或沙箱化 markdown 自动取外部资源、对外发动作上人确认。共同的反面教训:「加一条系统提示叫模型别外泄」与「上一个注入分类器」都被实证绕过——指令与数据同通道,硬边界必须落在模型够不到的渲染 / 出站层。

机制背书

  • 间接提示注入(机制源):Greshake 等(ACM AISec 2023)系统提出间接提示注入——把指令注入到会被模型检索 / 读取的数据里,从而远程操纵 LLM 集成应用,演示了数据窃取等危害。上面那串产品事故,正是这一机制在生产里反复兑现。
  • 框架定性:OWASP LLM01:2025 提示注入连续两版居 Top 10 之首,根因正是「指令与数据同通道、模型分不清」;LLM02:2025 敏感信息披露把「基于提示的客户记录外泄」明确列为危害之一。两者合起来正是本条的攻击链。
  • (本书「AI 编码误区」主题另有针对编码 agent 的具体 exfil 案例与机制;本条从隐私角度讲通用外泄机制,不重复其工具专属细节。)

残余风险与权衡

逐条点破假安全:

  • 指令式与分类器式防御都不可靠。 指令与数据同通道,「叫模型别听注入」常被绕过;连专门拦注入的分类器也会被绕——EchoLeak 实证连环绕过了 Microsoft 的 XPIA 注入分类器。硬约束要加在工具 / 出站层。
  • allowlist / 人确认增摩擦、也可能被绕。 开放重定向、被信任域被滥用、确认疲劳都会留缝——CamoLeak 正是借 GitHub 自家被信任的 Camo 图片代理出站、绕过了 CSP。它们降风险、不给绝对边界。
  • 出站 / URL 过滤是降风险、非根除。 OpenAI 的 url_safe / Safe URL 拦掉了多数外泄 URL,但 Rehberger 记录「每字符一个独立 URL」等旁路仍被点名可绕——单点过滤要按纵深防御的一层看,别当终点。
  • 多工具组合放大风险。 一个工具负责「读到私有数据」、另一个负责「发出去」,单看都无害,组合即外泄通道。
  • 鲁棒防御未解。 提示注入至今没有「一招根除」;要按纵深防御 + 持续红队对待,不是配一次就完。

与相邻技术的区别

  • Agent 工具外泄 vs 上下文面隐私(卷三):那条是被动被套出(纯问答、我没有行动能力,对手在拿我嘴里的话);本条是经工具主动外泄(我有出站能力、被注入劫持)。
  • Agent 工具外泄 vs RAG 检索泄露(本卷):那条是「不该取的取进来」(输入侧);本条是「私有数据发出去」(行动 / 输出侧)——方向相反,常接力:检索取进上下文、注入再外发。
  • Agent 工具外泄 vs 跨会话记忆串味(本卷):串味是存储隔离失效(被动错配);本条是行动通道被劫持(主动外送)。一个在存储层、一个在工具层。

版本说明

适用版本

「模型读不可信内容 + 有外联工具 = 私有数据可被经工具外泄」是与具体模型 / 框架无关的范式级结论(根因在于指令与数据同通道 + 模型可行动)。具体哪种注入有效、哪种出站管控够用,随模型、框架、工具实现持续演进;提示注入的鲁棒防御截至本段打戳(2026-06)仍是开放问题,引用任何「已防住」结论前请核最新研究与你自己的红队结果。(出处核验于 2026-06。)

延伸阅读与出处

主要:安全报告(真实产品上的注入外泄事故 + 厂商修复);补充:研究支持(间接注入机制)与框架(OWASP LLM01/LLM02)。

真实事故 / 厂商修复(本条头条证据):

机制与框架(背书):