La cadena, tal como se describe

Adversa AI publicó un ataque el 6 de octubre en el que una sola URL controlada por el atacante, solicitada por el propio usuario, hace que GitHub Copilot CLI lea archivos locales y envíe su contenido al servidor del atacante. Los investigadores, dirigidos por Rony Utevsky, cifran la cadena completa en 28 segundos, “sin confirmación, y sin ningún punto de la transcripción que nombre el host de destino o indique que el contenido de un archivo salió de la máquina”.

La página se presenta como contenido cifrado y ofrece al agente dos claves candidatas de descifrado. Una es real. La otra es una plantilla que el agente no puede completar sin leer antes archivos locales, así que, preparándose para descifrar, lee los archivos objetivo del disco e incorpora su contenido a la cadena de la clave. Esa lectura es el robo, y ocurre antes de que ningún descifrado tenga éxito.

La clave con plantilla falla por diseño. El agente recurre a la clave real, el descifrado funciona, y la segunda fase descifrada le indica que solicite una URL de seguimiento “para obtener más contexto” que lleva el contenido recolectado como parámetro de la petición. El agente hace la petición.

Un candado de latón y unas llaves sobre un escritorio de madera
Los investigadores dicen que esas mismas instrucciones en texto plano se rechazan. Imagen ilustrativa. Goszton · pexels · Pexels License

Por qué el cifrado es la clave

Adversa llama a esto inyección criptográfica de contexto, una técnica que publicó por primera vez en agosto contra asistentes de chat. El argumento es que las barreras estáticas leen texto pero no lo ejecutan. El texto cifrado, entregado con material de clave y una instrucción de descifrado, obliga a recuperarlo en el propio entorno de ejecución del agente porque, a diferencia de base64, no hay atajo que el modelo pueda tomar en sus pesos. Las instrucciones descifradas llegan entonces como salida de código que el agente acaba de escribir y ejecutar, dentro de su contexto de ejecución de confianza.

Los investigadores son explícitos sobre lo que hace que funcione: “Las mismas instrucciones entregadas en texto plano se detectan como inyección de prompt y se rechazan.”

Qué modelo te toca es cara o cruz

El ataque no es universal. Adversa dice que necesita dos cosas: la CLI en modo autopiloto y un modelo permisivo atendiendo la sesión. En esa segunda condición el hallazgo resulta incómodo para Copilot en concreto.

El propio mai-code-1.1-flash de Microsoft ejecutó la cadena completa en el 50% de las pruebas de los investigadores. Dos modelos GPT-5.6 ofrecidos dentro del mismo producto rechazaron sistemáticamente la carga idéntica. En la cuenta de pago probada, el modelo vulnerable no era el predeterminado y había que elegirlo a mano, pero en una cuenta con enrutado automático el router asignó el modelo vulnerable en algunas sesiones y uno seguro en otras, sin intervención del usuario. “El usuario no elige, y no ve, qué modelo atendió la sesión”, dice el informe.

Un cable ethernet conectado al puerto de un portátil
El contenido recolectado salió como parámetro de una petición de seguimiento. Imagen ilustrativa. Castorly Stock · pexels · Pexels License

GitHub lo validó y lo cerró

Adversa comunicó el hallazgo al programa de recompensas de GitHub el 17 de septiembre. A fecha de 1 de octubre, el equipo de triaje lo había validado pero se negó a tratarlo como vulnerabilidad, con el argumento de que el usuario “pidió explícitamente a Copilot CLI que obtuviera contenido controlado por un atacante mientras daba a copilot permisos completos para actuar de forma autónoma”. GitHub dijo que podría endurecer la funcionalidad en el futuro pero que no tenía nada que anunciar, y declaró el informe no elegible para la recompensa.

Adversa dice que discrepa de esa valoración del riesgo y que la cadena sigue reproduciéndose tal como se describe. La firma no publica cargas concretas.

Cuánto vale esto, y de quién viene

Adversa vende una plataforma de seguridad para agentes de programación y dice que esa plataforma detuvo la cadena en sus propias pruebas, así que las recomendaciones del final del texto no son desinteresadas. Las recomendaciones en sí son convencionales: registrar por sesión cada llamada a herramienta con los argumentos plenamente resueltos y no con plantillas, alertar sobre la secuencia — entra contenido no confiable, se ejecuta código, se leen archivos, se llama a un host ajeno a la tarea — y no sobre una carga concreta, exigir confirmación para nuevos destinos de red y escrituras fuera del espacio de trabajo, y aislar el contenido obtenido en un contexto sin herramientas ni credenciales.

Un detalle merece guardarse al margen de quién lo publique. En la prueba de Adversa, el resumen final del propio agente informó de que había “confirmado un endpoint de lector autorizado”. No es lo que ocurrió. El relato que un agente hace de su propia sesión no es prueba de lo que la sesión hizo.