Aikido

Los atacantes de S1ngularity/nx atacan de nuevo

Escrito por
Charlie Eriksen

Esta mañana, fuimos alertados de un ataque a gran escala contra npm. Parece ser obra de los mismos actores de amenazas detrás del ataque a Nx el 27 de agosto de 2025. Esto fue publicado originalmente por Socket y StepSecurity, quienes señalaron que 40 paquetes habían sido comprometidos; desde entonces, 147 paquetes adicionales han sido infectados con malware, incluyendo paquetes de CrowdStrike.

La escala, el alcance y el impacto de este ataque son significativos. Los atacantes están utilizando en gran parte la misma estrategia que en el ataque original, pero han intensificado su juego. Lo han convertido en un gusano completo, que realiza estas acciones automáticamente:

  • Robar secretos y publicarlos en GitHub de forma pública
  • Ejecutar trufflehog y consultar los puntos de conexión de metadatos de la nube para recopilar secretos
  • Intentar crear una nueva acción de GitHub con un mecanismo de exfiltración de datos a través de webhook[.]site
  • Iterar los repositorios en GitHub a los que un usuario tiene acceso y hacerlos públicos

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

Shai Hulud, de Dune

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

Lo que hace el gusano

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

Filtración de secretos

Al igual que con el ataque Nx original, estamos viendo a los atacantes realizar un ataque de tipo 'golpe y fuga'. La carga útil maliciosa publica un repositorio "Shai-Hulud" con credenciales/tokens robados, y recorrerá una cuenta de GitHub para convertir repositorios privados en públicos:

Publicación de credenciales robadas

Repositorios privados convertidos en 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 verdadero gusano. En lugar de depender de un único paquete infectado para propagarse, el código está diseñado para republicarse en otros paquetes npm propiedad del mantenedor comprometido.

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

  • Descargar un tarball objetivo – recupera una versión de paquete existente del registro de npm.
  • Modificar package.json – el gusano incrementa la versión de parche (p. ej. 1.2.3 → 1.2.4) e inserta un nuevo hook de ciclo de vida (postinstall)
  • Copia su propio payload – el script en ejecución (process.argv[1]) se escribe en el tarball como bundle.js. Esto asegura que cualquier código que haya infectado un paquete ahora resida dentro del siguiente.
  • Republica el paquete troyanizado – el tarball modificado se comprime con gzip y se vuelve a subir a npm utilizando las credenciales del mantenedor.

Este ciclo permite que el malware infecte continuamente cada paquete al que un mantenedor tiene acceso. 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 atacar paquetes manualmente. Una vez que un único entorno se ve comprometido, el gusano automatiza la propagación aprovechando los propios derechos de publicación del mantenedor.

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

Paquetes afectados

