Aller au contenu
THE GUILD
0%
Services Produits Carrières À Propos Blog FAQ Contact
Shai-Hulud : Quand NPM attrape un virus qui se propage vraiment comme un virus

Trois fois en une seule semaine. Trois. Fois. À ce stade, je commence à penser que NPM signifie « Never-ending Pwning Machine » parce que sacré vulnérabilités de sécurité, Batman — nous avons une autre attaque de chaîne d’approvisionnement, et celle-ci est chef’s kiss absolument diabolique.

Voici Shai-Hulud (oui, c’est le vrai nom de code — nommé d’après les vers géants des sables de Dune, parce qu’apparemment les hackers sont maintenant dans les références de science-fiction). Ce n’est pas votre situation classique « oups, j’ai téléchargé un paquet malveillant ». Non, non, non. C’est une pandémie numérique auto-réplicante qui se propage de dépôt en dépôt comme si elle essayait de gagner le Prix Nobel pour la façon la plus créative de ruiner la journée de tout le monde.

Le retournement de situation qui fait pleurer les ingénieurs sécurité

Vous vous souvenez du bon vieux temps où les malwares étaient simples ? Téléchargez un mauvais paquet, le malware vole vos tokens, fin de partie. Shai-Hulud a dit « tiens ma bière » et a décidé d’innover de la pire façon possible.

Cette beauté ne se contente pas de voler vos identifiants et d’en finir là. Elle utilise vos tokens volés pour infecter d’autres dépôts. C’est comme si un cambrioleur ne se contentait pas de vous voler, mais utilisait vos clés pour voler tous vos voisins, qui se feraient ensuite voler leurs clés pour voler leurs voisins, et ainsi de suite jusqu’à ce que votre ville entière soit juste une énorme scène de crime.

Visualisation de la propagation d'infection des paquets NPM Les paquets majeurs compromis dans l’attaque Shai-Hulud incluent @ctrl/tinycolor, @crowdstrike/falcon-shoelace, ngx-bootstrap, et plus de 180 autres. L’attaque a ciblé des bibliothèques populaires à travers plusieurs mainteneurs, des composants UI aux outils de sécurité, démontrant la portée massive de cette brèche de chaîne d’approvisionnement. Source : OX Security

L’attaque a commencé avec un humble paquet déprécié appelé rxnt-authentication qui n’avait pas vu de mises à jour depuis des lustres. Puis soudainement — twist ! — les versions 0.0.5 et 0.0.6 sont apparues comme des fantômes numériques, portant leur payload malveillant dans la nature.

L’anatomie du darwinisme numérique

Voici où ça devient techniquement fascinant (et terrifiant) :

Étape 1 : L’hameçon du phishing Un pauvre développeur a probablement reçu un email convaincant : « Hé, vous devez mettre à jour votre token npm pour des raisons de sécurité ! Cliquez ici ! » Clic. Fin de partie.

Étape 2 : Le cheval de Troie Les attaquants poussent des versions malveillantes en utilisant des mises à jour de patch (parce qu’apparemment nous n’avons toujours pas appris à ne pas mettre à niveau automatiquement les versions de patch — sérieusement, les gens, VERROUILLEZ VOS VERSIONS).

Étape 3 : Le parasite numérique Une fois installé, le paquet exécute un script post-install qui déploie quelque chose appelé « Truffle Hog » — qui, parenthèse, est à la fois un excellent nom et un outil de sécurité légitime qui scanne les identifiants qui ont fuité. Sauf que maintenant il est utilisé pour le mal au lieu du bien. C’est comme regarder Superman devenir braqueur de banque.

Étape 4 : La propagation virale Voici le chef-d’œuvre : Au lieu de juste exfiltrer vos tokens vers un serveur distant, Shai-Hulud se met immédiatement au travail sur vos dépôts GitHub. Il :

  • Met à jour vos pipelines CI/CD
  • Modifie vos fichiers package.json
  • Publie de nouvelles versions « patch » de vos paquets
  • S’inclut lui-même dans les nouvelles versions

Rincez, répétez, croissance exponentielle. C’est comme un schéma pyramidal, mais pour les malwares.

Le jeu des chiffres (Spoiler : On perd)

