Aikido

Les attaquants S1ngularity/nx frappent à nouveau

Charlie EriksenCharlie Eriksen
|
#

Ce matin, nous avons été alertés d'une attaque à grande échelle contre npm. Il semble qu'il s'agisse du même groupe de cybercriminels que celui responsable de l'attaque Nx du 27 août 2025. Cet article a été initialement publié par Socket et StepSecurity, qui ont signalé que 40 paquets avaient été compromis. Depuis, 147 paquets supplémentaires ont été infectés par des logiciels malveillants, notamment des paquets provenant de CrowdStrike.

L'ampleur, la portée et l'impact de cette attaque sont considérables. Les pirates utilisent en grande partie la même stratégie que lors de l'attaque initiale, mais ont intensifié leurs efforts. Ils ont transformé leur attaque en un ver complet, qui effectue automatiquement les opérations suivantes :

  • Voler des secrets et les publier publiquement sur GitHub
  • Exécutez trufflehog et interrogez les points de terminaison Cloud pour collecter les secrets.
  • Tentative de création d'une nouvelle action GitHub avec un mécanisme d'extraction de données via webhook[.]site
  • Parcourir les référentiels GitHub auxquels un utilisateur a accès et les rendre publics.

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

Shai Hulud, tiré de Dune

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

Ce que fait le ver

  • Harvest: analyse l'hôte et l'environnement CI à la recherche de secrets — process.env, analyse avec TruffleHog et points de terminaison cloud (AWS/GCP) qui renvoient les informations d'identification des instances/services.
  • Exfiltrate (1) — Référentiel GitHub: crée un référentiel nommé Shai-Hulud sous le compte compromis et valide un dump JSON contenant des informations système, des variables d'environnement et des secrets collectés.
  • Exfiltrer (2) — GitHub Actions → webhook: supprime un flux de travail .github/workflows/shai-hulud-workflow.yml qui sérialise ${{ toJSON(secrets) }}, les envoie à un attaquant webhook[.]site URL et écrit une copie double base64 dans les journaux Actions.
  • Propagation: utilise tous les jetons npm valides qu'il trouve pour énumérer et tenter de mettre à jour les paquets contrôlés par le responsable compromis (propagation dans la chaîne d'approvisionnement).
  • Amplifier: itère les référentiels accessibles de la victime, les rendant publics ou ajoutant le flux de travail/la branche qui déclenchera d'autres exécutions et fuites.

Divulgation de secrets

Comme pour l'attaque Nx originale, nous constatons que les pirates informatiques mènent une attaque de type « smash-and-grab » (casse et vol). La charge utile malveillante publie à la fois un référentiel « Shai-Hulud » contenant des identifiants/jetons volés, et passe par un compte GitHub pour rendre public un référentiel privé :

Publication d'identifiants volés

Les référentiels privés devenant 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 compter sur un seul paquet infecté pour se propager, le code est conçu pour se republier dans d'autres paquets npm appartenant au responsable compromis.

