CanisterWorm : TeamPCP compromet des packages NPM via un ver auto-propageable avec C2 ICP
đŻ Contexte PubliĂ© le 20 mars 2026 par Aikido Security (Charlie Eriksen), cet article documente la dĂ©tection le 20 mars 2026 Ă 20h45 UTC dâune campagne de compromission massive de packages NPM, baptisĂ©e CanisterWorm, attribuĂ©e au groupe TeamPCP. Cette attaque fait suite Ă une compromission de lâoutil Trivy moins de 24 heures auparavant, documentĂ©e par Wiz. đŠ Packages compromis 28 packages dans le scope @EmilGroup 16 packages dans le scope @opengov @teale.io/eslint-config @airtm/uuid-base32 @pypestream/floating-ui-dom đïž Architecture en trois Ă©tapes Stage 1 â Loader Node.js (postinstall) : Un hook postinstall dans index.js dĂ©code un payload base64 (script Python), crĂ©e un service systemd utilisateur pgmon.service avec Restart=always, et le dĂ©marre immĂ©diatement. Aucun accĂšs root requis. Stage 2 â Backdoor Python persistante : Le script service.py attend 5 minutes (Ă©vasion sandbox), puis interroge toutes les ~50 minutes un canister ICP (tdtqy-oyaaa-aaaae-af2dq-cai.raw.icp0.io) pour obtenir une URL de payload. Il tĂ©lĂ©charge le binaire vers /tmp/pglog, lâexĂ©cute en processus dĂ©tachĂ©, et sauvegarde lâURL dans /tmp/.pg_state. Un kill switch est intĂ©grĂ© : si lâURL contient youtube.com, le payload est ignorĂ©. Stage 3 â Ver de propagation (deploy.js) : Outil initialement manuel utilisant des tokens NPM volĂ©s pour Ă©numĂ©rer tous les packages publiables dâun compte, incrĂ©menter la version patch, prĂ©server le README original, et republier avec --tag latest. đ Ăvolution vers lâauto-propagation Environ une heure aprĂšs la vague initiale, une mise Ă jour de @teale.io/eslint-config (versions 1.8.11 et 1.8.12) a introduit la fonction findNpmTokens() qui : ...