L’attaque a commencé avec 40 paquets compromis. En quelques heures, ce nombre a grimpé à plus de 180. À ce rythme de croissance, la semaine prochaine nous aurons plus de paquets infectés qu’il n’y a d’atomes dans l’univers observable. (Okay, c’est de l’hyperbole, mais la croissance exponentielle est vraiment terrifiante.)

Graphique de croissance de l'infection des paquets

Mais attendez — il y a plus ! Parmi les victimes, nous avons le joyau de l’ironie : CrowdStrike !

Oui, vous avez bien lu. Le même CrowdStrike qui vend des solutions de sécurité et nous a donné le grand incident de l’écran bleu de la mort plus tôt cette année est maintenant — roulement de tambour s’il vous plaît — en train de distribuer accidentellement des attaques de vers à travers leurs paquets npm. Spécifiquement, l’attaque a compromis :

  • @crowdstrike/commitlint (versions 8.1.1, 8.1.2)
  • @crowdstrike/falcon-shoelace (versions 0.4.1, 0.4.2)
  • @crowdstrike/foundry-js (versions 0.19.1, 0.19.2)
  • @crowdstrike/glide-core (versions 0.34.2, 0.34.3)
  • @crowdstrike/logscale-dashboard (versions 1.205.1, 1.205.2)
  • @crowdstrike/tailwind-toucan-base (versions 5.0.1, 5.0.2)

Vous ne pouvez littéralement pas inventer ça. L’univers a un sens de l’humour, et ce sens de l’humour est apparemment très, très noir.

La tragédie de « Tiny Color »

Une autre victime digne de mention est le populaire paquet tiny-color, qui a été touché via les identifiants compromis de son mainteneur. Les versions 4.11 et 4.12 ont été infectées, mais dans un bel acte d’humour défiant, la version sécurisée a été publiée comme… 4.20.

Chef’s kiss à celui qui a pris cette décision de numéro de version. Au milieu du chaos, quelqu’un a quand même eu le temps de faire une blague.

L’enfer des dépendances que nous avons créé

Cette attaque met en lumière quelque chose que nous avons volontairement ignoré : nos arbres de dépendances sont insensés. Nous importons des bibliothèques entières pour utiliser des fonctions uniques. Besoin de remplir une chaîne de caractères ? Importez left-pad. Besoin de vérifier si quelque chose est un nombre ? Importez is-number. Besoin de convertir HSV en RGB ? Importez encore un autre paquet avec 47 dépendances transitives.

À l’ère de l’IA, où vous pouvez littéralement demander à ChatGPT « écris-moi une fonction left-pad » et obtenir une implémentation fonctionnelle en 3 secondes, pourquoi jouons-nous encore à la roulette russe des dépendances ?

L’addiction à la mise à jour automatique

Pouvons-nous parler de la mise à jour automatique des versions de patch ? ARRÊTEZ. Juste… arrêtez. C’est comme la troisième attaque majeure cette année qui reposait sur les mises à jour automatiques des versions de patch. C’est 2025, et nous faisons encore la même erreur encore et encore.

Verrouillez vos versions. Oui, c’est plus de travail. Oui, vous manquerez quelques corrections de bugs. Mais vous savez ce que vous ne manquerez pas ? Installer accidentellement des malwares auto-réplicants.

Voici le truc : même si vous êtes un bon citoyen et verrouillez vos versions, vous êtes toujours vulnérable parce que les gestionnaires de paquets sont des cauchemars récursifs. Vous dépendez du paquet A, qui dépend du paquet B, qui se met automatiquement à jour pour inclure un malware, qui infecte ensuite votre projet de toute façon.

C’est des dépendances jusqu’au bout, et chaque niveau est un vecteur d’attaque potentiel.

L’impact réel

Ce n’est pas que théorique. De vraies entreprises, de vrais projets, de vrais environnements de production ont été touchés. L’attaque a ciblé :

  • Des environnements de développement avec des tokens GitHub exposés
  • Des pipelines CI/CD avec des identifiants de publication
  • Des machines de développeurs locaux avec de l’authentification en cache

Si vous aviez des tokens npm qui traînaient quelque part — dans vos variables d’environnement, votre config CI, les mots de passe enregistrés de votre navigateur — Shai-Hulud venait les chercher.

Stratégies de défense (Ou : Comment ne pas se faire pwner)