Voici comment fonctionne la logique du ver :

  • Télécharger une archive tar cible – cela permet de récupérer une version existante du paquet depuis le registre npm.
  • Modifier package.json – le ver modifie la version du correctif (par exemple 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 d'exécution (process.argv[1]) est écrit dans l'archive tar sous la forme bundle.js. Cela garantit que tout code ayant infecté un paquet se retrouve désormais dans le suivant.
  • Republier le paquet trojanisé – l'archive modifiée est compressée au format gzip et renvoyée vers npm à l'aide des identifiants du responsable.

Ce cycle permet au logiciel malveillant d'infecter en continu tous les paquets auxquels un responsable a accès. Chaque paquet publié devient un nouveau vecteur de distribution : dès que quelqu'un l'installe, 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 paquets. Une fois qu'un environnement est compromis, le ver automatise la propagation en exploitant les droits de publication du responsable de la maintenance.

Pour une analyse complète du logiciel malveillant, nous vous recommandons de consulter l'article de getsafety .

Colis bloqués

Paquet Versions
@ahmedhfarag/ngx-perfect-scrollbar 20.0.20
@ahmedhfarag/ngx-virtual-scroller 4.0.4
@art-ws/commun 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/serveur-http 2.0.21, 2.0.25
@art-ws/openapi 0.1.9, 0.1.12
@art-ws/base-du-paquet 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/application-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/déluge 7.2.1, 7.2.2
@ctrl/golang-template 1.4.2, 1.4.3
@ctrl/lien magnétique 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 droit 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-partagé 6.3.1, 6.3.2
@ctrl/tinycolor 4.1.1, 4.1.2
@ctrl/fichier-torrent 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/démo 0.1.2
@hestjs/eslint-config 0.1.2
@hestjs/logger 0.1.6
@hestjs/scalaire 0.1.7
@hestjs/validation 0.1.6
@nativescript-community/tableaux-de-tampons 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/texte 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/tableau 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/données-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/marge 9.0.2, 9.0.35, 9.0.36, 9.0.37
@operato/aide 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
@opérateur/entrée 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/mise en page 9.0.35, 9.0.36, 9.0.37
@opérateur/fenêtre contextuelle 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/tirer-pour-actualiser 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/utilitaires 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/outils-de-gamme 0.3.14, 0.3.15
@teselagen/réaction-liste 0.8.19, 0.8.20
@teselagen/tableau-réactif 6.10.19
@thangved/fenêtre-de-rappel 1.1.4
@things-factory/base-de-pièces-jointes 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/base-email 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/base-d'intégration 9.0.43, 9.0.44, 9.0.45
@things-factory/marché-de-l'intégration 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/système-de-conception 6.5.17
@yoobic/jpeg-camera-es6 1.0.13
@yoobic/yobi 8.7.53
chef de l'armée de l'air 0.3.1
pilote aérien 0.8.8
angulartics2 14.1.1, 14.1.2
navigateur-pilote-de-navigation-téléchargeur 3.0.8
gestionnaire-de-notifications-condensateur 0.0.2, 0.0.3
plugin-condensateur-santé 0.0.2, 0.0.3
capacitor-plugin-ihealth 1.1.8, 1.1.9
plugin-condensateur-vonage 1.0.2, 1.0.3
condensateurandroidautorisations 0.0.4, 0.0.5
config-cordova 0.8.5
cordova-plugin-voxeet2 1.0.24
cordova-voxeet 1.0.32
créer-hest-app 0.1.9
db-evo 1.1.4, 1.1.5
devextreme-angular-rpk 21.2.8
services-navigateur-ember 5.0.2, 5.0.3
formulaire sans en-tête 1.1.2, 1.1.3
formulaire-sans-tête-ember-yup 1.0.1
table sans tête de braise 2.1.5, 2.1.6
ember-url-hash-polyfill 1.0.12, 1.0.13
velcro à picots 2.2.1, 2.2.2
terrain de rencontre 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
globaliser-rpk 1.7.4
graphql-sequelize-test 5.3.8
html-vers-base64-image 1.0.2
moteur-de-règles-json-simplifié 0.2.1
portail de saut 0.0.2
koa2-swagger-ui 5.11.1, 5.11.2
mcfly-semantic-release 1.3.1
base-de-connaissances-mcp 0.0.2
mcp-graphique-de-connaissances 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-téléchargement-de-fichier 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-couleur 10.0.1, 10.0.2
ngx-toastr 19.0.1, 19.0.2
ngx-tendance 8.0.1
ngx-ws 1.1.5, 1.1.6
oradm-vers-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
image de plainte React 0.0.32
réactif-jsonschema-formulaire-conditionnels 0.3.18
crowdstrike 4.0.1, 4.0.2
authentification rxnt 0.0.3, 0.0.4, 0.0.5, 0.0.6
rxnt-contrôles-de-santé-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-composant-annotate 1.9.1, 1.9.2
tbssnch 1.0.2
arbre-intervalle-teselagen 1.1.2
générateur-de-requêtes-client-tg 2.14.4, 2.14.5
tg-redbird 1.3.1
tg-seq-gen 1.0.9, 1.0.10
thangved-réaction-grille 1.0.3
ts-gaussien 3.0.5, 3.0.6
ts-importations 1.0.1, 1.0.2
tvi-cli 0.1.5
ve-bamreader 0.2.6
ve-éditeur 1.0.1
verror-supplémentaire 6.0.1
kit d'appel VoIP 1.0.2, 1.0.3
wdio-web-reporter 0.1.3
yargs-aide-sortie 5.0.3
yoo-styles 6.0.326

L'histoire se développe...

Conseils en matière d'assainissement

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

Comment savoir si vous êtes concerné par Aikido:

Si vous Aikido , vérifiez votre flux central et filtrez les problèmes liés aux logiciels malveillants. La vulnérabilité apparaîtra comme un problème critique 100/100 dans le flux. Conseil: Aikido vos référentiels chaque nuit, mais nous vous recommandons également de lancer une analyse complète.

Si vous n'êtes pas encore Aikido , créez un compte et connectez vos dépôts. Notre couverture anti-malware exclusive est incluse dans l'offre gratuite (aucune carte de crédit requise).

Pour vous protéger à l'avenir, pensez à utiliser Aikido (open source), un wrapper sécurisé pour npm, npx, yarn... Safechain s'intègre à vos workflows actuels. Il intercepte les commandes npm, npx, yarn, pnpm et pnpx et vérifie l'absence de logiciels malveillants dans les paquets avant leur installation par rapport à Aikido - Open Sources renseignement sur les menaces. Arrêtez les menaces avant qu'elles n'atteignent votre machine.

4.7/5

Sécurisez votre logiciel dès maintenant.

Essai gratuit
Sans CB
Réservez une démo
Vos données ne seront pas partagées - Accès en lecture seule - Pas de CB nécessaire

Sécurisez-vous maintenant.

Sécuriser votre code, votre cloud et votre runtime dans un système centralisé unique.
Détectez et corrigez les vulnérabilités rapidement et automatiquement.

Pas de carte de crédit requise | Résultats du scan en 32 secondes.