FlawOpen

flawopen.com/AI Security/microsoft-365-copilot-echoleak-prompt-injection-may-2025

● CVE-2025-32711 · CVSS 9.3 · 严重
安全研究 · FlawOpen

EchoLeak:Copilot 提示注入(CVE-2025-32711)

CVE-2025-32711 展示了构造邮件如何在无需点击时向 Copilot 注入提示。微软已在服务端修复,客户无需操作。[2], [3]

💡 通俗易懂的原理解析 (ELI5)

想象一个助手负责总结邮件,而预览系统会自动加载回答中的图片。恶意邮件诱使助手在图片引用中放入私密信息的引用;预览系统会在无人点击的情况下跟随该引用。EchoLeak 跨越了不可信邮件、助手回答和自动外部请求之间的边界。防护措施是禁止不可信内容授权请求,并通过独立策略检查每个预览请求。[3], [4]

核心概念与专有名词

间接提示注入
嵌在 AI 所读取数据中的指令,试图使其偏离用户任务。[4], [3]
CWE-74:注入
CWE-74:注入。Microsoft 的 CVE 记录列出此分类和 CVSS 3.1 9.3 Critical。NVD 单独给出其 7.5 High 评估;这是不同机构的评估,并非漏洞编号存在冲突。[2], [5]
来源到出口路径
从不可信内容、模型处理到动作或披露渠道的可审计路径。[3]
Microsoft 365 Copilot
使用获准 Microsoft 365 上下文的 Microsoft 工作助手。[1]
最小权限
仅向身份或工具授予完成当前任务所需的访问权限。[4]

框架映射

攻击执行流程分解

步骤 1

不可信邮件进入上下文

据已发表的案例研究,Copilot 必须在正常使用期间处理或检索攻击者控制的邮件。仅送达邮件不会触发攻击链;用户无需打开邮件或点击任何内容。[3], [6]

步骤 2

内容与任务竞争

研究人员称,注入内容绕过了 Copilot 的 XPIA 分类器;生成答案中的引用式 Markdown 也绕过了外部链接清理。[3], [6]

步骤 3

获准数据变得可访问

答案可能把受害者本来就有权访问的信息放入远程图片引用。客户端会自动获取图片,无需用户点击。[3], [6]

步骤 4

输出是决定性边界

论文称,CSP 允许的 Microsoft Teams 预览服务获取了图片的外部目标,越过了原定的内容边界。Microsoft 后来发布了服务器端修复;其指南称客户无需采取行动。[3], [1], [2], [6]

源代码对比:漏洞与安全实现

这是 FlawOpen 教学模型,不是 Microsoft 源代码或补丁。易受影响的分支模拟渲染器自动加载模型选定的引用。防御分支只接受由可信服务器端解析器创建的 ServerValidatedPreview,检查服务器控制的目标策略和非私密数据分类,并要求可信审批策略验证与具体回答和目标绑定的审批。这些是明确前提:Python 类型本身不会让值变得可信,因此生产环境必须由服务器控制的代码强制执行解析器和策略边界。代码不会发送网络请求,也不会复现 EchoLeak 的载荷或内部实现。 审批还会绑定到数据分类。[3], [4]

存在漏洞的实现
# 抽象风险模型:模拟自动预览决策;不会发送网络请求。
from dataclasses import dataclass

@dataclass(frozen=True)
class PreviewRequest:
    response_id: str
    destination_id: str
    provenance: str
    contains_private_data: bool

def vulnerable_preview_decision(request):
    return True
加固后的安全修复
# 抽象风险模型:模拟自动预览决策;不会发送网络请求。
from dataclasses import dataclass

@dataclass(frozen=True)
class ServerValidatedPreview:
    response_id: str
    destination_id: str
    provenance: str
    data_classification: str

class ServerPolicy:
    def destination_is_allowed(self, destination_id):
        raise NotImplementedError

    def verifies_exact_approval(self, approval, *, response_id, destination_id, data_classification):
        raise NotImplementedError

# 前提:只有可信服务器代码可以创建此已验证值。
def authorize_preview(request: ServerValidatedPreview, approval, server_policy):
    if request.provenance != 'trusted-catalog' or request.data_classification != 'public':
        return False
    if not server_policy.destination_is_allowed(request.destination_id):
        return False
    return server_policy.verifies_exact_approval(
        approval, response_id=request.response_id, destination_id=request.destination_id,
        data_classification=request.data_classification
    )

工程与系统安全加固清单

参考来源

← AI Security Directory →