Un agente autónomo de seguridad encontró y explotó en cinco días un fallo crítico en el repositorio de Snowflake que GitHub Copilot había revisado y dado por bueno. Lo cuenta Wiz Research en un informe publicado el 17 de agosto. Bastaba con abrir una issue en GitHub con el título adecuado.
Puntos clave
- El fallo estaba en jira_issue.yml, un workflow de GitHub Actions que metía el título de la issue directo en un comando de shell.
- Lo introdujo el PR #1218, "Update jira workflows", que sustituyó un patrón seguro por uno vulnerable.
- GitHub confirma que Copilot fue coautor, revisó el cambio y lo marcó como correcto sin ver las vulnerabilidades críticas.
- Las credenciales robadas daban acceso de lectura al Jira interno de Snowflake, incluidos proyectos de ingeniería, cumplimiento y bug bounty.
- Snowflake parcheó el mismo día que Wiz lo notificó y revocó el token 24 horas después.
La cadena de fallos, paso a paso
El workflow tenía que crear una issue en Jira cada vez que se abría una en GitHub. Para eso cogía el título de la issue y lo metía dentro de un comando de shell. Sin escaparlo.
Eso significa que quien escribía el título escribía comandos en el servidor. Cualquiera, sin autenticarse en nada, porque abrir una issue en un repo público lo puede hacer todo el mundo.
Había una condición de protección en el workflow, un `if:` que debía limitar quién dispara la acción. Comprobaba `github.event.pull_request`, un campo que en un evento de tipo issue vale siempre nulo. La guarda estaba escrita, se ejecutaba y no filtraba a nadie.
El payload que usó el agente de Wiz cerraba el comando y lanzaba una petición con las credenciales de Jira codificadas. Con ellas se autenticó contra el Jira interno de Snowflake como `qa@snowflake.net`, con acceso de lectura a proyectos de ingeniería, de cumplimiento de seguridad y del programa de bug bounty.
Las dos IA de esta historia
El PR que introdujo el fallo lo revisó Copilot. La declaración de GitHub que recoge Wiz es literal: Copilot fue coautor, revisó el PR y el cambio, y lo identificó como correcto sin advertir las vulnerabilidades críticas.
En el otro lado, Red Agent es un agente autónomo de investigación de seguridad de Wiz que trabaja sin intervención humana. Escaneó la organización de GitHub de Snowflake, encontró el patrón vulnerable y montó el exploit solo. Cuando su primer intento falló por un error de sintaxis de bash, ajustó el payload por su cuenta y recibió la llamada de vuelta en segundos.
El fallo se publicó el 18 de junio. El agente lo encontró y lo explotó el 23. Cinco días desde que el código entra a producción hasta que un sistema automático lo está usando.
Snowflake parcheó el mismo 23 de junio y rotó credenciales, revocó el token el 24 y la divulgación pública llegó el 25 de julio, pasada la ventana de 30 días. La corrección fue volver al patrón seguro de siempre: pasar el título por una variable de entorno y parsearlo con `jq --arg`, en lugar de expandir la plantilla dentro del shell.
Por qué importa
La lección aquí no va de Snowflake ni de Copilot, va del hueco que ha aparecido en medio.
Los repasos automáticos de seguridad que tenías montados se diseñaron para código escrito por personas a ritmo de personas. Ahora el código lo propone un agente, lo revisa otro agente y entra a producción sin que nadie haya leído las cinco líneas del `if:`. Y del otro lado hay agentes escaneando repositorios públicos a tiempo completo. Ya vimos en agosto cómo los atacantes convencen a Claude Code, Codex y Cursor de trabajar para ellos; esto es la versión que no necesita convencer a nadie.
Tres cosas concretas si tu equipo usa agentes para programar. Los ficheros de CI/CD (`.github/workflows/`, pipelines, secretos) deben exigir revisión humana explícita aunque el resto del repo la tenga relajada, porque ahí es donde viven las credenciales. Cualquier dato que venga de fuera (títulos de issue, nombres de rama, mensajes de commit) va por variable de entorno, nunca interpolado en un comando. Y las guardas del tipo `if:` hay que probarlas con el evento real, porque una condición que siempre es falsa no da error, simplemente deja pasar a todo el mundo en silencio.
Relacionado