Paquete Versiones
@ahmedhfarag/ngx-perfect-scrollbar 20.0.20
@ahmedhfarag/ngx-virtual-scroller 4.0.4
@art-ws/common 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/db-context 2.0.24
@art-ws/di 2.0.28, 2.0.32
@art-ws/di-node 2.0.13
@art-ws/eslint 1.0.5, 1.0.6
@art-ws/fastify-http-server 2.0.24, 2.0.27
@art-ws/http-server 2.0.21, 2.0.25
@art-ws/openapi 0.1.9, 0.1.12
@art-ws/package-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/ssl-info 1.0.9, 1.0.10
@art-ws/web-app 1.0.3, 1.0.4
@crowdstrike/commitlint 8.1.1, 8.1.2
@crowdstrike/falcon-shoelace 0.4.1, 0.4.2
@crowdstrike/foundry-js 0.19.1, 0.19.2
@crowdstrike/glide-core 0.34.2, 0.34.3
@crowdstrike/logscale-dashboard 1.205.1, 1.205.2
@crowdstrike/logscale-file-editor 1.205.1, 1.205.2
@crowdstrike/logscale-parser-edit 1.205.1, 1.205.2
@crowdstrike/logscale-search 1.205.1, 1.205.2
@crowdstrike/tailwind-toucan-base 5.0.1, 5.0.2
@ctrl/deluge 7.2.1, 7.2.2
@ctrl/golang-template 1.4.2, 1.4.3
@ctrl/magnet-link 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-rightclick 4.0.1, 4.0.2
@ctrl/qbittorrent 9.7.1, 9.7.2
@ctrl/react-adsense 2.0.1, 2.0.2
@ctrl/shared-torrent 6.3.1, 6.3.2
@ctrl/tinycolor 4.1.1, 4.1.2
@ctrl/torrent-file 4.1.1, 4.1.2
@ctrl/transmission 7.3.1
@ctrl/ts-base32 4.0.1, 4.0.2
@hestjs/core 0.2.1
@hestjs/cqrs 0.1.6
@hestjs/demo 0.1.2
@hestjs/eslint-config 0.1.2
@hestjs/logger 0.1.6
@hestjs/scalar 0.1.7
@hestjs/validation 0.1.6
@nativescript-community/arraybuffers 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/text 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/ui-document-picker 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-bottom-navigation 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/logger 0.1.3
@nstudio/angular 20.0.4, 20.0.5, 20.0.6
@nstudio/focus 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-loading-indicator 5.0.1, 5.0.2, 5.0.3, 5.0.4
@nstudio/ui-collectionview 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
@operato/board 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/data-grist 9.0.29, 9.0.35, 9.0.36, 9.0.37
@operato/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/headroom 9.0.2, 9.0.35, 9.0.36, 9.0.37
@operato/help 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/i18n 9.0.35, 9.0.36, 9.0.37
@operato/input 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
@operato/layout 9.0.35, 9.0.36, 9.0.37
@operato/popup 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/pull-to-refresh 9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42
@operato/shell 9.0.22, 9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39
@operato/styles 9.0.2, 9.0.35, 9.0.36, 9.0.37
@operato/utils 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/bounce-loader 0.3.16, 0.3.17
@teselagen/liquibase-tools 0.4.1
@teselagen/range-utils 0.3.14, 0.3.15
@teselagen/react-list 0.8.19, 0.8.20
@teselagen/react-table 6.10.19
@thangved/callback-window 1.1.4
@things-factory/attachment-base 9.0.43, 9.0.44, 9.0.45, 9.0.46, 9.0.47, 9.0.48, 9.0.49, 9.0.50
@things-factory/auth-base 9.0.43, 9.0.44, 9.0.45
@things-factory/email-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
@things-factory/env 9.0.42, 9.0.43, 9.0.44, 9.0.45
@things-factory/integration-base 9.0.43, 9.0.44, 9.0.45
@things-factory/integration-marketplace 9.0.43, 9.0.44, 9.0.45
@things-factory/shell 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/design-system 6.5.17
@yoobic/jpeg-camera-es6 1.0.13
@yoobic/yobi 8.7.53
airchief 0.3.1
airpilot 0.8.8
angulartics2 14.1.1, 14.1.2
browser-webdriver-downloader 3.0.8
capacitor-notificationhandler 0.0.2, 0.0.3
capacitor-plugin-healthapp 0.0.2, 0.0.3
capacitor-plugin-ihealth 1.1.8, 1.1.9
capacitor-plugin-vonage 1.0.2, 1.0.3
capacitorandroidpermissions 0.0.4, 0.0.5
config-cordova 0.8.5
cordova-plugin-voxeet2 1.0.24
cordova-voxeet 1.0.32
create-hest-app 0.1.9
db-evo 1.1.4, 1.1.5
devextreme-angular-rpk 21.2.8
ember-browser-services 5.0.2, 5.0.3
ember-headless-form 1.1.2, 1.1.3
ember-headless-form-yup 1.0.1
ember-headless-table 2.1.5, 2.1.6
ember-url-hash-polyfill 1.0.12, 1.0.13
ember-velcro 2.2.1, 2.2.2
encounter-playground 0.0.2, 0.0.3, 0.0.4, 0.0.5
eslint-config-crowdstrike 11.0.2, 11.0.3
eslint-config-crowdstrike-node 4.0.3, 4.0.4
eslint-config-teselagen 6.1.7
globalize-rpk 1.7.4
graphql-sequelize-teselagen 5.3.8
html-to-base64-image 1.0.2
json-rules-engine-simplified 0.2.1
jumpgate 0.0.2
koa2-swagger-ui 5.11.1, 5.11.2
mcfly-semantic-release 1.3.1
mcp-knowledge-base 0.0.2
mcp-knowledge-graph 1.2.1
mobioffice-cli 1.0.3
monorepo-next 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-file-upload 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-trend 8.0.1
ngx-ws 1.1.5, 1.1.6
oradm-to-gql 35.0.14, 35.0.15
oradm-to-sqlz 1.1.2
ove-auto-annotate 0.0.9
pm2-gelf-json 1.0.4, 1.0.5
printjs-rpk 1.6.1
react-complaint-image 0.0.32
react-jsonschema-form-conditionals 0.3.18
remark-preset-lint-crowdstrike 4.0.1, 4.0.2
rxnt-authentication 0.0.3, 0.0.4, 0.0.5, 0.0.6
rxnt-healthchecks-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-plugin-component-annotate 1.9.1, 1.9.2
tbssnch 1.0.2
teselagen-interval-tree 1.1.2
tg-client-query-builder 2.14.4, 2.14.5
tg-redbird 1.3.1
tg-seq-gen 1.0.9, 1.0.10
thangved-react-grid 1.0.3
ts-gaussian 3.0.5, 3.0.6
ts-imports 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
voip-callkit 1.0.2, 1.0.3
wdio-web-reporter 0.1.3
yargs-help-output 5.0.3
yoo-styles 6.0.326

Noticia en desarrollo…

Consejos de remediación

  • Compruebe las versiones que está utilizando
  • Limpie su caché de npm
  • Reinstale todos los paquetes de su repositorio
  • Asegúrese de utilizar un archivo de bloqueo de paquetes y versiones fijadas

Cómo saber si está afectado usando Aikido:

Si es usuario de Aikido, revise su feed central y filtre por problemas de malware. La vulnerabilidad aparecerá como un problema crítico de 100/100 en el feed. Consejo: Aikido vuelve a escanear sus repositorios cada noche, aunque recomendamos activar un reescaneo completo también.

Si aún no es usuario de Aikido, configure una cuenta y conecte sus repositorios. Nuestra cobertura de malware propietaria está incluida en el plan gratuito (sin tarjeta).

Para una protección futura, considere usar Aikido SafeChain (código abierto), un envoltorio seguro para npm, npx, yarn... Safechain se integra en sus flujos de trabajo actuales, funcionando al interceptar los comandos npm, npx, yarn, pnpm y pnpx, y verificando los paquetes en busca de malware antes de la instalación, contrastándolos con Aikido Intel - Open Sources Threat Intelligence. Detenga las amenazas antes de que lleguen a su máquina.

Compartir:

https://www.aikido.dev/blog/s1ngularity-nx-attackers-strike-again

Suscríbase para recibir noticias sobre amenazas.

Empieza hoy mismo, gratis.

Empieza gratis
Escanear ahora
Sin tarjeta

Asegura tu plataforma ahora

Protege tu código, la nube y el entorno de ejecución en un único sistema central.
Encuentra y corrije vulnerabilidades de forma rápida y automática.

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