En bref
Que s'est-il passé ?
Dans la foulée de la seconde compromission de Trivy (v0.69.4), l'acteur TeamPCP déploie CanisterWorm, un ver npm auto-propageant : les jetons npm volés aux pipelines servent à publier des patchs piégés sur tous les namespaces atteignables, dont @opengov (16+ paquets).
Chaque version piégée installe, via un postinstall, une porte dérobée Python persistante (service utilisateur systemd, sans root) qui interroge un C2 hébergé sur la blockchain Internet Computer (résistant au takedown). Un composant ver revole les jetons npm et republie le malware.
Une charge de second étage via le C2 embarque des capacités destructrices Kubernetes et un effacement de système de fichiers pour des victimes ciblées géopolitiquement. Le payload base64 dans index.js échappe aux scanners statiques.
Désactiver les scripts d'installation, jetons de publication courts (OIDC) et scopés, filtrage de l'egress pour couper le C2, détection d'un postinstall apparu pour la première fois, et révocation des jetons compromis.
Comment l'attaquant a procédé
Cet incident met en jeu les vecteurs d'attaque suivants du catalogue SOCLE ; chacun renvoie à sa fiche, où l'on trouve les exigences qui le neutralisent :
La leçon à en tirer
Identités de publication courtes (OIDC) ; détection de republication ; confinement du rayon d'explosion (egress filtre).
Les exigences SOCLE qui auraient limité cet incident
Cet incident se rattache à 5 exigences du référentiel, par domaine. Les satisfaire n'aurait pas forcément tout empêché, mais aurait réduit la probabilité de l'attaque, limité son impact ou accéléré sa détection :