DEV#POPPER RAT Distribuido a Través de Lanzamientos de npm Joyfill Comprometidos
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumen
Dos versiones beta comprometidas de la @joyfill paquete npm se encontraron contenían un implante de JavaScript en tiempo de importación. El implante utiliza transacciones de blockchain a través de Tron, Aptos y BNB Smart Chain para resolver y descargar el troyano de acceso remoto DEV#POPPER (RAT). La campaña apunta a las estaciones de trabajo de desarrolladores y a los pipelines CI/CD ejecutando código malicioso tan pronto como se importa el módulo afectado.
Investigación
El equipo de investigación de Socket descubrió el compromiso mientras analizaba las versiones beta de @joyfill/layouts and @joyfill/components. Los investigadores identificaron una cadena de entrega de payload de múltiples etapas que combinaba JavaScript ofuscado con mecanismos de despacho respaldados por blockchain. La investigación vinculó el cargador inicial con la familia PolinRider y confirmó que el payload final pertenecía a la familia de malware DEV#POPPER.
Mitigación
Los desarrolladores deben eliminar inmediatamente las versiones beta afectadas de los lockfiles, cachés de paquetes, entornos de construcción y artefactos de implementación. Se recomienda fijar las dependencias a versiones verificadas como @joyfill es recomendado. Los equipos de seguridad también deben bloquear las versiones comprometidas a través de proxies de registro y herramientas de gobernanza de dependencias. @joyfill/layouts@0.1.1 or @joyfill/components@4.0.0-rc24 es recomendado. Los equipos de seguridad también deben bloquear las versiones comprometidas a través de proxies de registro y herramientas de gobernanza de dependencias.
Respuesta
Cualquier sistema que haya importado los paquetes afectados debe ser aislado, y todas las credenciales accesibles al proceso Node.js comprometido deben ser rotadas. Los investigadores deben inspeccionar aplicaciones de desarrollo, incluidas VS Code, GitHub Desktop y Discord, en busca de cambios inesperados en los módulos centrales. La telemetría de Endpoint y CI/CD también debe revisarse para los procesos Node.js separados, direcciones C2 conocidas y tráfico sospechoso de RPC de blockchain.
Flujo de Ataque
Detecciones
Posible intento de abuso de Publicnode Ethereum como canal C2 (vía dns_query)
Ver
Posible comunicación de dominio de búsqueda de IP intentada (vía dns)
Ver
Posible captura de pantalla de Linux realizada (vía cmdline)
Ver
Archivo oculto fue creado en el host de Linux (vía file_event)
Ver
IOCs (HashSha256) para detectar: Dos versiones beta de Joyfill npm comprometidas para entregar el troyano de acceso remoto DEV#POPPER
Ver
IOCs (SourceIP) para detectar: Dos versiones beta de Joyfill npm comprometidas para entregar el troyano de acceso remoto DEV#POPPER
Ver
IOCs (DestinationIP) para detectar: Dos versiones beta de Joyfill npm comprometidas para entregar el troyano de acceso remoto DEV#POPPER
Ver
Detección de indicadores de malware DEV#POPPER [Conexión de red de Windows]
Ver
Detección de paquetes npm Joyfill comprometidos entregando troyano de acceso remoto [Evento de archivo de Linux]
Ver
Detección de inyección de módulo Node.js y ejecución de procesos separados [Creación de procesos de Linux]
Ver
Ejecución de simulación
Requisito previo: la verificación previa de telometría y línea de base debe haber pasado.
Fundamento: esta sección detalla la ejecución precisa de la técnica de adversario (TTP) diseñada para activar la regla de detección. Los comandos y la narrativa DEBEN reflejar directamente las TTPs identificadas y buscar generar la telemetría exacta esperada por la lógica de detección. Los ejemplos abstractos o no relacionados conducirán a un error de diagnóstico.
-
Narrativa de ataque y comandos: El adversario ha logrado inyectar código malicioso en una dependencia npm ampliamente utilizada (compromiso de la cadena de suministro). Cuando un desarrollador ejecuta
npm installo inicia un proyecto, el script malicioso se ejecuta. El script primero intenta ocultar su intención asignando la funciónrequierea una variable global (global.r = requiere), permitiendo cargar módulos en cualquier parte de la aplicación sin llamarrequieredirectamente (ofuscación). Finalmente, utilizachild_process.spawnpara lanzar un proceso de shell separado que se conecta de nuevo a un servidor de Comando y Control (C2), intentando evadir la detección al desacoplar el proceso malicioso del proceso padre de Node.js. -
Script de prueba de regresión:
#!/bin/bash # Script de simulación para activar la regla de detección de inyección de Node.js. # Este script crea un archivo JS malicioso temporal y lo ejecuta a través de Node.js. MALICIOUS_FILE="malicious_pkg.js" echo "[+] Creando script malicioso de Node.js..." cat << 'EOF' > $MALICIOUS_FILE // Simular inyección de módulo global (T1027) global.r = require; // Simular ejecución de proceso separado mediante child_process.spawn (T1059.006) const cp = require('child_process'); cp.spawn('bash', ['-c', 'sleep 30 &'], { detached: true, stdio: 'ignore' }); console.log("[!] Payload malicioso ejecutado."); EOF echo "[+] Ejecutando script malicioso a través de Node.js..." node $MALICIOUS_FILE echo "[+] Simulación completa. Verifique SIEM para Alerta: Detección de inyección de módulo Node.js y ejecución de proceso separado." -
Comandos de limpieza:
# Eliminar el archivo malicioso simulado rm -f malicious_pkg.js # Matar cualquier proceso de sueño huérfano generado por la simulación pkill -f "sleep 30"