Introducción
El jueves 28 de mayo, un único usuario de npm publicó 14 paquetes maliciosos en solo cuatro horas, todos diseñados para imitar librerías populares de OpenSearch, Elasticsearch, herramientas de configuración de entornos y componentes de DevOps. La campaña fue descubierta y bloqueada por Microsoft, que identificó un patrón de robo de credenciales cloud y secretos de pipelines de CI/CD.
El ataque explotó mecanismos de typosquatting (nombres casi idénticos a los legítimos) y técnicas de ingeniería social para engañar a desarrolladores y administradores de infraestructura. Además, incluyó preinstall hooks que ejecutaban payloads de recolección de credenciales en el momento de la instalación, compromitiendo entornos desde el primer npm install.
Este incidente no es aislado: forma parte de una ola de ataques a la cadena de suministro en herramientas de desarrollo, donde los atacantes buscan credenciales con permisos elevados para moverse lateralmente en entornos cloud y CI/CD. La diferencia aquí es la especificidad del objetivo: las librerías suplantadas apuntaban directamente a servicios como AWS, Elasticsearch, HashiCorp Vault y GitHub Actions, lo que sugiere que el atacante buscaba credenciales con acceso a infraestructura crítica.
Qué ocurrió
El vector de ataque: typosquatting y metadata spoofing
El atacante creó 14 paquetes npm maliciosos bajo el alias vpmdhaj (vinculado a la dirección [email protected]), todos publicados en un lapso de cuatro horas. Los nombres de los paquetes imitaban librerías legítimas de los ecosistemas @opensearch y @elastic, así como herramientas de configuración de entornos y DevOps. Algunos ejemplos incluyen:
opensearch-setup-tool(vs. el legítimo@opensearch-project/opensearch-setup-tool)opensearch-config-utility(vs.@opensearch-project/opensearch-config)elastic-opensearch-helper(vs.@elastic/opensearch-helper)aws-vault-helper(vs. librerías legítimas de AWS SDK)
Para aumentar la credibilidad, el atacante modificó la metadata de los paquetes para que apuntaran a repositorios y issues reales de los proyectos originales. Por ejemplo, los campos homepage, repository y bugs de cada paquete malicioso redirigían al repositorio oficial de opensearch-js en GitHub.
Además, infló los números de versión para simular madurez:
1.0.72651.0.91082.1.9201
Esto buscaba engañar a desarrolladores que revisan la actividad reciente de un paquete antes de instalarlo.
El payload: un harvestador de credenciales multi-entorno
Todos los paquetes maliciosos incluían dos versiones de un stager (cargador inicial) y un segundo payload compilado con Bun (un runtime alternativo a Node.js):
- Stager Gen-1:
install, preinstall y postinstall.– Recolectaba información del host: hostname, plataforma, arquitectura, versión de Node.js, usuario, directorio de trabajo (cwd), nombre y versión del paquete npm.
– Codificaba los datos en base64 y los enviaba a un servidor de comando y control (C2).
– El servidor respondía con un segundo payload (payload.bin) que se escribía en el directorio de instalación del paquete.
– El módulo index.js del paquete re-ejecutaba payload.bin cada vez que el módulo era requerido (require()), creando una persistencia silenciosa que sobrevivía a reinicios de CI/CD y loops de rebuild.
- Stager Gen-2 (más sigiloso):
– Si no lo estaba, descargaba y ejecutaba Bun antes de correr el payload.
– El payload final robaba credenciales de:
– AWS (IAM/STS)
– HashiCorp Vault
– npm
– GitHub Actions
– Otros entornos CI/CD
Una vez obtenidos los secretos, el atacante podía moverse lateralmente en la infraestructura, robar datos sensibles y hasta inyectar paquetes adicionales maliciosos en librerías legítimas, expandiendo el ataque más allá de los 14 paquetes iniciales.
Impacto para DevOps / Infraestructura / Cloud / Seguridad
Alcance del ataque
- 14 paquetes maliciosos publicados en un lapso de 4 horas, todos eliminados tras el descubrimiento.
- Vectores de compromiso:
– Secretos de GitHub Actions (tokens de workflows, PATs).
– Claves de HashiCorp Vault (secrets de bases de datos, APIs, etc.).
– Tokens de npm (para publicar paquetes maliciosos desde cuentas hijas).
- Mecanismos de persistencia:
npm install (hooks).– Persistencia en pipelines de CI/CD (via require() de los paquetes).
- Posibilidad de lateralización:
– Con tokens de GitHub Actions, podía modificar workflows o inyectar código malicioso en repositorios.
– Con Vault, podía robar secrets de producción o modificar configuraciones.
Riesgo cuantificado
- CVSS base: 7.5 (alto impacto en confidencialidad e integridad).
- Sistemas afectados:
npm install sobre los paquetes maliciosos desde el 28 de mayo en adelante.– Equipos que usen OpenSearch, Elasticsearch, AWS SDK, HashiCorp Vault o GitHub Actions.
- Impacto en CI/CD:
- Impacto en cloud:
Detalles técnicos
Componentes afectados
| Paquete malicioso | Versión maliciosa | Legítimo equivalente | Objetivo |
|---|---|---|---|
