flawopen.com/AI Security/microsoft-365-copilot-echoleak-prompt-injection-may-2025
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]
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ónCWE-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
- Referencia CWE para la debilidad descrita en esta guía: CWE-74
- OWASP GenAI 2025 — LLM01:2025 Inyección de prompts
- OWASP GenAI 2025 — LLM02:2025 Divulgación de información sensible
Flujo de Ataque Paso a Paso
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]
# 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
# 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
- ✓Añada una prueba de integración del renderizador que demuestre que no se carga automáticamente un recurso externo procedente de un correo recuperado, aunque el modelo lo incluya en su respuesta.[4]
- ✓Añada una prueba unitaria de la política que compruebe que se deniega un recurso sin un identificador de destino controlado por el servidor y procedencia confiable antes de que cualquier servicio de vista previa pueda obtenerlo.[4]
- ✓Vincule cualquier aprobación excepcional al ID inmutable de respuesta, al ID de destino y a la clasificación de datos; pruebe que cambiar cualquiera de esos campos invalida la aprobación.[4]
- ✓Registre el ID de respuesta, el ID del recurso, la categoría de procedencia, la decisión de política y la clase de destino; compruebe que los registros no contienen el correo, el prompt ni datos privados de la respuesta.[4]
- ✓Para EchoLeak, Microsoft indica que la corrección del servicio ya está aplicada y que el cliente no debe actuar. Para otros agentes de IA, revise avisos del proveedor y aplique mínimo privilegio, aprobación de acciones de alto riesgo y pruebas adversariales.[2], [1]
Fuentes
- Microsoft Security Insider — AI application security considerations for organizations
- Microsoft Security Response Center — CVE-2025-32711
- AAAI case study — EchoLeak zero-click prompt-injection chain
- OWASP Top 10 for LLM Applications — Prompt Injection
- NVD — CVE-2025-32711 (NVD enrichment and CNA data)
- Aim Security / Aim Labs — original EchoLeak disclosure