
CVE-2026-33634 (CVSS 9.4) — L'attaque de la chaîne d'approvisionnement CI/CD la plus marquante de 2026 à ce jour.
CVE-2026-33634 (CVSS 9.4) — L'attaque de chaîne d'approvisionnement CI/CD la plus impactante de 2026 à ce jour.
Entre le 19 et le 25 mars 2026, l'acteur de la menace TeamPCP (également suivi sous les noms DeadCatx3, PCPcat, ShellForce, CanisterWorm) a exécuté une compromission en cascade de la chaîne d'approvisionnement à travers cinq écosystèmes : GitHub Actions, Docker Hub, OpenVSX, npm et PyPI. Partant d'un seul PAT GitHub incomplètement révoqué, la campagne s'est propagée à deux grands éditeurs open source de sécurité (Aqua Security et Checkmarx), quatre dépôts GitHub Actions, deux extensions VS Code, des registres de conteneurs et plus de 66 paquets npm.
Ce dépôt fournit une analyse technique complète, des listes d'IOC organisées (testées contre les faux positifs) et des requêtes de détection prêtes à déployer dans Microsoft Defender XDR.
| Date (UTC) | Événement |
|---|---|
| 20 févr. 2026 | Compte hackerbot-claw créé ; commence à scanner les dépôts à la recherche de workflows pull_request_target exploitables |
| 28 févr. 2026 | Première compromission de Trivy via une PWN request ; identifiants exfiltrés |
| 1 mars 2026 | Aqua Security tente de contenir — rotation des identifiants incomplète |
| 19 mars, 17:43 | Frappe principale : TeamPCP effectue un force-push de 75/76 tags dans aquasecurity/trivy-action + les 7 tags dans setup-trivy via le compte de service aqua-bot compromis |
| 19 mars, 18:22 | Version backdoorée de Trivy v0.69.4 publiée sur GitHub Releases, Docker Hub, GHCR, ECR |
| 20 mars, 05:40 | La fenêtre de compromission de Trivy-action se referme (~12 heures) |
| 20 mars, 20:45 | CanisterWorm détecté en train de se propager via npm — 47+ paquets compromis |
| 22 mars, 20:31 | TeamPCP défigure les 44 dépôts de l'organisation GitHub aquasec-com en une rafale scriptée de 2 minutes |
| 22 mars | Images Docker Hub 0.69.5 et 0.69.6 poussées avec la même charge utile de voleur |
| 23 mars, 02:53 | La vague Checkmarx commence : ast-results v2.53.0 et cx-dev-assist v1.7.0 malveillants publiés sur OpenVSX via le compte ast-phoenix |
| 23 mars, 12:58 | Les 35 tags de Checkmarx/kics-github-action ont été force-pushés via le compte cx-plugins-releases compromis |
| 23 mars, 15:41 | Checkmarx signale le problème OpenVSX résolu |
| 23 mars, 16:50 | L'action GitHub KICS retirée après un signalement d'utilisateur |
| 23 mars, 22:25 | Sysdig signale que Checkmarx/ast-github-action v2.3.28 est également compromis |
| 24 mars, 08:30 | Vague LiteLLM : litellm v1.82.7 et v1.82.8 trojanisés publiés sur PyPI à l'aide d'identifiants volés |
| 24 mars, 11:25 | PyPI met en quarantaine les versions malveillantes de LiteLLM |
Cause racine : rotation incomplète des identifiants après la brèche du 28 février. Le PAT du compte de service aqua-bot n'a pas été révoqué, ou l'attaquant a observé le nouveau jeton pendant la rotation.
TeamPCP a utilisé cet accès conservé pour effectuer un force-push de tags de version vers des commits imposteurs malveillants. Chaque commit forgé reprenait les métadonnées de l'original (auteur, horodatage, message) tout en remplaçant le script d'entrée par la charge utile du voleur. La page de release de GitHub n'affichait aucun changement visible — même le badge « Immutable » s'affichait normalement.
Le voleur — un entrypoint.sh de 204 lignes s'identifiant comme « TeamPCP Cloud stealer » — exécute une attaque en trois étapes :
Étape 1 : Récupération depuis la mémoire
Reads /proc/<pid>/mem from Runner.Worker processes
Searches for pattern: {"value":"<secret>","isSecret":true}
Extracts GitHub PATs, cloud credentials, API keys from runner memory
Étape 2 : Balayage des identifiants sur le système de fichiers
Scanne plus de 50 chemins sensibles, notamment :
~/.ssh/*)~/.npmrc).envÉtape 3 : Exfiltration chiffrée
tpcp.tar.gzcurl POST vers des domaines typosquat spécifiques aux fournisseurstpcp-docs ou docs-tpcp dans le compte GitHub de la victime en utilisant un GITHUB_TOKEN voléSur les systèmes Linux non-CI, le malware :
~/.config/sysmon/sysmon.py)Les identifiants volés lors de la vague Trivy ont permis de compromettre l'écosystème de Checkmarx. Chaque nouvelle vague utilisait un domaine C2 typosquat différent pour contourner les listes de blocage de la vague précédente :
| Vague | Domaine C2 | Typosquat de |
|---|---|---|
| Trivy | scan.aquasecurtiy[.]org | aquasecurity.org |
| Checkmarx/KICS | checkmarx[.]zone | checkmarx.com |
| LiteLLM | models.litellm[.]cloud | litellm.ai |
| Dépôt | Tags compromis | Fenêtre d'exposition (UTC) | Point d'entrée |
|---|---|---|---|
aquasecurity/trivy-action | 75 sur 76 (sûr : 0.35.0) | 19 mars 17:43 – 20 mars 05:40 | entrypoint.sh |
aquasecurity/setup-trivy | Les 7 tags | 19 mars 17:43 – 21:44 | action.yaml |
Checkmarx/kics-github-action | Les 35 tags | 23 mars 12:58 – 16:50 | setup.sh |
Checkmarx/ast-github-action | v2.3.28 (probablement tous) | 23 mars ~22:25+ | setup.sh |
| Extension | Version malveillante | Version sûre |
|---|---|---|
checkmarx.ast-results | 2.53.0 | >= 2.56.0 |
checkmarx.cx-dev-assist | 1.7.0 | >= 1.10.0 |
Les deux extensions ont été publiées à 12 secondes d'intervalle à 12:53 UTC le 23 mars via le compte ast-phoenix. À l'activation, environmentAuthChecker.js vérifie la présence d'identifiants de fournisseur cloud, puis récupère un voleur de deuxième étape depuis checkmarx[.]zone/static/checkmarx-util-1.0.4.tgz.
| Image | Tags malveillants |
|---|---|
docker.io/aquasec/trivy | 0.69.4, 0.69.5, 0.69.6 |
ghcr.io/aquasecurity/trivy | 0.69.4, 0.69.5, 0.69.6 |
public.ecr.aws/aquasecurity/trivy | 0.69.4, 0.69.5, 0.69.6 |
| Paquet | Versions | Fichier backdooré |
|---|---|---|
litellm | 1.82.7, 1.82.8 | litellm/proxy/proxy_server.py |
Charge utile base64 à triple imbrication avec un arsenal de mouvement latéral K8s. Persistance via sysmon.service qui interroge checkmarx.zone/raw.
Le schéma d'exfiltration est identique dans toutes les vagues :