跳到主要内容

致命三要素:为什么你的 AI Agent 距离数据泄露仅隔一封邮件

· 阅读需 10 分钟
Tian Pan
Software Engineer

2025 年 6 月,一名研究员向一位 Microsoft 365 Copilot 用户发送了一封精心编写的邮件。没有点击链接。没有打开附件。邮件送达后,Copilot 在执行例行的总结任务时读取了它,短短几秒钟内,AI 便开始从 OneDrive、SharePoint 和 Teams 中外泄文件——通过将数据编码进它请求“渲染”的图片 URL 中,悄无声息地将内容传输到了攻击者控制的服务器上。受害者对此一无所知。

从传统意义上讲,这并不是一个新奇的零日漏洞(Zero-day)。没有缓冲区溢出,也没有 SQL 注入。该漏洞是架构性的:系统结合了三种能力,这些能力单独看起来像是理所应当的产品功能。但结合在一起,它们就构成了现在所谓的“致命三要素”(Lethal Trifecta)。

足以致命的三种能力

“致命三要素”描述了 Agent 能力的一种特定组合,它创造了灾难性的攻击面:

  1. 访问私有数据 —— Agent 可以检索敏感信息:凭据、源代码、财务记录、用户数据、内部文档。
  2. 接触不可信内容 —— Agent 读取或处理来自外部世界的内容:电子邮件、网页、用户上传的文档、GitHub issue、支持工单。
  3. 具备外部通信能力 —— Agent 可以将数据发送出去:通过 HTTP 请求、电子邮件、Slack 消息、API 调用,甚至是请求图片 URL。

只要剥离这三者中的任何一个,攻击就会失败。保留全部三个,你就等于把最敏感系统的钥匙交给了攻击者——而且他们不需要编写一行漏洞利用代码。

EchoLeak 攻击(CVE-2025-32711,CVSS 9.3)是这种攻击在生产环境中最清晰的展示。微软的 Copilot 具备这全部三个支柱:它可以访问跨 M365 服务的组织数据,它在工作中消耗不可信的邮件内容,并且它可以通过图片渲染触发外部请求。该攻击绕过了微软的跨提示词注入分类器(Cross-prompt injection classifier)、内容安全策略(Content Security Policy)以及外部链接脱敏。它在 2025 年 5 月被悄悄修复——此时距离可用的概念验证(PoC)存在已经好几个月了。

为什么 LLM 无法区分指令和数据

要理解为什么这个问题如此难以修复,你需要理解根本的架构问题:LLM 没有特权指令通道。

当人类阅读一份文档时,他们知道作者的话与经理的命令之间的区别。而当 LLM 处理文本时,所有内容——系统提示词(System Prompt)、用户消息、工具输出、文档内容、网页文本——都会被连接成一个单一的 Token 序列,并送入同一个注意力机制中。这里没有“合法指令”的加密签名。在“这是数据”和“这是命令”之间没有语义防火墙。

如果攻击者能将文本注入模型的上下文窗口,通过恰当的措辞,就能让该文本看起来与合法的用户指令无异。提示词注入(Prompt Injection)直接利用了这一点:将载荷隐藏在 Agent 被合法要求处理的内容中,Agent 就可能会执行它。

这并不是一个在下一个模型版本中就能修复的 Bug。这是 Transformer 工作原理的一种特性。模型解释 Token。一个写着“忽略之前的指令”的 Token,其权重并不比系统提示词中的 Token 低——除非你构建了架构屏障,从根本上阻止该 Token 接触到模型。

攻击链的具体流程

了解序列能让问题变得具体。以下是一个典型的“致命三要素”利用过程:

第一阶段:投递(Delivery)。 攻击者构建包含隐藏指令的内容——在 Word 文档、邮件正文、GitHub issue 或要求 Agent 总结的网页中。指令可能是白色背景上的白色文字,嵌入在元数据中,或者仅仅因为格式看起来很可信而受到模型的信任。

第二阶段:摄入(Ingestion)。 AI Agent 在履行职责时处理这些内容。恶意指令与合法内容一起进入上下文窗口。

第三阶段:执行(Execution)。 模型无法区分合法命令和注入命令,开始执行攻击者的指令。它访问它有权读取的数据,然后将该数据格式化以便外泄——可能作为 URL 参数、构造的搜索查询,或是待发送消息中的内容。

第四阶段:外泄(Exfiltration)。 Agent 利用其合法的通信渠道传输数据。EchoLeak 利用了图片 URL 请求。其他攻击则利用了邮件草稿、搜索查询或 Webhook 调用。数据通过系统设计中原本就处于开启状态的门流出。

这里没有利用任何代码漏洞。Agent 做的正是它被授权做的事情——只是意图发生了改变。

遭受过攻击的真实系统

这种模式已出现在行业内的各种生产系统中:

Microsoft 365 Copilot (EchoLeak): 通过精心构造的邮件进行的零点击(Zero-click)攻击。Agent 通过隐藏的图片请求外泄了 SharePoint 文件、Teams 消息和聊天记录。在 1 月份私下披露后,于 2025 年 5 月修复。

