highCWE-532OWASP A09:2021

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.

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

GitHub ActionsNode.jsPythonDocker

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas