TeamPCP : rétrospective d'une attaque supply chain en cascade contre 5 écosystèmes (mars 2026)

🔍 Contexte Publié le 30 mars 2026 par OpenSourceMalware.com, cet article constitue une rétrospective complète de la campagne supply chain orchestrée par TeamPCP en mars 2026. L’attaque a débuté par un incident de moindre ampleur en février 2026 et s’est transformée en la compromission en cascade de cinq écosystèmes majeurs en l’espace de cinq jours. 🎭 Acteur de la menace TeamPCP (alias DeadCatx3, PCPcat, ShellForce) est un groupe à motivation financière, spécialisé dans les environnements cloud-native. Il est lié à l’opération de ransomware CipherForce et entretient des liens de coordination confirmés avec LAPSUS$, selon le CTO de Mandiant Charles Carmakal lors de la RSA Conference. Le groupe est suivi par Aikido Security, Socket, Wiz, Flare et d’autres. ...

30 mars 2026 · 4 min

Attaque supply chain TeamPCP : Trivy compromis, malware injecté dans les releases et GitHub Actions

🎯 Contexte Source : Wiz Research, publié le 20 mars 2026. Le 19 mars 2026, des acteurs malveillants se désignant sous le nom TeamPCP ont mené une attaque de supply chain ciblant Aqua Security’s Trivy, un scanner de vulnérabilités open source largement utilisé dans les environnements DevSecOps et CI/CD. 🔍 Déroulement de l’attaque L’attaque s’est déroulée en plusieurs étapes : Commits impersonateurs : TeamPCP a poussé des commits malveillants en usurpant l’identité des utilisateurs rauchg (sur actions/checkout) et DmitriyLewen (sur aquasecurity/trivy). Tag v0.69.4 malveillant : À 17:43:37 UTC, le tag v0.69.4 a été poussé, déclenchant la publication de binaires backdoorés sur GitHub Releases, Docker Hub, GHCR et ECR. Domaine typosquatté : Le code malveillant contactait scan.aquasecurtiy[.]org (résolvant vers 45.148.10.212) pour l’exfiltration. Compromission du compte aqua-bot : L’attaquant a abusé de ce compte pour pousser des workflows malveillants vers tfsec, traceeshark et trivy-action, volant des clés GPG, credentials Docker Hub, Twitter et Slack. Force-push de tags : 75 sur 76 tags de trivy-action et 7 tags de setup-trivy ont été écrasés par des versions malveillantes. Expansion vers npm : Le 22 mars, TeamPCP a étendu ses opérations à l’écosystème npm via un worm nommé CanisterWorm exploitant des tokens de publication volés. Images Docker malveillantes : Les versions 0.69.5 et 0.69.6 de Trivy ont été publiées sur Docker Hub le 22 mars vers 16:00 UTC. 🦠 Comportement du malware Dans les GitHub Actions (trivy-action / setup-trivy) Payload en 3 étapes : ...

25 mars 2026 · 5 min

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 : ...

25 mars 2026 · 3 min
Dernière mise à jour le: 9 Apr 2026 📝