Une nouvelle classe de vers exploitant la réutilisation de tokens
Les incidents de la chaîne d’approvisionnement npm d’avril 2026 représentent une escalade structurelle par rapport aux attaques précédentes. Des campagnes antérieures — notamment le ver Shai-Hulud de novembre 2025 et l’incident pgserve de janvier 2026 — avaient démontré que les vers npm auto-propagants étaient techniquement faisables. CanisterWorm démontre que ce schéma d’attaque a été affiné, mis à l’échelle et déployé contre une nouvelle catégorie de cibles : l’écosystème des développeurs d’IA agentique.
La première version empoisonnée de la campagne CanisterWorm a fait surface le 8 avril 2026, lorsqu’une version corrompue du package pgserve a atteint le registre. Au 21 avril, l’attaque s’était étendue à la suite de packages d’IA agentique de Namastex Labs — @automagik/genie, @fairwords/websocket, et au moins 20 packages supplémentaires — totalisant 22 packages compromis ou plus dans une campagne coordonnée unique.
Ce qui distingue CanisterWorm d’un package malveillant conventionnel est le mécanisme d’auto-propagation. Le script postinstall malveillant ne se contente pas d’exfiltrer des identifiants vers un serveur de commande et contrôle. Il récupère le token d’authentification npm du développeur victime, utilise ce token pour publier des mises à jour malveillantes dans chaque package du compte de la victime, et se lance comme un processus d’arrière-plan entièrement détaché — ce qui signifie que le ver continue de fonctionner et de se propager même après la fin de la session d’installation npm du développeur. Chaque nouveau développeur victime qui installe un package compromis d’un mainteneur légitime et réputé devient le prochain nœud de propagation.
L’infrastructure d’attaque utilise des canisters ICP (Internet Computer Protocol) — des contrats intelligents décentralisés sur la blockchain ICP — pour la livraison de charge utile et l’exfiltration des identifiants. Ce choix d’infrastructure est délibéré : les canisters ICP sont difficiles à neutraliser rapidement car il n’y a pas de serveur central à saisir ni de domaine à bloquer. La note de recherche CanisterSprawl de la Cloud Security Alliance a confirmé un fort chevauchement technique avec les campagnes précédentes du groupe TeamPCP, incluant des schémas d’infrastructure ICP partagés et une référence explicite dans le code à une « méthode TeamPCP/LiteLLM ».
Ce que le ver dérobe concrètement
Le script postinstall malveillant effectue une collecte systématique des identifiants depuis l’environnement local du développeur. Il recherche spécifiquement dans les variables d’environnement les noms liés aux tokens et cible les fichiers et répertoires locaux suivants :
Fichiers de credentials npm : .npmrc (contenant les tokens d’authentification npm), les tokens de registre délimités, les tokens d’organisation pour les registres privés. Avec un token npm valide, l’attaquant peut publier dans n’importe quel package maintenu par le développeur — y compris les packages organisationnels privés et les bibliothèques open source populaires avec des millions de téléchargements hebdomadaires.
Credentials Git et cloud : .git-credentials, .netrc, clés SSH privées, et fichiers de credentials de services cloud pour AWS, GCP et Azure. La campagne positionne simultanément l’attaquant pour accéder aux dépôts de code de la victime, aux pipelines CI/CD et à l’infrastructure cloud.
Profils navigateurs et portefeuilles crypto : Données de profil Chrome et Firefox, incluant les identifiants stockés dans le navigateur et les extensions pour les portefeuilles de cryptomonnaies — MetaMask, Exodus, Atomic Wallet et Phantom. Ce composant reflète l’intérêt documenté du groupe TeamPCP pour le vol de cryptomonnaies parallèlement aux attaques sur la chaîne d’approvisionnement.
Fichiers d’environnement : Fichiers .env, fichiers de mots de passe de bases de données, et tout fichier correspondant aux schémas token/clé/secret. Les environnements de développement modernes stockent couramment des clés API, des credentials de bases de données et des tokens de comptes de service dans des fichiers .env que les développeurs ne réalisent pas forcément être accessibles aux scripts postinstall.
La portée de ce qu’une seule installation npm compromise peut exposer à un script postinstall est plus large que la plupart des développeurs ne le reconnaissent. Lorsque npm install exécute un script postinstall, ce script s’exécute avec les mêmes permissions que le shell du développeur — ce qui dans la plupart des configurations de développement signifie un accès au répertoire personnel, aux stockages locaux d’identifiants et aux systèmes de fichiers montés.
Publicité
Pourquoi les packages d’IA agentique ont été ciblés
Le ciblage des packages de Namastex Labs n’était pas aléatoire. Namastex Labs développe des outils d’IA agentique — des packages qui connectent des agents IA à des services externes, des API et des environnements d’exécution. Les développeurs qui construisent sur ces packages travaillent par définition sur des systèmes où les agents IA ont de larges permissions : accès shell, clés API, credentials de bases de données et tokens de comptes de service. Compromettre l’environnement de développement d’un développeur d’IA agentique expose potentiellement non seulement ses propres identifiants, mais aussi les credentials de production de chaque système IA qu’il construit et déploie.
Cela représente un changement de logique de ciblage par rapport aux attaques précédentes sur la chaîne d’approvisionnement, qui privilégiaient les packages à fort volume de téléchargement pour une portée maximale. CanisterWorm cible une catégorie à plus faible volume mais à valeur plus élevée : les développeurs dont les tokens compromis déverrouillent des systèmes IA de production avec de larges permissions d’entreprise. Un seul token npm d’un développeur d’IA agentique, combiné à ses fichiers .env et ses credentials AWS, peut fournir un accès à des agents IA gérant des bases de données clients, des bases de connaissances internes ou des processus métier automatisés.
Le ciblage simultané des utilisateurs de Bitwarden CLI dans une campagne distincte d’avril 2026 renforce cette logique. Bitwarden CLI est utilisé par les développeurs et les administrateurs système pour accéder aux coffres-forts de mots de passe de manière programmatique — les tokens de ses utilisateurs déverrouillent non pas un seul service mais le stockage central des identifiants pour des environnements de développement entiers et des déploiements d’infrastructure.
Ce que les équipes sécurité d’entreprise et les développeurs individuels doivent faire
1. Faire pivoter les tokens d’authentification npm immédiatement et passer à OIDC
Tout développeur ayant installé des packages npm depuis la liste des packages affectés — notamment des espaces de noms @automagik/, @fairwords/ ou Namastex Labs depuis le 8 avril 2026 — doit traiter ses tokens d’authentification npm comme compromis et les faire pivoter immédiatement. La rotation des tokens dans npm nécessite de générer un nouveau token d’automatisation via les paramètres du compte npm et de révoquer l’ancien.
La correction structurelle consiste à remplacer les tokens classiques npm de longue durée par des tokens OIDC (OpenID Connect) éphémères et délimités par package. Les tokens OIDC sont éphémères — ils expirent après quelques minutes ou heures plutôt que de persister indéfiniment — et sont délimités à des espaces de noms de packages spécifiques plutôt que d’accorder des droits de publication sur l’ensemble d’un compte. GitHub Actions, GitLab CI et Bitbucket Pipelines prennent tous en charge la génération de tokens OIDC comme fonctionnalité native pour les workflows de publication npm. Les organisations qui n’ont pas encore migré leurs pipelines de publication vers OIDC doivent traiter cela comme une remédiation de sécurité P1, pas un élément de backlog de bonnes pratiques.
2. Activer ignore-scripts dans les environnements CI/CD comme politique par défaut
La configuration ignore-scripts=true dans .npmrc empêche npm d’exécuter les scripts preinstall, install et postinstall lors de npm install. Pour les environnements CI/CD de production — où l’installation des packages doit être déterministe et aucun script arbitraire ne devrait s’exécuter — ce paramètre élimine le vecteur d’exécution utilisé par CanisterWorm, pgserve et Shai-Hulud.
Le compromis est que certains packages utilisent des scripts postinstall à des fins légitimes (compilation de modules natifs, génération d’assets). En pratique, la plupart des pipelines CI/CD peuvent fonctionner avec ignore-scripts=true en remplaçant les packages dépendants des postinstall par des alternatives ou en auditant et en whitelistant explicitement les packages spécifiques nécessitant une exécution postinstall. Cette approche de whitelist est plus sécurisée que le comportement par défaut actuel (autoriser tous les scripts postinstall de tous les packages) et devrait devenir la norme d’entreprise pour tout environnement CI qui gère des identifiants sensibles.
3. Auditer les fichiers .env et les stockages d’identifiants pour les accès sur-privilégiés
Le script postinstall CanisterWorm accède aux répertoires personnels des développeurs, aux fichiers .env, aux profils de navigateurs et aux répertoires de clés SSH. Ces emplacements contiennent des identifiants que la plupart des développeurs considèrent comme une infrastructure d’arrière-plan ambiante — présente mais pas activement gérée comme des actifs de sécurité. Un audit post-incident doit inventorier chaque credential stocké dans ces emplacements et évaluer s’il est encore nécessaire, s’il est délimité aux permissions minimales nécessaires, et s’il devrait être stocké dans un fichier d’identifiants local du tout.
Concrètement : les credentials AWS IAM stockés dans ~/.aws/credentials devraient utiliser des tokens de session temporaires via AWS IAM Identity Center plutôt que des clés d’accès de longue durée. Les clés API pour les services de production devraient être stockées dans un gestionnaire de secrets (HashiCorp Vault, AWS Secrets Manager) plutôt que dans des fichiers .env. Les clés SSH utilisées pour l’accès aux dépôts devraient être protégées par un matériel FIDO2 dans la mesure du possible, éliminant le risque de vol de clés basées sur des fichiers. Cette révision de l’hygiène des identifiants est le contrôle préventif qui limite le rayon de dommages pour la prochaine attaque par script postinstall — et il y en aura une prochaine.
4. Implémenter l’épinglage de version des dépendances et la vérification par hash dans tous les pipelines
CanisterWorm fonctionne en publiant une nouvelle version malveillante d’un package compromis. Un pipeline qui spécifie "@automagik/genie": "latest" dans package.json récupèrerait automatiquement la version empoisonnée au prochain npm install. Un pipeline qui épingle "@automagik/genie": "1.2.3" et vérifie le hash du package par rapport à une valeur connue bonne ne le ferait pas.
La gestion des lockfiles (package-lock.json pour npm, yarn.lock pour Yarn) impose l’épinglage de version, mais seulement si le lockfile est versionné et que le pipeline CI exécute npm ci (qui respecte le lockfile) plutôt que npm install (qui peut mettre à jour le lockfile). La vérification par hash va plus loin : des outils comme npm audit signatures vérifient que les signatures de packages correspondent au journal de signatures Sigstore du registre npm, détectant les packages dont le contenu publié a été altéré après la signature du mainteneur. La vérification de provenance de la chaîne d’approvisionnement basée sur Sigstore devrait être une vérification CI standard pour toute organisation installant des packages depuis des registres publics.
La leçon structurelle : l’auto-propagation change l’économie de l’attaque
L’innovation critique dans CanisterWorm — et la raison pour laquelle cette classe d’attaque va continuer — est que l’auto-propagation rend l’attaque exponentiellement évolutive à un coût marginal quasi nul. Un attaquant traditionnel de la chaîne d’approvisionnement doit compromettre le compte d’un mainteneur spécifique et très réputé via de l’ingénierie sociale, du vol d’identifiants ou une compromission de clé — une approche à effort élevé et faible taux de succès qui limite l’échelle de la campagne. Un ver auto-propagant compromet tout développeur qui installe n’importe quel package affecté, puis utilise les propres identifiants de ce développeur pour s’étendre automatiquement à l’ensemble de son portfolio de packages maintenus.
Les incidents d’avril 2026 — CanisterWorm ciblant les packages d’IA agentique, l’incident concurrent Bitwarden CLI — suggèrent que le groupe TeamPCP (et quiconque avec qui il partage l’infrastructure) itère vers un modèle d’attaque durable. Les équipes sécurité qui mettent en œuvre les quatre contrôles ci-dessus — migration vers les tokens OIDC, politique ignore-scripts, réduction de la portée des identifiants, et vérification par hash des lockfiles — ne se défendent pas seulement contre CanisterWorm. Elles ferment les vulnérabilités structurelles qui rendent possibles tous les vers auto-propagants de la chaîne d’approvisionnement.
Foire aux Questions
Comment fonctionne techniquement le mécanisme d’auto-propagation de CanisterWorm ?
CanisterWorm déploie un script postinstall malveillant dans un package npm compromis. Lorsqu’un développeur exécute npm install, le script postinstall s’exécute automatiquement, récupérant les tokens d’authentification npm depuis les fichiers .npmrc, les variables d’environnement et les profils de navigateurs. Il utilise ensuite le token npm volé pour publier des mises à jour malveillantes dans chaque package du compte npm de la victime, chacun contenant le même payload de ver postinstall. Le processus s’exécute comme un daemon d’arrière-plan détaché même après la fin de la session d’installation, et utilise un canister blockchain ICP pour l’exfiltration des identifiants et la livraison de charge utile — rendant l’infrastructure C2 résistante à la neutralisation de domaine.
Qu’est-ce qui distingue CanisterWorm des attaques npm précédentes sur la chaîne d’approvisionnement ?
CanisterWorm combine trois innovations : une infrastructure C2 décentralisée basée sur ICP (première utilisation confirmée dans cette classe d’attaque), un ciblage délibéré des packages de développement IA agentique (valeur des identifiants plus élevée par victime), et une coordination concomitante avec une campagne distincte ciblant Bitwarden CLI visant la même population de développeurs. Le mécanisme d’auto-propagation lui-même a d’abord été démontré dans l’attaque Shai-Hulud de novembre 2025, mais l’utilisation de l’infrastructure ICP par CanisterWorm rend l’attaque plus résiliente à la réponse aux incidents que les vers prédécesseurs qui s’appuyaient sur des serveurs de commande et contrôle centralisés.
Quelle est la différence entre `npm install` et `npm ci` d’un point de vue sécurité ?
npm install résout les dépendances, peut mettre à jour le lockfile, et exécute tous les scripts de cycle de vie incluant postinstall. npm ci installe exactement les versions spécifiées dans package-lock.json sans modifier le lockfile et échoue si le lockfile est incohérent avec package.json. Pour les pipelines CI/CD, npm ci est la valeur par défaut sécurisée car elle empêche la dérive des dépendances et rend l’ensemble des packages installés déterministe et auditable. Combiné avec ignore-scripts=true dans le .npmrc de l’environnement CI, npm ci élimine les deux vecteurs d’attaque les plus courants sur la chaîne d’approvisionnement : la substitution de version et l’exécution de scripts postinstall.
Sources et lectures complémentaires
- Self-Propagating Supply Chain Worm Hijacks npm Packages to Steal Developer Tokens — The Hacker News
- Another npm Supply Chain Attack — The Register
- Namastex npm Packages Compromised in CanisterWorm Supply Chain Attack — SC World
- CanisterSprawl: The Self-Propagating npm Supply Chain Worm — Cloud Security Alliance Labs
- Meilleures pratiques de sécurité pour les paquets npm — GitHub Blog
- GitLab Discovers Widespread npm Supply Chain Attack — GitLab Blog















