Aikido

Los atacantes de S1ngularity/nx atacan de nuevo

Charlie EriksenCharlie Eriksen
|
#

Esta mañana, se nos alertó de un ataque a gran escala contra npm. Parece ser obra de los mismos autores del ataque Nx del 27 de agosto de 2025. Publicado originalmente por Socket y StepSecurity, que señalaron que 40 paquetes habían sido comprometidos. Desde entonces, otros 147 paquetes han sido infectados con malware, incluidos paquetes de CrowdStrike.

La magnitud, el alcance y el impacto de este ataque son significativos. Los atacantes están utilizando en gran parte el mismo manual que en el ataque original, pero han intensificado sus acciones. Lo han convertido en un gusano completo, que realiza las siguientes acciones de forma automática:

  • Robar secretos y publicarlos en GitHub de forma pública.
  • Ejecute trufflehog y consulte los puntos finales de metadatos de Cloud para recopilar secretos.
  • Intento de crear una nueva acción de GitHub con un mecanismo de extracción de datos a través de webhook[.]site.
  • Repite los repositorios en GitHub a los que un usuario tiene acceso y hazlos públicos.

Desde nuestra alerta inicial esta mañana, hemos confirmado los siguientes comportamientos adicionales y detalles importantes. Para aquellos que no lo sepan, Shai Hulud es el nombre del gusano de la franquicia Dune. Una clara indicación de la intención de los atacantes.

Shai Hulud, de Dune

Para evitar verse comprometido por paquetes como este, ¡echa un vistazo a Aikido safe-chain!

Lo que hace el gusano

  • Harvest: escanea el entorno del host y CI en busca de secretos: process.env, escaneo con TruffleHog y puntos finales de metadatos en la nube (AWS/GCP) que devuelven credenciales de instancia/servicio.
  • Exfiltrate (1) — Repositorio GitHub: crea un repositorio llamado Shai-Hulud en la cuenta comprometida y envía un volcado JSON que contiene información del sistema, variables de entorno y secretos recopilados.
  • Exfiltrar (2) — GitHub Actions → webhook: elimina un flujo de trabajo .github/workflows/shai-hulud-workflow.yml que serializa ${{ toJSON(secrets) }}, los envía a un atacante webhook[.]sitio URL y escribe una copia doble en base64 en los registros de Actions.
  • Propagación: utiliza cualquier token npm válido que encuentre para enumerar e intentar actualizar los paquetes que controla el mantenedor comprometido (propagación de la cadena de suministro).
  • Amplificar: repite los repositorios accesibles de la víctima, haciéndolos públicos o añadiendo el flujo de trabajo/rama que desencadenará nuevas ejecuciones y fugas.

Filtración de secretos

Al igual que con el ataque Nx original, vemos que los atacantes están llevando a cabo un ataque de tipo «smash-and-grab» (romper y robar). La carga maliciosa publica un repositorio «Shai-Hulud» con credenciales/tokens robados y, a través de una cuenta de GitHub, convierte el repositorio privado en público:

Publicación de credenciales robadas

Los repositorios privados se vuelven públicos.

Autopropagación a través de npm

Una de las características más llamativas de este ataque es que se comporta como un auténtico gusano. En lugar de depender de un único paquete infectado para propagarse, el código está diseñado para volver a publicarse en otros paquetes npm propiedad del mantenedor comprometido.

Así es como funciona la lógica del gusano:

  • Descargar un archivo tarball de destino: obtiene una versión existente del paquete del registro npm.
  • Modificar package.json – el gusano aumenta la versión del parche (por ejemplo, 1.2.3 → 1.2.4) e inserta un nuevo gancho de ciclo de vida (postinstalación)
  • Copiar su propia carga útil – el script en ejecución (process.argv[1]) se escribe en el archivo tar como bundle.jsEsto garantiza que cualquier código que haya infectado un paquete ahora se encuentre dentro del siguiente.
  • Vuelve a publicar el paquete troyanizado: el archivo comprimido modificado se comprime con gzip y se vuelve a enviar a npm utilizando las credenciales del administrador.

Este ciclo permite al malware infectar continuamente todos los paquetes a los que tiene acceso un administrador. Cada paquete publicado se convierte en un nuevo vector de distribución: tan pronto como alguien lo instala, el gusano se ejecuta, se replica y se propaga aún más en el ecosistema.

En resumen: el atacante no necesita seleccionar manualmente los paquetes. Una vez que se compromete un solo entorno, el gusano automatiza la propagación aprovechando los derechos de publicación del propio administrador.