GitHub 的 MCP 服务器: 研究人员证明,代码库 issue 中的恶意内容可以引导连接了 MCP 的 Agent 访问并泄露其有权访问的私有代码库中的代码或机密信息。

GitLab Duo: GitLab 的 AI 助手被证明容易受到嵌入在合并请求(MR)描述和 issue 评论中的指令的影响——而这些正是该助手经常处理的内容。

Slack AI: 在公共频道消息中注入的指令,可能会在 Slack AI 处理这些内容供具有更广泛访问权限的用户总结时,影响其行为。

共同的主线是:每个系统的设计初衷都是为了提供帮助。而为了提供帮助,就必须读取外部内容。读取外部内容则创造了攻击面。

打破三要素:架构层面的防御

安全团队通常默认采用“添加护栏”的方法——即使用一个分类器来检测输入内容中的提示词注入(prompt injection)尝试。这种方法在实践中效果并不理想。注入攻击载荷可以被混淆、拆分到不同的分块中,或者嵌入到分类器无法检查的格式里。分类器会增加延迟和误报。而且,它们是在内容到达模型之前进行处理的,而不是针对模型之后的行为进行控制。

更可靠的方法是通过系统设计来消除“三要素”中的至少一环。

最小化数据访问范围。 积极应用最小特权原则。一个负责总结电子邮件的智能体(Agent)不需要源代码库的读取权限。一个协助处理客服工单的智能体不需要内部管理工具的凭据。你授予的每一项数据访问权限都是攻击面。只授予特定任务所需的权限,而不是那些将来可能派上用场的权限。

隔离不可信内容的处理。 “先规划后执行”(Plan-Then-Execute)模式在引入任何不可信内容之前,先运行一个规划阶段——智能体在此阶段仅根据用户的请求决定要做什么。规划随后被锁定。然后,一个独立的执行阶段使用不可信内容来执行该规划,但无法更改已确定的操作。注入的内容无法重定向规划,因为规划已经最终确定。

在内容处理阶段切断外部通信。 如果你的智能体必须读取不可信文档且必须访问敏感数据,那么至少要阻止它在那个阶段发起外部请求。一个只读分析阶段,后接人工审核阶段,再后接写入/发送阶段,即使前两个要素存在,也能打破攻击链。

双 LLM 模式(Dual LLM pattern) 则更进一步:将不可信内容路由到一个无法访问私有数据或没有通信能力的沙箱模型中。只有来自该模型的经过清理的结构化输出,才会流向具有权限的智能体。有权限的智能体永远接触不到原始的不可信内容。

对智能体进程进行容器化和网络限制。 在带有明确网络白名单的容器中运行智能体代码。如果智能体只需要与你的 API 和一个第三方服务通信,请在网络层封锁其他所有连接。如果容器无法访问攻击者的服务器,那么旨在向其外泄数据的注入指令就会失败。

人工监督层

上述任何架构模式都不是万无一失的。它们是纵深防御,而非绝对保证。对于高风险操作——任何涉及生产数据写入、电子邮件发送、金融交易或访问敏感凭据的操作——执行前的人工审核依然至关重要。

这意味着在设计智能体时,要为重大操作设置明确的“人工参与”(human-in-the-loop)检查点,将其作为核心架构组件,而非事后补救。智能体展示规划和所需的数据访问权限;人工在执行任何操作前予以批准。这极大地限制了注入成功后的“爆炸半径”:攻击者可以控制智能体提议的内容,但无法控制哪些提议会被批准。

更小、更频繁的检查点也能限制单个受损步骤造成的损害。一个采取 10 个经过审核的小步骤的智能体,比一个端到端自主执行 50 步规划的智能体更难被利用。

这对当今构建智能体的团队意味着什么

如今大多数构建 AI 智能体的团队都专注于能力:智能体能做什么、准确度如何、响应有多快。安全往往被视为事后才考虑的事情,或者是在发布前才解决的问题。

这种先后顺序是颠倒的。“致命三要素”表明,能力即攻击面。你添加的每一个新集成、连接的每一个数据源、启用的每一个通信渠道,都是三要素中潜在的一环。这些决策在设计阶段就需要进行安全评估,而不是在发生类似 EchoLeak 的事件被迫处理时才进行。

设计任何智能体功能时的清单都很简单,但经常被忽略:

  • 该智能体是否访问敏感数据?
  • 该智能体是否处理来自信任边界之外的内容?
  • 该智能体是否具有对外通信能力?

如果你勾选了以上全部三项,请停下来。在构建之前重新进行设计。该功能或许仍然可行——但它需要明确的架构缓解措施,而不是所谓的“以后再添加护栏”。

目前智能体 AI 中最危险的假设是:有用的功能默认就是安全的。事实并非如此。一个能阅读你的邮件、访问你的文件并代表你发送消息的智能体是一个极其强大的系统——而这恰恰是攻击者正在学习利用的系统,他们只需一次一个地利用精心制作的文档即可。

References:Let's stay in touch and Follow me for more thoughts and updates