FlawOpen

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

● CVE-2025-32711 · CVSS 9.3 · Crítica
Investigación · FlawOpen

EchoLeak en Copilot: CVE-2025-32711

CVE-2025-32711 permitía inyectar instrucciones en Copilot por correo, sin clic. Microsoft corrigió el servicio; el cliente no debe aplicar parches.[2], [3]

💡 Explicación en Lenguaje Sencillo (ELI5)

Imagina un asistente que resume cartas y un sistema de vista previa que carga automáticamente las imágenes de su respuesta. Una carta maliciosa engaña al asistente para que incluya en una imagen una referencia a un dato privado; la vista previa sigue esa referencia sin que nadie haga clic. EchoLeak cruzó el límite entre el correo no confiable, la respuesta del asistente y una solicitud externa automática. La defensa consiste en impedir que contenido no confiable autorice solicitudes y comprobar cada vista previa en una política independiente.[3], [4]

Conceptos Clave y Términos

Inyección indirecta de prompts
Instrucciones dentro de datos leídos por una IA que intentan desviarla de la tarea del usuario.[4], [3]
CWE-74: Inyección
CWE-74: Inyección. El registro CVE de Microsoft indica esta clasificación y CVSS 3.1 de 9,3 Crítico. NVD muestra por separado su propia valoración de 7,5 Alto; son evaluaciones distintas, no una discrepancia sobre el identificador de la vulnerabilidad.[2], [5]
Ruta de origen a destino
Ruta auditable entre contenido no confiable, procesamiento del modelo y canal de acción o divulgación.[3]
Microsoft 365 Copilot
Asistente de trabajo de Microsoft que utiliza el contexto de Microsoft 365 permitido.[1]
Mínimo privilegio
Dar a una identidad o herramienta solo el acceso necesario para la tarea actual.[4]

Mapeos de marcos

Flujo de Ataque Paso a Paso

Paso 1

Correo no confiable entra al contexto

Según el estudio publicado, Copilot debía procesar o recuperar el correo controlado por el atacante durante el uso normal. La entrega por sí sola no activaba la cadena; no hacía falta abrir el correo ni hacer clic.[3], [6]

Paso 2

El contenido compite con la tarea

Los investigadores informan que el contenido inyectado evadía el clasificador XPIA de Copilot y que Markdown con formato de referencia eludía la eliminación de enlaces externos en la respuesta generada.[3], [6]

Paso 3

Los datos autorizados son alcanzables

La respuesta podía incluir información ya accesible para la víctima en una referencia a una imagen remota. El cliente obtenía la imagen automáticamente, sin necesidad de hacer clic.[3], [6]

Paso 4

La salida es la frontera decisiva

El artículo indica que un servicio de vista previa de Microsoft Teams permitido por la CSP obtenía el destino externo de la imagen y cruzaba el límite de contenido previsto. Microsoft publicó una corrección del lado del servidor; su guía indica que el cliente no debe realizar ninguna acción.[3], [1], [2], [6]

Código Fuente: Vulnerable vs. Seguro

Modelo didáctico de FlawOpen, no es código fuente ni parche de Microsoft. La rama vulnerable representa un renderizador que carga automáticamente una referencia elegida por el modelo. La rama defensiva solo acepta un ServerValidatedPreview creado por un resolvedor confiable del servidor, comprueba la política de destino controlada por el servidor y la clasificación no privada, y pide a una política de aprobación confiable que valide la aprobación vinculada a la respuesta y al destino exactos. Son precondiciones explícitas: los tipos de Python por sí solos no hacen que un valor sea confiable; en producción, el código controlado por el servidor debe hacer cumplir los límites del resolvedor y de la política. El código no realiza solicitudes de red ni reproduce el payload o la implementación interna de EchoLeak. La aprobación también queda vinculada a la clasificación de los datos.[3], [4]

IMPLEMENTACIÓN VULNERABLE
# MODELO ABSTRACTO DE RIESGO: modela una decisión de vista previa automática; no realiza solicitudes de red.
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
PARCHE SEGURO Y ROBUSTO
# MODELO ABSTRACTO DE RIESGO: modela una decisión de vista previa automática; no realiza solicitudes de red.
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

# PRECONDICION: solo codigo confiable del servidor crea este valor validado.
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
    )

Lista de Verificación de Seguridad para Ingeniería

Fuentes

← AI Security Directory →