highCWE-94OWASP A08:2021

Riesgos de Runners Self-Hosted

Usar 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.

Cómo Funciona

Los runners self-hosted son maquinas que tu administras y que ejecutan workflows de GitHub Actions. A diferencia de los runners de GitHub, no son efimeros -- persisten entre ejecuciones, reteniendo archivos, credenciales y acceso a la red. Cuando un workflow usa pull_request_target, se ejecuta en el contexto del repositorio base (con acceso a secrets) incluso cuando es disparado por un pull request desde un fork. Un atacante forkea el repo, modifica el workflow o los scripts de build para incluir codigo malicioso y abre un PR. El workflow ejecuta el codigo del atacante en tu runner self-hosted con acceso completo a los secrets del repositorio, el sistema de archivos del host y tu red interna. El atacante puede instalar backdoors, robar credenciales o pivotar a otros sistemas en la misma red.

Código Vulnerable
# BAD: self-hosted runner with pull_request_target = RCE from forks
name: PR Build
on:
  pull_request_target:  # runs in base repo context with secrets!
    types: [opened, synchronize]
jobs:
  build:
    runs-on: self-hosted  # persistent machine, not ephemeral
    steps:
      - uses: actions/checkout@v4
        with:
          ref: ${{ github.event.pull_request.head.sha }}  # checks out FORK code
      - run: npm install  # executes fork's package.json scripts on YOUR machine
      - run: npm test     # fork's test files run with access to secrets + network
Código Seguro
# GOOD: use GitHub-hosted runners for untrusted code, approve fork workflows
name: PR Build
on:
  pull_request:  # NOT pull_request_target -- limited context for forks
jobs:
  build:
    runs-on: ubuntu-latest  # ephemeral GitHub-hosted runner
    steps:
      - uses: actions/checkout@v4
      - run: npm install
      - run: npm test
  # If you MUST use self-hosted runners:
  deploy:
    if: github.event_name == 'push' && github.ref == 'refs/heads/main'
    runs-on: self-hosted  # only for trusted pushes to main
    needs: build
    steps:
      - uses: actions/checkout@v4
      - run: ./deploy.sh

Ejemplo Real

En 2021, el investigador de seguridad de GitHub Teddy Katz revelo vulnerabilidades en proyectos open-source importantes (incluyendo varios proyectos CNCF) donde runners self-hosted se usaban con workflows pull_request_target. Los atacantes desde forks podian ejecutar codigo arbitrario en la infraestructura del proyecto. GitHub posteriormente agrego la configuracion 'Require approval for all outside collaborators' y recomendo fuertemente no usar runners self-hosted para repositorios publicos.

Cómo Prevenirlo

  • Nunca uses runners self-hosted para workflows disparados por pull_request_target o pull_request desde repositorios publicos con contribuidores externos
  • Usa runners efimeros de GitHub para todos los builds CI que procesen codigo no confiable de forks y PRs
  • Si se requieren runners self-hosted, usa runners basados en contenedores efimeros (actions-runner-controller con pods efimeros) que se destruyen despues de cada job
  • Habilita 'Require approval for all outside collaborators' en la configuracion del repositorio para aprobar manualmente las ejecuciones de workflow de forks

Tecnologías Afectadas

GitHub ActionsNode.jsPythonDocker

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas