Secretos Filtrados en Logs de CI
Imprimir 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.
Cómo Funciona
Los sistemas CI como GitHub Actions automaticamente enmascaran los secrets registrados en la configuracion del repositorio cuando aparecen en la salida de logs. Sin embargo, este enmascaramiento es imperfecto. Si un secret se imprime indirectamente (pasado por base64, dividido en multiples lineas o embebido en un payload JSON), el enmascaramiento falla y el secret aparece en texto plano. Ademas, los secrets pasados como argumentos de linea de comandos aparecen en listados de procesos, y los secrets escritos en archivos pueden incluirse en artifacts subidos. Los logs de build se retienen por 90 dias por defecto y son visibles para cualquiera con acceso de lectura al repositorio. En repositorios publicos, los logs son visibles para todos en internet.
# BAD: secrets printed in CI logs in various ways
name: Deploy
on: [push]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- run: |
echo "Deploying with key: ${{ secrets.DEPLOY_KEY }}"
echo ${{ secrets.API_TOKEN }} | base64 # masking bypassed!
curl -H "Authorization: Bearer ${{ secrets.API_TOKEN }}" https://api.example.com
# curl commands show in logs, and the -H value may not be masked
env | grep -i secret # prints all env vars matching 'secret'# GOOD: secrets never printed, used only in masked env vars
name: Deploy
on: [push]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- run: |
# Never echo secrets, even for debugging
echo "Deploying to production..."
curl -sf -H "Authorization: Bearer $API_TOKEN" https://api.example.com
env:
API_TOKEN: ${{ secrets.API_TOKEN }}
- name: Validate deployment
run: |
# Use --silent and redirect output to avoid leaking response data
STATUS=$(curl -sf -o /dev/null -w '%{http_code}' https://app.example.com/health)
echo "Health check status: $STATUS"Ejemplo Real
En la brecha de Codecov de 2021, los atacantes modificaron el script bash de subida de Codecov para exfiltrar variables de entorno (incluyendo secrets de CI) de los pipelines CI de los clientes. Los secrets fueron extraidos del entorno CI y enviados a un servidor controlado por el atacante. Miles de organizaciones tuvieron sus secrets de CI robados porque las variables de entorno que contenian tokens estaban disponibles en el entorno del runner CI y no estaban correctamente delimitadas.
Cómo Prevenirlo
- Nunca hagas echo, print ni registres valores de secrets en scripts de CI -- ni siquiera para propositos de debugging
- Usa variables de entorno en bloques env: en lugar de interpolacion inline ${{ secrets.* }} para asegurar que el enmascaramiento automatico de GitHub funcione correctamente
- Agrega set +x al inicio de los pasos de shell para evitar que bash imprima los comandos mientras se ejecutan (set -x imprime cada comando incluyendo secrets)
- Audita regularmente los logs de CI buscando credenciales accidentalmente expuestas usando herramientas como trufflehog o gitleaks en la salida de CI
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.
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.