Prevención de Inyecciones en GitHub Actions: Guía de Detección y Mitigación
Aprende a detectar y mitigar inyecciones en GitHub Actions, una vulnerabilidad crítica según el informe Octoverse 2024. Estrategias técnicas y herramientas para proteger tus repositorios.
Prevención de Inyecciones en GitHub Actions: Guía de Detección y Mitigación
Las inyecciones en flujos de trabajo de GitHub Actions se encuentran entre las vulnerabilidades de seguridad más prevalentes en los repositorios de GitHub, según el informe Octoverse 2024 de GitHub. Estos ataques explotan entradas no confiables en los flujos de trabajo, permitiendo a los actores de amenazas ejecutar comandos maliciosos con permisos a nivel de flujo de trabajo. Los profesionales de la seguridad pueden mitigar estos riesgos utilizando las herramientas integradas de GitHub, prácticas de codificación segura y escaneo automatizado.
Detalles Técnicos de las Inyecciones en Flujos de Trabajo
Las inyecciones en flujos de trabajo de GitHub Actions ocurren cuando un atacante envía una entrada maliciosa, como el título de un issue o el nombre de una rama, que posteriormente es ejecutada por un flujo de trabajo. La vulnerabilidad surge de la sintaxis ${{}}, que expande entradas no confiables durante el preprocesamiento, pudiendo alterar el comportamiento del flujo de trabajo. Por ejemplo:
- name: print title
run: echo "${{ github.event.issue.title }}"
Un atacante podría crear un título de issue como `touch pwned.txt`, que se ejecutaría como un comando cuando el flujo de trabajo se ejecute. Dado que los flujos de trabajo a menudo heredan permisos elevados, esto puede llevar a accesos no autorizados o a la exfiltración de datos.
Vectores de Ataque Clave
- Expansión de Entradas No Confiables: Uso directo de
${{}}en comandosrun. - Escalada de Privilegios: Flujos de trabajo que se ejecutan con permisos excesivos (por ejemplo, acceso de
writeo exposición de secretos). - Disparador
pull_request_target: Elude las restricciones de seguridad predeterminadas, otorgando a los pull requests bifurcados acceso a secretos y permisos de escritura.
Análisis de Impacto
Las inyecciones exitosas en flujos de trabajo pueden resultar en:
- Ejecución de Código: Comandos maliciosos ejecutados con los permisos del flujo de trabajo.
- Filtraciones de Datos: Exposición de secretos del repositorio o archivos sensibles.
- Compromiso del Repositorio: Modificaciones no autorizadas en el código o en las tuberías de CI/CD.
El riesgo se extiende más allá de las ramas main —los atacantes pueden apuntar a cualquier rama públicamente visible con flujos de trabajo vulnerables.
Estrategias de Mitigación
1. Variables de Entorno para Entradas No Confiables
Evita la expansión directa de entradas no confiables en comandos run. En su lugar, pasa los datos a través de variables de entorno:
- name: print title
env:
TITLE: ${{ github.event.issue.title }}
run: echo "$TITLE"
Aunque esto no sanitiza la entrada, limita la superficie de ataque al prevenir la inyección de comandos.
2. Principio de Mínimo Privilegio
Restringe los permisos del flujo de trabajo utilizando la clave permissions para el GITHUB_TOKEN:
permissions:
contents: read
issues: write
Establece permisos de solo lectura de forma predeterminada, a menos que se requieran permisos de escritura de manera explícita.
3. Evita pull_request_target
Utiliza pull_request en lugar de pull_request_target para bloquear que los pull requests bifurcados accedan a secretos o permisos de escritura. Si pull_request_target es inevitable, audita los flujos de trabajo en busca de riesgos de inyección y restringe los permisos.
4. Escaneo con CodeQL para Flujos de Trabajo
CodeQL de GitHub ahora soporta el escaneo automatizado de flujos de trabajo de GitHub Actions. Actívalo mediante:
- Configuración Predeterminada: Escanea automáticamente las ramas protegidas.
- Configuración Avanzada: Añade
actionsa los lenguajes objetivo en tu configuración de CodeQL.
El seguimiento de taint de CodeQL identifica flujos de datos no confiables, descubriendo riesgos de inyección sutiles.
Recomendaciones
- Escanea Todas las Ramas: Las vulnerabilidades en ramas de características pueden ser explotadas incluso si
mainestá segura. - Combina Herramientas con Revisión Manual: Ninguna herramienta es 100% efectiva —mantén una mentalidad de seguridad primero.
- Educa a los Equipos: Comparte la serie de seguridad en cuatro partes de GitHub sobre el endurecimiento de flujos de trabajo.
Próximos Pasos
Habilita el escaneo de código con CodeQL en tus repositorios para detectar inyecciones en flujos de trabajo de manera proactiva. Para configuraciones avanzadas, incluye actions como lenguaje objetivo en tu configuración de CodeQL.
Para más detalles, consulta la documentación de seguridad de flujos de trabajo de GitHub.