Un ataque a gran escala contra la cadena de suministro de npm ha afectado a cientos de paquetes del ecosistema @antv, una popular biblioteca de visualización de datos, así como a varios paquetes de JavaScript ampliamente utilizados, incluido echarts-for-react con unas 1,1 millones de descargas semanales. Según los investigadores de Socket, el ataque está relacionado con la campaña en curso Mini Shai-Hulud, en el marco de la cual se utiliza una cuenta de mantenedor comprometida para publicar masivamente versiones troyanizadas de los paquetes. La carga maliciosa roba más de 20 tipos de credenciales —desde claves de AWS y Azure hasta tokens de GitHub y npm— y es capaz de autopropagarse mediante los tokens robados. Las organizaciones que utilizan los paquetes afectados deben auditar de inmediato sus dependencias y revocar los secretos potencialmente comprometidos.
Alcance de la intrusión y paquetes afectados
El ataque afectó a paquetes vinculados a la cuenta de npm del mantenedor atool. Según Socket, el atacante publicó 639 versiones maliciosas en 323 paquetes únicos, de las cuales 558 versiones corresponden a 279 paquetes en el espacio de nombres @antv. Un análisis independiente de SafeDep ofrece cifras ligeramente distintas —631 versiones maliciosas en 314 paquetes—, lo que indica cierta incertidumbre sobre el alcance exacto de la campaña.
Entre los paquetes confirmados como afectados:
- Espacio de nombres @antv: @antv/g2, @antv/g6, @antv/x6, @antv/l7, @antv/s2, @antv/f2, @antv/g, @antv/g2plot, @antv/graphin, @antv/data-set
- Fuera de @antv: echarts-for-react, timeago.js, size-sensor, canvas-nest.js
Como señala Socket, el radio de impacto potencial es considerable, ya que la cuenta comprometida está asociada a paquetes muy utilizados en los ecosistemas de visualización de datos, gráficos, cartografía y componentes de React. Las organizaciones que obtienen automáticamente nuevas versiones de dependencias corren un riesgo particular.
Anatomía técnica del ataque
Mecanismo de infección
Según SafeDep, el ataque utiliza dos rutas de ejecución. Cada versión comprometida añade un hook preinstall que invoca bun run index.js. Además, 630 de las 631 versiones maliciosas inyectan una entrada optionalDependencies que apunta a los llamados imposter commits, commits falsos en el repositorio legítimo antvis/G2 en GitHub que entregan una segunda copia de la carga maliciosa.
Resulta llamativa la velocidad de la operación: SafeDep registró un pico de publicaciones de 22 minutos que abarcó 314 paquetes y 631 versiones con una carga ofuscada idéntica. Esto apunta inequívocamente a una operación completamente automatizada que utiliza un token robado, y no a un ataque gradual o dirigido.
Capacidades del stealer
Según los investigadores, la carga maliciosa roba más de 20 tipos de credenciales:
- Claves de proveedores cloud: Amazon Web Services, Google Cloud, Microsoft Azure
- Tokens de desarrollador: GitHub, npm
- Secretos de infraestructura: claves SSH, Kubernetes, Vault
- Datos de pago: Stripe
- Cadenas de conexión a bases de datos
- Intento de escape de contenedores Docker a través del socket del host
Los datos recopilados se serializan, se comprimen, se cifran y se envían al dominio t.m-kosche[.]com a través del puerto 443. Como mecanismo de exfiltración de reserva, el malware utiliza un token de GitHub robado para crear un repositorio público bajo la cuenta de la víctima y hacer commit de los datos en un archivo JSON.
Autopropagación
La característica clave de Mini Shai-Hulud es la lógica integrada de propagación a través de npm. El malware valida los tokens de npm robados mediante la API del registro, enumera los paquetes pertenecientes al propietario del token, descarga los archivos comprimidos de los paquetes, inyecta la carga maliciosa, añade el hook preinstall, incrementa el número de versión y vuelve a publicar los paquetes en nombre del mantenedor comprometido. De este modo, cada compromiso genera el siguiente, creando un efecto en cascada.
Indicador de compromiso en GitHub
Los repositorios creados por el malware contienen una cadena de descripción característica: «niagA oG eW ereH :duluH-iahS» (que, leída al revés, es «Shai-Hulud: Here We Go Again»). En el momento de la publicación de las investigaciones, una búsqueda en GitHub había identificado más de 2200 repositorios con este marcador, un indicador indirecto de la magnitud de la compromisión de cuentas.
Atribución y escalada de la amenaza
Según los investigadores, la campaña Mini Shai-Hulud está vinculada al grupo con motivación financiera TeamPCP. Sin embargo, la situación se ha agravado considerablemente: como informa SlowMist, TeamPCP publicó el código fuente completo del framework en el marco de un concurso de ataques a la cadena de suministro anunciado conjuntamente con BreachForums.
Como señala Datadog, la publicación del código fuente de un framework ofensivo operativo es un hecho poco común. Esto reduce la barrera de entrada para otros atacantes, proporcionándoles técnicas ya preparadas, entre ellas el abuso de tokens OIDC, la falsificación de datos sobre el origen de los paquetes y hooks para mantener la persistencia en herramientas basadas en IA.
Las consecuencias ya se están observando: según Mondoo, un atacante desconocido ha subido cuatro paquetes maliciosos a npm, uno de los cuales contiene una copia casi literal del gusano Shai-Hulud con su propia infraestructura de control. La aparición de clones complica la atribución y amplía la superficie de ataque.
Como subraya Trend Micro, las organizaciones que utilizan GitHub Actions, PyPI, Docker Hub, GitHub Container Registry, extensiones de VS Code y runners de CI en la nube están directamente expuestas a los riesgos de esta campaña.
Evaluación del impacto
Los equipos de desarrollo que utilizan paquetes @antv y bibliotecas de visualización de datos relacionadas en proyectos corporativos son los que corren un mayor riesgo. Teniendo en cuenta que echarts-for-react se descarga más de un millón de veces a la semana, el número potencial de organizaciones afectadas se cuenta por miles. El carácter autopropagable del gusano implica que la compromisión de un único mantenedor puede afectar en cascada a todos los paquetes vinculados a sus tokens. La filtración de claves de la nube, secretos SSH y tokens de CI/CD abre la puerta a la completa compromisión de la infraestructura.
Recomendaciones prácticas
- Auditoría de dependencias: compruebe si en sus proyectos se utilizan los paquetes afectados. Fije las versiones de las dependencias y vuelva a versiones conocidas como limpias, publicadas antes del inicio de la campaña.
- Revocación de secretos: si los paquetes afectados se han instalado en su entorno, rote de inmediato todos los tokens de npm y GitHub, las claves de nube de AWS/GCP/Azure, las claves SSH y las cadenas de conexión a bases de datos.
- Comprobación en GitHub: realice una búsqueda en su organización para detectar repositorios con la descripción «niagA oG eW ereH :duluH-iahS»; su presencia indica una compromisión.
- Bloqueo de IOC: añada el dominio
t.m-kosche[.]coma las listas negras de su monitorización de red. - Desactivar actualizaciones automáticas: revise la política de obtención automática de nuevas versiones de dependencias. Utilice archivos lock y version pinning.
- Monitorización de hooks preinstall: compruebe si hay hooks preinstall sospechosos en las dependencias, en especial llamadas a
bun run index.js.
La campaña Mini Shai-Hulud pone de manifiesto una vulnerabilidad sistémica del ecosistema npm: un único token de mantenedor comprometido desencadena una cascada de infecciones, y la publicación del código fuente del gusano convierte una amenaza aislada en un problema masivo. Las acciones prioritarias ahora son auditar todas las dependencias del espacio de nombres @antv y los paquetes relacionados, rotar todos los secretos que hayan podido estar accesibles en entornos comprometidos y adoptar un version pinning estricto con revisión manual de las actualizaciones de dependencias críticas.