El malware autorreplicante denominado 'ChainDrop' ha comprometido más de 1,300 paquetes en el registro de Node Package Manager (npm), que en conjunto suman alrededor de 2 mil millones de descargas mensuales. Entre los paquetes afectados se incluyen utilidades de caché muy populares como Keyv, Cacheable, flat-cache y file-entry-cache, todos ellos pertenecientes al mismo mantenedor.

El ataque comenzó después de que el actor de amenazas comprometiera la cuenta de GitHub del mantenedor de Keyv, y desde allí se extendió rápidamente a paquetes asociados con organizaciones importantes como Deliveroo, Ornikar, OneReach, Picsart, Qlik y ServiceTitan. Diversas empresas de seguridad de aplicaciones detectaron el ataque y descubrieron que desplegaba un gusano basado en Shai-Hulud llamado ChainDrop.

Un informe de Aikido señala que 'al menos 868 paquetes (en 1381 versiones) han sido comprometidos por el gusano'. Los investigadores indican que el atacante empujó archivos maliciosos directamente a las ramas principales de los proyectos y luego generó nuevas versiones de los paquetes. Dado que los paquetes se compilaron y publicaron a través de sus flujos de trabajo legítimos de GitHub Actions, las versiones comprometidas de npm llevaban información de procedencia válida.

Los paquetes infectados contienen dos archivos: el dropper setup.mjs y el script Math_Symbol.js, diseñado para robar información sensible. Además, el archivo package.json incluye la entrada 'preinstall': 'node setup.mjs'. Aikido advierte que 'cualquier persona que ejecutara npm install contra una versión afectada habría hecho que setup.mjs se ejecutara automáticamente antes de que se completara la instalación'.

El dropper setup.mjs descarga el runtime de JavaScript Bun desde la versión oficial de GitHub para ejecutar Math_Symbol.js, el payload malicioso con capacidades de robo de información. Tras descargar el ejecutable de Bun para ejecutar el script, setup.mjs elimina el directorio temporal del runtime. Aikido señala que el infostealer recopila credenciales de desarrollador y de la nube del entorno comprometido, las cifra y las envía a un repositorio público de GitHub con la descripción 'Shai-Hulud: Here We Go Again'.

El JavaScript malicioso está fuertemente ofuscado e incluye capacidades de autopropagación que le permiten infectar paquetes de otros mantenedores que utilizaban un paquete previamente comprometido. Aunque Aikido encontró que el ejecutable de Bun lanzaba el script Math_Symbol.js, BleepingComputer también ha visto paquetes de npm comprometidos que contienen el script math_init.js. Cada token se valida primero en tiempo real contra registry.npmjs[.]org/-/whoami antes de ser robado.

El malware busca en los sistemas de desarrollo infectados y en los runners de CI/CD credenciales que puedan otorgarle acceso a repositorios de código fuente y paquetes npm adicionales. Recopila los siguientes tipos de datos:

  • El entorno de proceso completo.
  • Archivos de configuración y credenciales locales.
  • Tokens de GitHub PAT, tokens de flujo de trabajo y otros tokens ghp_, gho_ y ghs_.
  • Tokens de npm que comienzan con npm_.
  • Secretos de GitHub Actions, incluido código diseñado para extraer valores 'isSecret': true de un runner autoalojado.
  • Credenciales de AWS, valores de SSM Parameter Store con WithDecryption: true y secretos de Secrets Manager.
  • Secretos de Kubernetes de namespaces accesibles.
  • Tokens de HashiCorp Vault y secretos KV.
  • Credenciales de bases de datos, claves privadas, credenciales de Stripe, Slack, Twilio, Azure y GCP.

Según la empresa de seguridad en la nube Wiz, el dominio 'npm-cache[.]com' también se está utilizando para la exfiltración de datos y debe tratarse como un fuerte indicador de compromiso. Si se instaló una versión afectada de un paquete, los administradores de sistemas deben considerar comprometida la estación de trabajo del desarrollador o el runner de CI/CD, incluso si el paquete se eliminó posteriormente.

En tales casos, se recomienda reconstruir los sistemas a partir de copias de seguridad seguras o desde cero, rotar todos los tokens que fueran accesibles desde el entorno afectado y revisar los registros en busca de accesos no autorizados y repositorios en busca de commits o cambios inesperados. Dado que el ataque aún está en curso, se espera que el número de paquetes y versiones maliciosas aumente, por lo que es importante seguir utilizando listas blancas de dependencias, comprobaciones de integridad y controles de procedencia.

Una lista de paquetes de npm comprometidos está disponible en Wiz, StepSecurity, Aikido, Socket y Ox Security. Las empresas de seguridad también proporcionan indicadores de compromiso que incluyen hashes de archivos y artefactos maliciosos, y datos de red.

image
image
Obfuscated math_init.js / Math_Symbol.js script
Obfuscated math_init.js / Math_Symbol.js script
article image
article image