Para obtener un análisis completo del malware, recomendamos revisar la publicación de getsafety .

Paquetes impactados

Paquete Versiones
@ahmedhfarag/ngx-barra-de-desplazamiento-perfecta 20.0.20
@ahmedhfarag/ngx-virtual-scroller 4.0.4
@art-ws/común 2.0.28
@art-ws/config-eslint 2.0.4, 2.0.5
@art-ws/config-ts 2.0.7, 2.0.8
@art-ws/contexto-db 2.0.24
@art-ws/di 2.0.28, 2.0.32
@art-ws/di-nodo 2.0.13
@art-ws/eslint 1.0.5, 1.0.6
@art-ws/servidor-http-fastify 2.0.24, 2.0.27
@art-ws/servidor-http 2.0.21, 2.0.25
@art-ws/openapi 0.1.9, 0.1.12
@art-ws/paquete-base 1.0.5, 1.0.6
@art-ws/prettier 1.0.5, 1.0.6
@art-ws/slf 2.0.15, 2.0.22
@art-ws/información-ssl 1.0.9, 1.0.10
@art-ws/aplicación web 1.0.3, 1.0.4
crowdstrike 8.1.1, 8.1.2
crowdstrike 0.4.1, 0.4.2
crowdstrike 0.19.1, 0.19.2
crowdstrike 0.34.2, 0.34.3
crowdstrike 1.205.1, 1.205.2
crowdstrike 1.205.1, 1.205.2
crowdstrike 1.205.1, 1.205.2
crowdstrike 1.205.1, 1.205.2
crowdstrike 5.0.1, 5.0.2
@ctrl/inundación 7.2.1, 7.2.2
@ctrl/plantilla-golang 1.4.2, 1.4.3
@ctrl/enlace magnético 4.0.3, 4.0.4
@ctrl/ngx-codemirror 7.0.1, 7.0.2
@ctrl/ngx-csv 6.0.1, 6.0.2
@ctrl/ngx-emoji-mart 9.2.1, 9.2.2
@ctrl/ngx-clic derecho 4.0.1, 4.0.2
@ctrl/qbittorrent 9.7.1, 9.7.2
@ctrl/react-adsense 2.0.1, 2.0.2
@ctrl/torrent compartido 6.3.1, 6.3.2
@ctrl/color pequeño 4.1.1, 4.1.2
@ctrl/archivo-torrent 4.1.1, 4.1.2
@ctrl/transmisión 7.3.1
@ctrl/ts-base32 4.0.1, 4.0.2
@hestjs/núcleo 0.2.1
@hestjs/cqrs 0.1.6
@hestjs/demo 0.1.2
@hestjs/eslint-config 0.1.2
@hestjs/registrador 0.1.6
@hestjs/escalar 0.1.7
@hestjs/validación 0.1.6
@nativescript-community/arrays de buffers 1.1.6, 1.1.7, 1.1.8
@nativescript-community/gesturehandler 2.0.35
@nativescript-community/perms 3.0.5, 3.0.6, 3.0.7, 3.0.8
@nativescript-community/sqlite 3.5.2, 3.5.3, 3.5.4, 3.5.5
@nativescript-community/texto 1.6.9, 1.6.10, 1.6.11, 1.6.12
@nativescript-community/typeorm 0.2.30, 0.2.31, 0.2.32, 0.2.33
@nativescript-community/ui-collectionview 6.0.6
@nativescript-community/selector-de-documentos-ui 1.1.27, 1.1.28
@nativescript-community/ui-drawer 0.1.30
@nativescript-community/ui-image 4.5.6
@nativescript-community/ui-label 1.3.35, 1.3.36, 1.3.37
@nativescript-community/ui-material-navegación-inferior 7.2.72, 7.2.73, 7.2.74, 7.2.75
@nativescript-community/ui-material-bottomsheet 7.2.72
@nativescript-community/ui-material-core 7.2.72, 7.2.73, 7.2.74, 7.2.75
@nativescript-community/ui-material-core-tabs 7.2.72, 7.2.73, 7.2.74, 7.2.75
@nativescript-community/ui-material-ripple 7.2.72, 7.2.73, 7.2.74, 7.2.75
@nativescript-community/ui-material-tabs 7.2.72, 7.2.73, 7.2.74, 7.2.75
@nativescript-community/ui-pager 14.1.36, 14.1.37, 14.1.38
@nativescript-community/ui-pulltorefresh 2.5.4, 2.5.5, 2.5.6, 2.5.7
@nexe/config-manager 0.1.1
@nexe/eslint-config 0.1.1
@nexe/registrador 0.1.3
@nstudio/angular 20.0.4, 20.0.5, 20.0.6
@nstudio/enfoque 20.0.4, 20.0.5, 20.0.6
@nstudio/nativescript-checkbox 2.0.6, 2.0.7, 2.0.8, 2.0.9
@nstudio/nativescript-indicador-de-carga 5.0.1, 5.0.2, 5.0.3, 5.0.4
@nstudio/colección-vista-de-interfaz-de-usuario 5.1.11, 5.1.12, 5.1.13, 5.1.14
@nstudio/web 20.0.4
@nstudio/web-angular 20.0.4
@nstudio/xplat 20.0.5, 20.0.6, 20.0.7
@nstudio/xplat-utils 20.0.5, 20.0.6, 20.0.7
@operador/tablero 9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46
@operato/datos-grist 9.0.29, 9.0.35, 9.0.36, 9.0.37
@operador/graphql 9.0.22, 9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46
@operato/margen 9.0.2, 9.0.35, 9.0.36, 9.0.37
@operador/ayuda 9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46
@operador/i18n 9.0.35, 9.0.36, 9.0.37
@operador/entrada 9.0.27, 9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46
@operador/diseño 9.0.35, 9.0.36, 9.0.37
@operador/ventana emergente 9.0.22, 9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46
@operato/deslizar para actualizar 9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42
@operador/shell 9.0.22, 9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39
@operato/estilos 9.0.2, 9.0.35, 9.0.36, 9.0.37
@operador/utilidades 9.0.22, 9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46
@teselagen/cargador-de-rebote 0.3.16, 0.3.17
@teselagen/herramientas-liquibase 0.4.1
@teselagen/utilidades-de-rango 0.3.14, 0.3.15
@teselagen/react-list 0.8.19, 0.8.20
@teselagen/tabla-react 6.10.19
@thangved/ventana-de-retroalimentación 1.1.4
@things-factory/base-de-adjuntos 9.0.43, 9.0.44, 9.0.45, 9.0.46, 9.0.47, 9.0.48, 9.0.49, 9.0.50
@cosas-fábrica/autenticación-base 9.0.43, 9.0.44, 9.0.45
@things-factory/correo electrónico base 9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46, 9.0.47, 9.0.48, 9.0.49, 9.0.50, 9.0.51, 9.0.52, 9.0.53, 9.0.54
@cosas-fábrica/env 9.0.42, 9.0.43, 9.0.44, 9.0.45
@cosas-fábrica/base-de-integración 9.0.43, 9.0.44, 9.0.45
@things-factory/mercado-de-integración 9.0.43, 9.0.44, 9.0.45
@cosas-fábrica/cubierta 9.0.43, 9.0.44, 9.0.45
@tnf-dev/api 1.0.8
@tnf-dev/core 1.0.8
@tnf-dev/js 1.0.8
@tnf-dev/mui 1.0.8
@tnf-dev/react 1.0.8
@ui-ux-gang/devextreme-angular-rpk 24.1.7
@yoobic/sistema-de-diseño 6.5.17
@yoobic/cámara-jpeg-es6 1.0.13
@yoobic/yobi 8.7.53
jefe aéreo 0.3.1
piloto aéreo 0.8.8
angulartics2 14.1.1, 14.1.2
descargador-de-controladores-web-para-navegadores 3.0.8
capacitor-notificationhandler 0.0.2, 0.0.3
Complemento del condensador para la aplicación de salud 0.0.2, 0.0.3
complemento-condensador-ihealth 1.1.8, 1.1.9
complemento-condensador-vonage 1.0.2, 1.0.3
capacitorandroidpermisos 0.0.4, 0.0.5
config-cordova 0.8.5
cordova-plugin-voxeet2 1.0.24
Cordova-Voxeet 1.0.32
crear-aplicación-hest 0.1.9
db-evo 1.1.4, 1.1.5
devextreme-angular-rpk 21.2.8
servicios-del-navegador-ember 5.0.2, 5.0.3
formulario sin encabezado 1.1.2, 1.1.3
formulario-sin-cabeza-ember-sí 1.0.1
mesa sin cabecera 2.1.5, 2.1.6
ember-url-hash-polyfill 1.0.12, 1.0.13
velcro de brasón 2.2.1, 2.2.2
encuentro-parque infantil 0.0.2, 0.0.3, 0.0.4, 0.0.5
crowdstrike 11.0.2, 11.0.3
crowdstrike 4.0.3, 4.0.4
eslint-config-teselagen 6.1.7
globalizar-rpk 1.7.4
GraphQL-Sequelize-Teselagen 5.3.8
html-a-base64-imagen 1.0.2
motor-de-reglas-json-simplificado 0.2.1
puerta de salto 0.0.2
koa2-swagger-ui 5.11.1, 5.11.2
mcfly-lanzamiento-semántico 1.3.1
base-de-conocimientos-mcp 0.0.2
mcp-grafo-de-conocimiento 1.2.1
mobioffice-cli 1.0.3
monorepo-siguiente 13.0.1, 13.0.2
mstate-angular 0.4.4
mstate-cli 0.4.7
mstate-dev-react 1.1.1
mstate-react 1.6.5
ng2-archivo-subir 7.0.2, 7.0.3, 8.0.1, 8.0.2, 8.0.3, 9.0.1
ngx-bootstrap 18.1.4, 19.0.3, 19.0.4, 20.0.3, 20.0.4, 20.0.5
ngx-color 10.0.1, 10.0.2
ngx-toastr 19.0.1, 19.0.2
ngx-tendencia 8.0.1
ngx-ws 1.1.5, 1.1.6
oradm-a-gql 35.0.14, 35.0.15
oradm-a-sqlz 1.1.2
Anotación automática de ove 0.0.9
pm2-gelf-json 1.0.4, 1.0.5
printjs-rpk 1.6.1
reaccionar-queja-imagen 0.0.32
React-JSONSchema-Form-Condicionales 0.3.18
crowdstrike 4.0.1, 4.0.2
autenticación rxnt 0.0.3, 0.0.4, 0.0.5, 0.0.6
rxnt-chequeos-de-salud-nestjs 1.0.2, 1.0.3, 1.0.4, 1.0.5
rxnt-kue 1.0.4, 1.0.5, 1.0.6, 1.0.7
swc-componente-plugin-anotar 1.9.1, 1.9.2
tbssnch 1.0.2
Árbol de intervalos de teselagen 1.1.2
generador-de-consultas-cliente-tg 2.14.4, 2.14.5
tg-pájaro rojo 1.3.1
tg-seq-gen 1.0.9, 1.0.10
thangved-react-grid 1.0.3
ts-gaussiano 3.0.5, 3.0.6
ts-importaciones 1.0.1, 1.0.2
tvi-cli 0.1.5
ve-bamreader 0.2.6
ve-editor 1.0.1
verror-extra 6.0.1
kit de llamadas VoIP 1.0.2, 1.0.3
wdio-reportero-web 0.1.3
yargs-ayuda-salida 5.0.3
estilos yoo 6.0.326

