CanisterWorm : Ver auto-propagé dans la chaîne d'approvisionnement npm après l'attaque Trivy
Les attaquants, suite au compromis de Trivy, ont déployé le ver CanisterWorm, qui a infecté des dizaines de paquets npm. Le malware utilise des canisters ICP sur la blockchain Internet Computer pour un serveur C2 résilient. Il s'agit du premier abus documenté d'ICP pour la récupération de charges utiles, offrant une résistance décentralisée aux suppressions.
Mécanisme d'infection et de propagation
La chaîne d'attaque commence par un hook postinstall dans les paquets compromis. Le hook lance un chargeur qui installe une porte dérobée Python. La porte dérobée se connecte à un canister ICP pour récupérer l'URL de la prochaine charge utile.
Le canister ICP implémente les méthodes get_latest_link, http_request et update_link. Cette dernière permet au contrôleur de changer l'URL en temps réel, mettant à jour les fichiers exécutables sur tous les hôtes infectés sans interrompre les opérations.
La porte dérobée interroge le canister toutes les 50 minutes avec un User-Agent falsifié. Si l'URL contient youtube.com, l'implant passe en mode dormant. L'activation se produit en basculant vers la vraie charge utile ; les anciens processus continuent de s'exécuter en parallèle.
La persistance est assurée par un service systemd nommé « pgmon », se faisant passer pour un monitoring PostgreSQL. La directive Restart=always redémarre la porte dérobée 5 secondes après son arrêt.
Paquets affectés :
- 28 dans le scope @EmilGroup ;
- 16 dans le scope @opengov ;
- @teale.io/eslint-config ;
- @airtm/uuid-base32 ;
- @pypestream/floating-ui-dom.
Socket a détecté 141 artefacts malveillants dans plus de 66 paquets uniques.
Évolution de CanisterWorm vers une automatisation complète
Dans les versions 1.8.11–1.8.12 de @teale.io/eslint-config, une variante mutée intègre le vol de tokens npm dans index.js. La fonction findNpmTokens() scanne l'environnement pendant postinstall et lance deploy.js en tant que processus en arrière-plan pour l'auto-propagation.
Deploy.js publie des versions malveillantes vers tous les paquets accessibles en utilisant les tokens volés. Le ver, vraisemblablement généré par une IA utilisant la technologie Vibe, n'obfusque pas son code.
La charge utile actuelle dans ICP est la chaîne de test « hello123 », indiquant une phase de vérification de la chaîne avant une attaque complète.
Un mécanisme similaire avec vérification youtube.com a été trouvé dans Trivy 0.69.4 trojanisé via sysmon.py, référencant le même canister ICP.
Comparaison avec les campagnes précédentes
CanisterWorm suit le schéma de Shai-Hulud (septembre) : le compromis de tinycolor s'est propagé à plus de 40 paquets, puis le ver a infecté plus de 300 via NpmModule.updatePackage et TruffleHog pour la validation des identifiants.
Sha1-Hulud (novembre) a affecté plus de 25 000 dépôts : le script preinstall setup_bun.js a détecté l'environnement Bun, lançant bun_environment.js pour le vol de données.
| Campagne | Paquets affectés | Mécanisme de propagation | Outils de vol |
|--------------|------------------|-------------------------------------------|-------------------|
| Shai-Hulud | 300+ | NpmModule.updatePackage | TruffleHog |
| Sha1-Hulud | 25 000+ | preinstall/setup_bun.js | bun_environment |
| CanisterWorm| 66+ | postinstall/deploy.js + ICP C2 | findNpmTokens |
Enseignements clés
- Première utilisation de canisters ICP pour C2 dans le malware : la décentralisation rend les suppressions difficiles.
- Propagation automatique : vol de tokens + deploy.js transforme les installations en vecteurs d'infection pour les machines CI/CD et de développement.
- Résilience : systemd avec
Restart=always+ processus parallèles +update_linkdynamique. - Usurpation : services déguisés en pgmon, mode dormant sur youtube.com.
- Échelle : de Trivy à 141 artefacts ; évolution vers une automatisation complète sans déploiements manuels.
Les entreprises Aikido Security, Endor Labs, JFrog et Wiz confirment : cela marque un passage des compromissions uniques à un comportement de ver exponentiel dans l'écosystème npm.
— Editorial Team
Aucun commentaire pour le moment.