Preinstalación a Persistencia: Dentro de la Campaña de Robo de Credenciales Red Hat npm Miasma
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumen
Microsoft Defender identificó un compromiso de la cadena de suministro que afecta a 32 paquetes npm publicados bajo el @redhat-cloud-services namespace. Los atacantes insertaron un gancho de pre-instalación que despliega un cargador de JavaScript altamente ofuscado, que luego recupera el entorno de ejecución de Bun y un ladrón de credenciales de segunda etapa. El malware recolecta tokens de GitHub, npm, principales proveedores de la nube, HashiCorp Vault y Kubernetes, luego republica paquetes envenenados para continuar propagándose. La campaña también incluye una salvaguarda destructiva que borra el directorio de inicio de la víctima si se detecta un token señuelo.
Investigación
La investigación rastreó la violación inicial a un pipeline CI/CD comprometido para RedHatInsights/javascript-clients, donde los atacantes abusaron de un flujo de trabajo OIDC de GitHub Actions legítimo para publicar paquetes troyanizados con firmas de procedencia válidas. El análisis del dropper expuso múltiples capas de ofuscación, incluida codificación basada en ROT, cifrado AES-128-GCM y un cifrado personalizado, antes de que Bun se ejecutara para lanzar la carga de segunda etapa. Los actores de la amenaza también extrajeron secretos de procesos activos de los runners de GitHub Actions.
Mitigación
Microsoft recomienda revisar los árboles de dependencias de los @redhat-cloud-services paquetes afectados, fijar versiones confiables, y deshabilitar la ejecución de scripts npm con la --ignore-scripts flag donde sea posible. Todos los tokens npm comprometidos deben ser revocados y reemitidos, y las cuentas de GitHub deberían revisarse para detectar creación no autorizada de repositorios o actividad sospechosa. Se han implementado salvaguardas adicionales dentro del @redhat-cloud-services namespace para prevenir publicaciones no autorizadas.
Respuesta
Los defensores deben detectar ejecuciones sospechosas de pre-instalaciones de npm y lanzamientos inesperados del entorno de ejecución de Bun desde directorios temporales. La monitorización también debería cubrir la creación de repositorios públicos de GitHub desconocidos y patrones inusuales de uso de tokens. Las defensas de red deberían bloquear o alertar sobre conexiones a URLs de descarga de Bun conocidas y el dominio api.anthropic.com. Cualquier credencial potencialmente expuesta debe rotarse inmediatamente y la memoria de los runners CI/CD debe investigarse en busca de signos de secretos filtrados. domain. Any potentially exposed credentials should be rotated immediately, and CI/CD runner memory should be investigated for signs of leaked secrets.
"graph TB %% Class Definitions classDef action fill:#99ccff classDef tool fill:#cccccc classDef malware fill:#ffcc99 classDef process fill:#ff9966 %% Nodes node_sc_001["<b>Acción</b> – <b>T1195.001 Compromiso de la Cadena de Suministro</b>: Comprometer Dependencias de Software y Herramientas de Desarrollo<br/>El atacante secuestró el pipeline CI/CD de RedHatInsights/javascript-clients y utilizó GitHub Actions OIDC para publicar paquetes npm troyanizados de @redhat-cloud-services."] class node_sc_001 action tool_github_oidc["<b>Herramienta</b> – <b>Nombre</b>: GitHub Actions OIDC<br/><b>Descripción</b>: Integración OpenID Connect que proporciona tokens de corta duración para flujos de trabajo CI."] class tool_github_oidc tool malicious_preinstall["<b>Malware</b> – <b>T1127.003 Ejecución de Proxies de Utilidades de Desarrolladores Confiables</b>: Gancho de pre-instalación malicioso en package.json ejecutado automáticamente durante <code>npm install</code>, generando <code>node index.js</code>."] class malicious_preinstall malware installer_trigger["<b>Acción</b> – <b>T1546.016 Ejecución Activada por Evento</b>: El paquete de instalación desencadena que ejecuta el dropper cuando se invoca el script de pre-instalación."] class installer_trigger action obfuscated_payload["<b>Malware</b> – <b>T1027.009 Archivos o Información Ofuscados</b>: Carga útil embebida (4.29u202fMB index.js) usando ROT multinivel, AESu2011128u2011GCM, string-array y cifrado PBKDF2 personalizado para ocultar su código."] class obfuscated_payload malware dynamic_resolution["<b>Malware</b> – <b>T1027.007 Archivos o Información Ofuscados</b>: Resolución dinámica de API u2013 la deofuscación en tiempo de ejecución resuelve URLs para el runtime de Bun y puntos finales C2."] class dynamic_resolution malware ingress_transfer["<b>Acción</b> – <b>T1105 Transferencia de Herramientas de Ingreso</b>: El dropper descarga el runtime de JavaScript Bun desde URLs de lanzamiento oficiales antes de ejecutar la carga útil de segunda etapa."] class ingress_transfer action tool_bun_runtime["<b>Herramienta</b> – <b>Nombre</b>: Runtime de JavaScript Bun<br/><b>Descripción</b>: Motor de JavaScript de alto rendimiento utilizado como entorno de ejecución para la segunda etapa."] class tool_bun_runtime tool metadata_query["<b>Acción</b> – <b>T1552.005 Credenciales No Seguras</b>: API de Metadatos de Instancia en la Nube<br/>Consulta servicios de metadatos AWS/ECS, Azure IMDS y GCP para obtener tokens de acceso a la nube."] class metadata_query action file_credential["<b>Acción</b> – <b>T1552.001 Credenciales No Seguras</b>: Credenciales en Archivos<br/>Raspa archivos locales en busca de claves SSH, configuraciones de CLI, archivos de billetera de criptomonedas y otro material secreto."] class file_credential action token_harvest["<b>Acción</b> – <b>T1528 Robo de Token de Acceso a Aplicaciones</b>: Recolecta tokens de los runners de GitHub Actions, tokens OIDC de npm y otros tokens de proveedores."] class token_harvest action browser_discovery["<b>Acción</b> – <b>T1217 Descubrimiento de Información del Navegador</b>: Recoge almacenes del navegador y archivos de billeteras de criptomonedas de estaciones de trabajo de desarrolladores."] class browser_discovery action elevation_control["<b>Acción</b> – <b>T1548 Abuso del Mecanismo de Control de Elevación</b>: Instala una regla sudo sin contraseña mediante un <code>bindo-mount <code>/etc/sudoers.d</code> para ganar privilegios de root. "] class elevation_control action exfiltration_git["<b>Acción</b> – <b>T1048 Extracción Vía Protocolo Alternativo</b>: Exfiltra credenciales robadas creando repositorios de GitHub bajo la cuenta de la víctima, comprometiendo archivos JSON y también utiliza un punto final HTTPS alternativo."] class exfiltration_git action destructive_cleanup["<b>Acción</b> – <b>T1070.010 Eliminación de Indicadores</b>: Reubica el malware y, si se utilizó un token señuelo, ejecuta <code>rm -rf ~/</code> para borrar el directorio de inicio del usuario."] class destructive_cleanup action node_sc_002["<b>Acción</b> – <b>T1195.002 Compromiso de la Cadena de Suministro</b>: Compromiso de la Cadena de Suministro de Software u2013 paquetes envenenados republicados con procedencia SLSA forjada, permitiendo una propagación similar a un gusano a proyectos descendentes."] class node_sc_002 action %% Connections node_sc_001 –>|uses| tool_github_oidc tool_github_oidc –>|executes| malicious_preinstall malicious_preinstall –>|triggers| installer_trigger installer_trigger –>|executes| obfuscated_payload obfuscated_payload –>|performs| dynamic_resolution dynamic_resolution –>|downloads| ingress_transfer ingress_transfer –>|installs| tool_bun_runtime tool_bun_runtime –>|queries| metadata_query metadata_query –>|scrapes| file_credential file_credential –>|harvests| token_harvest token_harvest –>|collects| browser_discovery browser_discovery –>|enables| elevation_control elevation_control –>|exfiltrates via| exfiltration_git exfiltration_git –>|may trigger| destructive_cleanup destructive_cleanup –>|facilitates| node_sc_002 node_sc_002 –>|propagates to| node_sc_001 "
Flujo de Ataque
Detecciones
Carga / Descarga Remota de Archivos a través de Herramientas Estándar (vía línea de comandos)
Ver
IOCs (HashSha256) para detectar: Preinstalación a persistencia: Dentro de la campaña Miasma de robo de credenciales de Red Hat npm
Ver
Comportamiento sospechoso del proceso de Node.js con ejecución del entorno de Bun [Creación de Proceso de Windows]
Ver
Ejecución de Bun y Detección de Reglas Sudo Sin Contraseña [Creación de Proceso de Linux]
Ver
Recolección de Tokens de Cuenta de Servicio de GCP por la Campaña Miasma [Google Cloud Platform]
Ver
Detección de Acceso no Autorizado a Token de Azure IMDS OAuth2 [Registros de Actividad de Azure]
Ver
Acceso a Credenciales a través de Recuperación de Token IMDS OAuth2 y Acceso a Secrets Manager [AWS Cloudtrail]
Ver
Ejecución de Simulación
Requisito Previo: La verificación preliminar de Telemetría y Línea Base debe haber pasado.
Racional: 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 la narrativa DEBEN reflejar directamente los TTPs identificados y tienen como objetivo generar exactamente la telemetría esperada por la lógica de detección.
-
Narrativa de Ataque y Comandos:
Un adversario que ya ha comprometido una VM de GCE usa un enfoque larga vida al terreno para recolectar el token de cuenta de servicio predeterminado de la VM. Los pasos son:- Sondear el servidor de metadatos para verificar que es accesible.
- Emitir una solicitud de token to
http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/tokencon el encabezado requeridoMetadata-Flavor: Google. - Guardar el JSON devuelto (contiene
access_token,expires_in,token_type). - Usar el token para llamar a una API privilegiada de GCP (por ejemplo, listar todos los buckets) para demostrar credenciales activamente utilizables.
Esta secuencia exacta genera el evento de auditoría
GCPServiceAccountTokenAccess, que coincide con la selección de la regla Sigma.. -
Script de Prueba de Regresión:
#!/usr/bin/env bash set -euo pipefail # 1. Verificar accesibilidad del servidor de metadatos echo "[*] Sondear el servidor de metadatos..." curl -s -H "Metadata-Flavor: Google" "http://metadata.google.internal/computeMetadata/v1/instance/id" >/dev/null # 2. Recolectar el token de cuenta de servicio por defecto echo "[*] Solicitando token de cuenta de servicio..." TOKEN_RESPONSE=$(curl -s -H "Metadata-Flavor: Google" "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token") echo "[+] Respuesta de token recibida:" echo "${TOKEN_RESPONSE}" | jq . # 3. Extraer el token de acceso ACCESS_TOKEN=$(echo "${TOKEN_RESPONSE}" | jq -r '.access_token') # 4. Usar el token para listar buckets de GCS (demuestra utilidad del token) echo "[*] Usando el token para listar buckets de GCS..." curl -s -H "Authorization: Bearer ${ACCESS_TOKEN}" "https://storage.googleapis.com/storage/v1/b" | jq . echo "[+] Simulación completa. Las acciones anteriores deberían haber producido un evento de auditoría GCPServiceAccountTokenAccess." -
Comandos de Limpieza:
# No se hicieron cambios persistentes; solo se eliminan variables temporales. unset TOKEN_RESPONSE ACCESS_TOKEN echo "[*] Limpieza completa."