La historia continúa...

Asesoramiento sobre remediación

  • Comprueba las versiones que estás utilizando.
  • Limpia tu caché de npm.
  • Reinstala todos los paquetes de tu repositorio.
  • Asegúrate de utilizar un archivo de bloqueo de paquetes y utiliza versiones fijadas.

Cómo saber si estás afectado utilizando el Aikido:

Si eres usuario de Aikido, comprueba tu feed central y filtra los problemas de malware. La vulnerabilidad aparecerá como un problema crítico 100/100 en el feed. Consejo: Aikido vuelve a escanear tus repositorios cada noche, aunque recomendamos activar también un escaneo completo.

Si aún no eres usuario de Aikido, crea una cuenta y conecta tus repositorios. Nuestra cobertura contra malware patentada está incluida en el plan gratuito (no se requiere tarjeta de crédito).

Para protección futura, considere utilizar Aikido SafeChain (código abierto), un envoltorio seguro para npm, npx, yarn... Safechain se integra en sus flujos de trabajo actuales, funciona interceptando los comandos npm, npx, yarn, pnpm y pnpx y verificando los paquetes en busca de malware antes de instalarlos contra Aikido Intel: inteligencia de amenazas de código abierto. Detenga las amenazas antes de que lleguen a su máquina.

4.7/5

Protege tu software ahora.

Empieza gratis
Sin tarjeta
Solicitar una demo
Sus datos no se compartirán · Acceso de solo lectura · No se requiere tarjeta de crédito

Asegúrate ahora.

Proteja su código, la nube y el entorno de ejecución en un único sistema central.
Encuentre y corrija vulnerabilidades de forma rápida y automática.

No se requiere tarjeta de crédito | Resultados del escaneo en 32 segundos.