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.
# 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# 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.shEjemplo 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
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.
Inyeccion de Script en GitHub Actions
criticalUsar 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.
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.
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.