1. Tout verrouiller

{
  "dependencies": {
    "some-package": "1.2.3",  // Version exacte, pas de tildes, pas de carets
    "another-package": "4.5.6"
  }
}

2. Auditer comme si votre vie en dépendait Exécutez npm audit religieusement. Mettez en place un scan automatisé des dépendances. Traitez votre package.json comme s’il contenait des codes de lancement nucléaire.

3. Minimiser les dépendances Demandez-vous : « Ai-je vraiment besoin d’un paquet pour vérifier si un nombre est impair ? » La réponse est probablement non.

4. Faire tourner vos tokens Si vous n’avez pas fait tourner vos tokens npm récemment, faites-le maintenant. Si vous avez des tokens de 2019 qui traînent encore, supprimez-les hier.

5. Surveiller vos paquets Si vous maintenez des paquets, configurez des alertes pour les publications inattendues. Si la version 3.1.4 apparaît soudainement et que vous ne l’avez pas publiée, c’est un drapeau rouge de la taille du Texas.

La vue d’ensemble

Shai-Hulud représente une évolution dans les attaques de chaîne d’approvisionnement. Ce n’est pas juste un malware — c’est un malware auto-propageant. C’est ce qui se passe quand les attaquants étudient les effets de réseau et les appliquent à la cybercriminalité.

Cette attaque a réussi parce qu’elle a exploité plusieurs problèmes systémiques :

  • Sur-dépendance aux mises à jour automatiques de dépendances
  • Mauvaise hygiène des tokens à travers l’écosystème
  • La nature interconnectée de la gestion moderne des paquets
  • La tendance des développeurs à faire confiance implicitement aux mises à jour de patch

Ce que cela signifie pour l’avenir

Nous sommes à un point d’inflexion. Soit nous prenons collectivement la sécurité de la chaîne d’approvisionnement au sérieux, soit nous allons voir plus d’attaques comme celle-ci. Shai-Hulud a prouvé que l’écosystème npm peut être transformé en arme en une plateforme d’attaque distribuée.

La prochaine attaque pourrait être pire. Elle pourrait cibler des images Docker, ou des paquets Python, ou des crates Rust. Elle pourrait persister plus longtemps, se propager plus vite, ou causer plus de dégâts.

Le côté positif

Il y a quand même de bonnes nouvelles : Cette attaque a été attrapée relativement rapidement, les paquets affectés sont nettoyés, et la communauté sécurité répond rapidement avec de meilleurs outils de détection et pratiques.

Aussi, nous recevons tous un cours intensif en sécurité de chaîne d’approvisionnement qu’on le veuille ou non. Rien n’enseigne la programmation défensive comme regarder tout votre écosystème se faire pwner par un virus de paquet auto-réplicant.

Leçons apprises (à la dure)

  1. Les mises à jour automatiques sont pratiques jusqu’à ce qu’elles soient catastrophiques
  2. Chaque dépendance est un vecteur d’attaque potentiel
  3. La rotation des tokens n’est pas optionnelle — elle est essentielle
  4. Le coût d’écrire vos propres fonctions utilitaires est maintenant inférieur au risque de les importer
  5. La sécurité n’est pas le problème de quelqu’un d’autre — c’est le problème de tout le monde

Réflexions finales

Alors que j’écris ceci, le nettoyage de Shai-Hulud est en cours. Les paquets sont patchés, les tokens sont renouvelés, et les développeurs partout ont des conversations inconfortables sur leurs pratiques de gestion de dépendances.

L’attaque était brillante dans sa simplicité et terrifiante dans son efficacité. Elle a transformé la plus grande force de npm — son écosystème interconnecté — en sa plus grande vulnérabilité.

Mais voilà : nous pouvons apprendre de cela. Nous pouvons construire de meilleurs outils, implémenter de meilleures pratiques et créer des systèmes plus résilients. Ou nous pouvons ignorer les leçons et attendre Shai-Hulud 2.0.

Le choix est le nôtre. Faisons-en un bon choix.

Restez vigilants, gardez vos dépendances verrouillées, et rappelez-vous : dans le monde de la gestion de paquets, la paranoïa n’est pas un bug — c’est une fonctionnalité.


Ressources :

Mettez à jour vos paquets de façon responsable, les amis. L’écosystème en dépend.