Aikido

Les attaquants S1ngularity/nx frappent à nouveau

Écrit par
Charlie Eriksen

Ce matin, nous avons été alertés d'une attaque de grande envergure contre npm. Il semble que ce soit l'œuvre des mêmes acteurs de la menace derrière l'attaque Nx du 27 août 2025. Cela a été initialement publié par Socket et StepSecurity qui ont noté que 40 packages avaient été compromis ; depuis, 147 packages supplémentaires ont été infectés par des malwares, y compris des packages de CrowdStrike.

L'ampleur, la portée et l'impact de cette attaque sont importants. Les attaquants utilisent en grande partie le même playbook que l'attaque originale, mais ils ont intensifié leur jeu. Ils l'ont transformé en un ver complet, qui effectue ces actions automatiquement :

  • Voler des secrets et les publier publiquement sur GitHub
  • Exécuter trufflehog et interroger les points de terminaison de métadonnées du cloud pour collecter des secrets
  • Tenter de créer une nouvelle action GitHub avec un mécanisme d'exfiltration de données via webhook[.]site
  • Itérer sur les dépôts GitHub auxquels un utilisateur a accès et les rendre publics

Depuis notre alerte initiale ce matin, nous avons confirmé les comportements supplémentaires et les détails importants suivants. Pour ceux qui l'ignorent, Shai Hulud est le nom du ver dans la franchise Dune. Une indication claire de l'intention des attaquants.

Shai Hulud, de Dune

Pour éviter d'être compromis par des packages comme celui-ci, découvrez Aikido safe-chain !

Ce que fait le ver

  • Collecte : analyse l'hôte et l'environnement CI à la recherche de secrets — process.env, analyse avec TruffleHog, et points de terminaison de métadonnées du cloud (AWS/GCP) qui renvoient les identifiants d'instance/de service.
  • Exfiltration (1) — Dépôt GitHub : crée un dépôt nommé Shai-Hulud sous le compte compromis et y commet un dump JSON contenant les informations système, les variables d'environnement et les secrets collectés.
  • Exfiltrer (2) — GitHub Actions → webhook: dépose un workflow .github/workflows/shai-hulud-workflow.yml qui sérialise ${{ toJSON(secrets) }}, les envoie par POST à un attaquant webhook[.]site URL et écrit une copie en double base64 dans les logs des Actions.
  • Propagation : utilise tous les tokens npm valides qu'il trouve pour énumérer et tenter de mettre à jour les packages que le mainteneur compromis contrôle (propagation dans la chaîne d'approvisionnement).
  • Amplification : parcourt les dépôts accessibles de la victime, les rendant publics ou en ajoutant le workflow/la branche qui déclenchera d'autres exécutions et fuites.

Fuite de secrets

Comme avec l'attaque Nx originale, nous observons les attaquants mener une attaque de type « smash-and-grab ». La charge utile malveillante publie à la fois un dépôt « Shai-Hulud » avec des identifiants/tokens volés, et elle parcourra un compte GitHub pour transformer les dépôts privés en dépôts publics :

Publication d'identifiants volés

Dépôts privés rendus publics

Auto-propagation via npm

L'une des caractéristiques les plus frappantes de cette attaque est qu'elle se comporte comme un véritable ver. Plutôt que de s'appuyer sur un seul package infecté pour se propager, le code est conçu pour se republier dans d'autres packages npm appartenant au mainteneur compromis.

Voici comment fonctionne la logique du ver :

  • Télécharger un tarball cible – il récupère une version de package existante depuis le registre npm.
  • Modifier package.json – le ver incrémente la version de patch (par ex. 1.2.3 → 1.2.4) et insère un nouveau hook de cycle de vie (post-installation)
  • Copier sa propre charge utile – le script en cours d'exécution (process.argv[1]) bundle.js) est écrit dans le tarball en tant que
  • Republier le package troyanisé – le tarball modifié est gzippé et renvoyé vers npm en utilisant les identifiants du mainteneur.

Ce cycle permet au malware d'infecter continuellement chaque package auquel un mainteneur a accès. Chaque package publié devient un nouveau vecteur de distribution : dès qu'il est installé, le ver s'exécute, se réplique et se propage davantage dans l'écosystème.

En bref : l'attaquant n'a pas besoin de cibler manuellement les packages. Une fois qu'un seul environnement est compromis, le ver automatise sa propagation en tirant parti des droits de publication du mainteneur.

Pour une analyse complète du malware, nous vous recommandons de consulter le post getsafety.

Packages impactés

Package Versions
@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

Histoire en cours de développement…

Conseils de remédiation

  • Vérifiez les versions que vous utilisez
  • Nettoyez votre cache npm
  • Réinstallez tous les paquets de votre dépôt
  • Assurez-vous d'utiliser un fichier de verrouillage de paquet et des versions épinglées

Comment savoir si vous êtes affecté en utilisant Aikido :

Si vous êtes un utilisateur d'Aikido, consultez votre flux central et filtrez les problèmes de logiciels malveillants. La vulnérabilité sera affichée comme un problème critique 100/100 dans le flux. Conseil : Aikido réanalyse vos dépôts chaque nuit, bien que nous recommandions de déclencher également une réanalyse complète.

Si vous n'êtes pas encore un utilisateur d'Aikido, créez un compte et connectez vos dépôts. Notre couverture propriétaire des logiciels malveillants est incluse dans le plan gratuit (aucune carte de crédit requise).

Pour une protection future, envisagez d'utiliser Aikido SafeChain (open source), un wrapper sécurisé pour npm, npx, yarn... Safechain s'intègre dans vos workflows actuels, il fonctionne en interceptant les commandes npm, npx, yarn, pnpm et pnpx et en vérifiant les paquets pour détecter les logiciels malveillants avant l'installation, en se basant sur Aikido Intel - Renseignement sur les menaces open source. Arrêtez les menaces avant qu'elles n'atteignent votre machine.

Partager :

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

Abonnez-vous pour les actualités sur les menaces.

Commencez dès aujourd'hui, gratuitement.

Commencer gratuitement
Scannez maintenant
Sans carte bancaire

Sécurisez votre environnement dès maintenant.

Sécurisez votre code, votre cloud et votre environnement d’exécution dans un système centralisé unique.
Détectez et corrigez les vulnérabilités rapidement et automatiquement.

Aucune carte de crédit requise | Résultats en 32 secondes.