SOC Prime Bias: Crítico

30 Jul 2026 15:32 UTC

DEV#POPPER RAT Distribuido a Través de Lanzamientos de npm Joyfill Comprometidos

Author Photo
SOC Prime Team linkedin icon Seguir
DEV#POPPER RAT Distribuido a Través de Lanzamientos de npm Joyfill Comprometidos
shield icon

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

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 install o inicia un proyecto, el script malicioso se ejecuta. El script primero intenta ocultar su intención asignando la función requiere a una variable global (global.r = requiere), permitiendo cargar módulos en cualquier parte de la aplicación sin llamar requiere directamente (ofuscación). Finalmente, utiliza child_process.spawn para 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"