Le 4 août, des versions malveillantes de keyv, flat-cache, file-entry-cache et de plusieurs paquets de l’écosystème Cacheable ont été publiées sur npm. Elles exécutent un voleur d’identifiants dès le npm install, puis utilisent les jetons dérobés pour infecter d’autres paquets. Endor Labs comptait le soir même 1 136 versions piégées dans 384 paquets, un chiffre présenté comme un minimum.
Ces bibliothèques sont rarement installées directement : ce sont des dépendances transitives de très nombreux outils JavaScript. Les paquets « source » cumulent environ 515 millions de téléchargements hebdomadaires, doublons de l’arbre de dépendances inclus.
Les versions piégées connues
| Paquet | Version malveillante |
|---|---|
| keyv | 6.0.0 |
| flat-cache | 6.1.24 |
| file-entry-cache | 11.1.6 |
| cacheable-request | 13.0.20 |
| cacheable | 2.5.1 |
| @cacheable/utils | 2.5.1 |
| @cacheable/memory | 2.2.1 |
| @cacheable/node-cache | 3.1.2 |
| @cacheable/net | 2.1.1 |
| cache-manager | 7.2.10 |
| ecto | 5.0.1 |
Le ver a ensuite été republié sous d’autres comptes de mainteneurs, y compris dans les scopes npm de plusieurs entreprises (@qlik/*, @picsart/*, @servicetitan/*…). Selon Endor Labs, ces organisations n’ont pas été piratées elles-mêmes : ce sont leurs jetons de publication qui ont été volés. La liste évolue d’heure en heure ; référez-vous aux listes tenues par Endor Labs et Datadog.
Comment fonctionne le ver
- Chaque version piégée ajoute un script
"preinstall": "node setup.mjs". setup.mjstélécharge le runtime Bun 1.3.13 depuis ses releases officielles, puis lance une charge obfusquée d’environ 727 Ko (Math_Symbol.jsoumath_init.js).- Celle-ci récupère identifiants AWS, jetons npm et GitHub (y compris les jetons
ghs_des GitHub Actions), secrets Kubernetes et Vault, variables d’environnement et sortie degh auth token. - Selon Datadog, les données sont chiffrées et envoyées vers des domaines de commande dont l’adresse est lue dans un smart contract Ethereum, avec un dépôt GitHub public en solution de repli.
- Avec les jetons npm volés, le ver publie des versions infectées d’autres paquets ; avec les accès GitHub, il ajoute des hooks dans
.claudeet.vscodepour se relancer.
Détail qui doit faire réfléchir : la première vague a été publiée par le pipeline officiel du projet (publication de confiance via GitHub Actions OIDC), après un commit malveillant sur main. Ces paquets portent donc une signature npm et une provenance SLSA valides. La provenance prouve d’où vient un paquet, pas qu’il est sain.
Toute machine ou tout runner de CI qui a lancé npm install avec les scripts activés après le 4 août, 9 h 30 UTC, sur un projet qui tire ces paquets doit être considéré comme compromis.
Vérifier un projet ou un poste
# Quelles versions de ces paquets sont dans l'arbre (dépendances transitives comprises) ?
npm ls keyv flat-cache file-entry-cache cacheable-request cacheable cache-manager --all
# Traces de persistance signalées par Datadog
ls -la ~/.config/gh-token-monitor ~/.config/systemd/user/gh-token-monitor.service 2>/dev/null
# En CI : installer sans exécuter les scripts preinstall/postinstall
npm ci --ignore-scripts
Cherchez aussi les versions listées dans vos lockfiles et dans les journaux de CI, devDependencies comprises : une version propre aujourd’hui ne prouve pas qu’une version piégée n’a jamais été installée.
Si vous êtes touché
- Épinglez ou ramenez les paquets concernés à une version publiée avant le 4 août, 9 h 30 UTC, au besoin avec le champ
overrides(npm) ou équivalent (yarn, pnpm), puisqu’il s’agit souvent de dépendances transitives. - Révoquez et recréez les jetons npm, les PAT GitHub, les clés cloud, les secrets de CI et les jetons Vault accessibles depuis la machine.
- Inspectez vos dépôts GitHub : nouveaux workflows, dossiers
.claudeou.vscodeajoutés, commits non signés inattendus. - Vérifiez si des paquets que vous publiez ont reçu des versions que vous n’avez pas faites.
La leçon durable : désactivez les scripts d’installation par défaut en CI (--ignore-scripts), limitez les droits et la durée de vie des jetons de publication, et n’adoptez pas une nouvelle version le jour de sa sortie. Un délai de quelques jours suffit à éviter la plupart de ces campagnes.