jq${{ github.event.issue.title }}run:La diferencia era crítica. GitHub expande esa expresión antes de que el shell ejecute el comando. Por tanto, un título que incluyera una comilla simple podía cerrar la cadena prevista y añadir comandos elegidos por el atacante. El intento de limpiar el valor después mediante sed no podía deshacer una interpretación de shell que ya había ocurrido.
El disparador issues: opened tampoco convertía el título en un dato confiable. Cualquier usuario que pudiera abrir un issue en el repositorio público podía controlar su contenido. Además, una condición que limitara el flujo a eventos de tipo issue no impedía que los datos proporcionados por el atacante fueran interpolados en el shell.
El commit atribuyó a “Copilot Autofix powered by AI” la condición de coautor, y la revisión asistida por IA no señaló el problema. Sin embargo, la evidencia disponible no demuestra si Copilot generó el cambio inseguro o si simplemente participó en él y no detectó la inyección. La conclusión más precisa es que Copilot estuvo asociado al cambio y no identificó la vulnerabilidad; no que esté probada la autoría completa del modelo.
Wiz Red Agent analizó la organización pública de Snowflake en GitHub en busca de patrones de riesgo en sistemas de integración y entrega continuas, conocidos como CI/CD. El agente identificó que el flujo utilizaba datos no confiables dentro de un bloque run: y dedujo que un título de issue cuidadosamente diseñado podía provocar la ejecución arbitraria de comandos en el ejecutor administrado por GitHub Actions.
El 23 de junio, cinco días después de la fusión del cambio vulnerable, el agente abrió un issue manipulado como parte del programa de divulgación de vulnerabilidades de Snowflake en HackerOne. El título escapó de la cadena de shell y provocó que el flujo enviara las credenciales de Jira a un callback externo controlado para la prueba de concepto autorizada.
No se trató de una intrusión descontrolada, sino de una prueba de seguridad aprobada dentro de un programa de vulnerabilidades. El hallazgo técnico, no obstante, era real: la creación pública de un issue podía alcanzar un paso que manejaba credenciales internas y convertir una acción aparentemente rutinaria en ejecución de comandos.
El flujo comprometido tenía acceso a la configuración del Jira interno de Snowflake, incluida la URL, el correo del usuario y el token de API. El token recuperado estaba asociado a qa@snowflake.net; Wiz lo utilizó para autenticarse en el portal interno y evaluar el alcance potencial de la exposición.
Los informes describieron acceso de lectura a proyectos de Jira relacionados con ingeniería, cumplimiento de seguridad y actividad del programa de recompensas por errores. La evidencia proporcionada no establece el conjunto completo de permisos del token ni ofrece un inventario definitivo de todos los registros que podían consultarse. La conclusión respaldada por los datos es que permitía acceder a contenido interno sensible de Jira, no que otorgara acceso irrestricto a los sistemas de Snowflake.
El activo vulnerable era la automatización CI/CD del repositorio. No se informó de ninguna versión afectada del Snowflake Connector for .NET, ya que el problema estaba en el flujo de GitHub Actions y no en el código de ejecución del conector.
Wiz informó del problema el 23 de junio. Snowflake corrigió el flujo ese mismo día y rotó la credencial de Jira expuesta al día siguiente.
Después, Snowflake revisó sus registros de auditoría y concluyó que Wiz había sido el único actor durante el periodo de exposición. Wiz también afirmó que eliminó de forma segura los datos obtenidos durante la prueba de concepto.
No se informó de acceso no autorizado por parte de terceros, no se asignó un identificador CVE y no se identificó ninguna versión afectada del conector. Estos límites describen el impacto confirmado, pero no hacen seguro el diseño original: un título público de issue nunca debería haberse convertido directamente en parte de un comando de shell en un flujo que manejaba credenciales internas.
El caso deja una advertencia que va más allá de Snowflake y Copilot. Los títulos de issues y pull requests, los nombres de ramas, los comentarios y cualquier otra expresión de GitHub deben tratarse como entradas potencialmente hostiles cuando llegan a un comando de shell.
Entre las prácticas más seguras están:
run:.jq para construir JSON, en vez de ensamblar cadenas de shell.El episodio resume un nuevo reto de seguridad: un sistema de IA para programar puede pasar por alto un cambio peligroso en CI/CD, mientras un agente autónomo de seguridad ofensiva puede encontrarlo y validarlo pocos días después. La automatización puede acelerar tanto la explotación como la corrección, pero no sustituye una revisión independiente.
jq${{ github.event.issue.title }}run:La diferencia era crítica. GitHub expande esa expresión antes de que el shell ejecute el comando. Por tanto, un título que incluyera una comilla simple podía cerrar la cadena prevista y añadir comandos elegidos por el atacante. El intento de limpiar el valor después mediante sed no podía deshacer una interpretación de shell que ya había ocurrido.
El disparador issues: opened tampoco convertía el título en un dato confiable. Cualquier usuario que pudiera abrir un issue en el repositorio público podía controlar su contenido. Además, una condición que limitara el flujo a eventos de tipo issue no impedía que los datos proporcionados por el atacante fueran interpolados en el shell.
El commit atribuyó a “Copilot Autofix powered by AI” la condición de coautor, y la revisión asistida por IA no señaló el problema. Sin embargo, la evidencia disponible no demuestra si Copilot generó el cambio inseguro o si simplemente participó en él y no detectó la inyección. La conclusión más precisa es que Copilot estuvo asociado al cambio y no identificó la vulnerabilidad; no que esté probada la autoría completa del modelo.
Wiz Red Agent analizó la organización pública de Snowflake en GitHub en busca de patrones de riesgo en sistemas de integración y entrega continuas, conocidos como CI/CD. El agente identificó que el flujo utilizaba datos no confiables dentro de un bloque run: y dedujo que un título de issue cuidadosamente diseñado podía provocar la ejecución arbitraria de comandos en el ejecutor administrado por GitHub Actions.
El 23 de junio, cinco días después de la fusión del cambio vulnerable, el agente abrió un issue manipulado como parte del programa de divulgación de vulnerabilidades de Snowflake en HackerOne. El título escapó de la cadena de shell y provocó que el flujo enviara las credenciales de Jira a un callback externo controlado para la prueba de concepto autorizada.
No se trató de una intrusión descontrolada, sino de una prueba de seguridad aprobada dentro de un programa de vulnerabilidades. El hallazgo técnico, no obstante, era real: la creación pública de un issue podía alcanzar un paso que manejaba credenciales internas y convertir una acción aparentemente rutinaria en ejecución de comandos.
El flujo comprometido tenía acceso a la configuración del Jira interno de Snowflake, incluida la URL, el correo del usuario y el token de API. El token recuperado estaba asociado a qa@snowflake.net; Wiz lo utilizó para autenticarse en el portal interno y evaluar el alcance potencial de la exposición.
Los informes describieron acceso de lectura a proyectos de Jira relacionados con ingeniería, cumplimiento de seguridad y actividad del programa de recompensas por errores. La evidencia proporcionada no establece el conjunto completo de permisos del token ni ofrece un inventario definitivo de todos los registros que podían consultarse. La conclusión respaldada por los datos es que permitía acceder a contenido interno sensible de Jira, no que otorgara acceso irrestricto a los sistemas de Snowflake.
El activo vulnerable era la automatización CI/CD del repositorio. No se informó de ninguna versión afectada del Snowflake Connector for .NET, ya que el problema estaba en el flujo de GitHub Actions y no en el código de ejecución del conector.
Wiz informó del problema el 23 de junio. Snowflake corrigió el flujo ese mismo día y rotó la credencial de Jira expuesta al día siguiente.
Después, Snowflake revisó sus registros de auditoría y concluyó que Wiz había sido el único actor durante el periodo de exposición. Wiz también afirmó que eliminó de forma segura los datos obtenidos durante la prueba de concepto.
No se informó de acceso no autorizado por parte de terceros, no se asignó un identificador CVE y no se identificó ninguna versión afectada del conector. Estos límites describen el impacto confirmado, pero no hacen seguro el diseño original: un título público de issue nunca debería haberse convertido directamente en parte de un comando de shell en un flujo que manejaba credenciales internas.
El caso deja una advertencia que va más allá de Snowflake y Copilot. Los títulos de issues y pull requests, los nombres de ramas, los comentarios y cualquier otra expresión de GitHub deben tratarse como entradas potencialmente hostiles cuando llegan a un comando de shell.
Entre las prácticas más seguras están:
run:.jq para construir JSON, en vez de ensamblar cadenas de shell.El episodio resume un nuevo reto de seguridad: un sistema de IA para programar puede pasar por alto un cambio peligroso en CI/CD, mientras un agente autónomo de seguridad ofensiva puede encontrarlo y validarlo pocos días después. La automatización puede acelerar tanto la explotación como la corrección, pero no sustituye una revisión independiente.