A mí me costó procesar lo que pasó con EchoLeak. No la parte técnica —
esa la entiendes leyendo el writeup de Aim Labs. Lo que me costó fue aceptar
que un atacante podía mandarte un correo, tú no hacías nada con él, y aún así
Copilot terminaba filtrándole datos de tu Outlook y tu Graph al de afuera. Cero
clics. Cero interacción. El correo llegaba, Copilot lo procesaba en algún
momento mientras hacías otra consulta, y ya estaba.
CVE-2025-32711, CVSS 9.3. Microsoft lo parcheó server-side rapidito y sin
advisory ruidosa. Lo cual me parece bien y me parece mal a la vez. Bien porque
la mitigación tiene que ser inmediata. Mal porque sospecho que muchos equipos
de seguridad ni se enteraron de la magnitud hasta que los investigadores
publicaron el detalle en arXiv unos meses después.
Lo que más me marcó del writeup es la elegancia del exploit. No es un
bug. Es una cadena.
Primero, evade el clasificador XPIA (Cross Prompt Injection Attempt)
usando lenguaje que no se ve como instrucción adversaria. Después esquiva la
redacción de enlaces con Markdown reference-style (en lugar de poner el enlace
con el dato sensible directo, lo separa en una referencia). Después usa
imágenes que se auto-fetchean — el simple acto de cargar la imagen ya filtra el
dato porque la URL lleva la información. Y el cierre de oro: abusa de un proxy
de Teams que está permitido por la Content Security Policy. Filtración limpia.
Lo bauticé en mi cabeza como “el vector que demuestra que la CSP de tu
app no es suficiente cuando metes un LLM en medio”. Porque eso es lo que es. La
CSP estaba bien para una app tradicional. Para una app que tiene un agente que
decide a qué dominio se conecta, la CSP es solo el principio.
Qué hago yo distinto desde EchoLeak
Lo primero, asumo que cualquier dato no estructurado que Copilot toque es
input no confiable. No solo correos de fuera. También documentos compartidos
por terceros, también notas pegadas de quién sabe dónde. Eso ya cambia cómo
configuro las políticas de DLP.
Segundo, miro con otros ojos las funcionalidades de “auto-summarize”.
Cualquier cosa donde Copilot procese contenido sin que yo le pida
explícitamente que lo haga es vector. Es ahí donde EchoLeak metió la cuchilla.
Tercero, y esto es opinión: creo que Microsoft tardó en sacar
Spotlighting. Lo anunciaron en Build 2025, pero la categoría de ataque ya se
conocía. Spotlighting marca el origen del input para que el modelo distinga
“esto me lo dijo el usuario” de “esto venía dentro de un documento”. Era un
control que necesitábamos antes, no después.
Para mi equipo hicimos tres cosas concretas las semanas siguientes.
Auditamos qué buzones tienen reglas de auto-procesado que terminen llegando a
Copilot — apagamos varias. Forzamos sensitivity labels en todo lo que viene de
invitados externos: si entra etiquetado como external, Copilot no lo procesa. Y
activamos logging completo de prompts en Purview, aunque pesa un montón. Sin
auditoría no hay forensia.
Lo último — y esto es lo que me sigue rondando — es que EchoLeak no fue
un fallo en un modelo grande. Fue un fallo en cómo Microsoft pegó el modelo al
resto del stack: identidades, permisos, cargas de URL, parsers de Markdown. La
superficie de ataque del Copilot empresarial no es el LLM. Es la conexión del
LLM con todo lo demás.
El día que entendí eso fue el día que dejé de ver a Copilot como un
producto y empecé a verlo como una integración compleja. Y las integraciones
complejas se rompen en las costuras.