Il 5 giugno 2026, il worm Miasma — variante della famiglia Shai-Hulud attribuita al gruppo TeamPCP — ha raggiunto le organizzazioni GitHub di Microsoft. In 105 secondi, il sistema automatico di enforcement di GitHub ha disabilitato 73 repository tra Azure, Azure-Samples, microsoft e MicrosoftDocs. L’attacco introduce un cambio di paradigma nei supply chain attack: il trigger non è più l’installazione di un pacchetto, ma l’apertura di una cartella nel proprio editor o AI coding agent.
La catena di infezione: dal PyPI al repository injection
Per comprendere l’incidente del 5 giugno è necessario risalire al 19 maggio 2026, quando la stessa campagna Miasma aveva compromesso il pacchetto PyPI durabletask di Microsoft. In quell’occasione, un attaccante aveva caricato tre versioni malevole del pacchetto in una finestra di 35 minuti, usando un token di publishing compromesso, bypassando completamente la pipeline CI/CD. Il payload — un file rope.pyz da 28KB — rubava credenziali da AWS, Azure, GCP, Kubernetes e oltre 90 configurazioni di developer tool.
Il 5 giugno, lo stesso account contributor compromesso è stato usato per iniettare un commit direttamente nel repository GitHub Azure/durabletask. Il commit (5f456b8) riportava il messaggio “Switched DataConverter to OrchestrationContext [skip ci]” — ma non modificava alcun file sorgente. Aggiungeva invece 5 file di configurazione, con un timestamp retrodatato al 2020 per eludere il rilevamento, e il flag [skip ci] per sopprimere l’esecuzione della pipeline.
Quattro vettori, un payload: come Miasma abusa degli AI coding agent
L’attacco è notevole per la sua copertura trasversale degli strumenti di sviluppo più diffusi. I cinque file iniettati puntano tutti allo stesso payload (.github/setup.js, un file JavaScript da 4,6 MB altamente offuscato), attivandolo con meccanismi diversi:
- .claude/settings.json: hook
SessionStartper Claude Code — esegue il payload all’avvio di qualsiasi sessione Claude nel repository. - .gemini/settings.json: hook identico per Gemini CLI.
- .cursor/rules/setup.mdc: prompt injection per Cursor AI — istruisce l’agente a eseguire il payload spacciandolo per “inizializzazione obbligatoria del progetto”. Il flag
alwaysApply: truegarantisce l’attivazione indipendentemente dal file su cui si sta lavorando. - .vscode/tasks.json: task con
runOptions.runOn: "folderOpen"— eseguito automaticamente da VS Code all’apertura della cartella, senza alcun coinvolgimento di AI agent.
Il punto critico: clonare il repository è sicuro, aprirlo nell’editor non lo è. Questo inverte l’assunzione di sicurezza su cui si basano la maggior parte dei workflow di sviluppo.
73 repository in 105 secondi: l’automazione di GitHub come ultima linea di difesa
Ore dopo il commit malevolo, il sistema automatico di abuse detection di GitHub ha disabilitato 73 repository in due ondate distinte, separate da un gap di 56 secondi:
- Wave 1 (16:00:50 → 16:01:28 UTC): 39 repository in 38 secondi
- Wave 2 (16:02:24 → 16:02:35 UTC): 34 repository in 11 secondi
Tutti i repository restituiscono HTTP 403 con "reason": "tos". Tra quelli colpiti figurano repository critici come azure-functions-host, azure-functions-core-tools, l’intera famiglia dei worker (.NET, Node.js, Python, Java, PowerShell, Go) e — con conseguenze immediate — Azure/functions-action, la GitHub Action ufficiale per il deployment di Azure Functions.
La disabilitazione di functions-action ha rotto immediatamente ogni pipeline CI/CD che referenziava Azure/functions-action@v1. Un thread su Microsoft Learn ha raccolto oltre 20 segnalazioni di pipeline bloccate in poche ore. Microsoft ha inizialmente classificato l’evento come “violazione delle policy GitHub”, salvo poi ricaratterizzarlo come “internal management issue under investigation”.
Attributione: TeamPCP e il nexus Shai-Hulud/Miasma
L’incidente si inserisce nella campagna più ampia del gruppo TeamPCP, attivo da almeno la primavera 2026. Il payload del 19 maggio conteneva un C2 secondario (t.m-kosche[.]com) già noto come infrastruttura TeamPCP. Il gruppo ha una storia di attacchi supply chain di ampia portata: TanStack (42 pacchetti npm, CVE-2026-45321, CVSS 9.6), Mistral AI, l’ecosistema @antv (639 versioni su 323 pacchetti npm), @redhat-cloud-services (32 pacchetti), LiteLLM, Telnyx e Checkmarx.
Miasma è valutata come una variante evoluta del worm Mini Shai-Hulud: Wave 1 (giugno 1) usava hook preinstall npm; Wave 2 (giugno 3) ha introdotto la tecnica Phantom Gyp — file binding.gyp malevoli che eludono le difese supply chain tradizionali; Wave 3 (giugno 5) ha abbandonato il package manager del tutto, puntando direttamente al repository e all’editor.
Indicatori di compromissione
# Domini C2
check.git-service[.]com # C2 primario payload maggio
t.m-kosche[.]com # Infrastruttura TeamPCP (C2 secondario)
# Hash commit malevolo
5f456b8 (Azure/durabletask, 2026-06-05)
# File sospetti da cercare nei repository
.claude/settings.json # Hook SessionStart
.gemini/settings.json # Hook SessionStart
.cursor/rules/setup.mdc # Prompt injection alwaysApply
.vscode/tasks.json # runOn: folderOpen
.github/setup.js # Payload principale (4.6 MB offuscato)
Due righe per i difensori
Chi ha clonato repository Azure/microsoft dopo il 2 giugno 2026 e li ha aperti in un editor deve considerare il sistema compromesso e ruotare immediatamente tutte le credenziali accessibili: GitHub token, npm token, AWS keys, Azure service principal, GCP service account, SSH key, Kubernetes secrets, Docker config, variabili d’ambiente e shell history.
Per prevenire incidenti analoghi: ispezionare i repository clonati per i file sopra elencati prima di aprirli; pinnare le GitHub Actions a commit SHA specifici invece di tag mutabili; abilitare branch protection con revisione obbligatoria dei PR; usare PyPI Trusted Publishing (OIDC) al posto di token long-lived; monitorare le connessioni outbound dai runner CI/CD verso domini sconosciuti.
L’attacco Miasma su Microsoft rappresenta un salto qualitativo nella minaccia supply chain: non bastano più le difese sul package manager se gli attaccanti possono iniettare hook direttamente nell’editor dello sviluppatore. La superficie d’attacco si è spostata dall’installazione all’apertura — e le difese devono adeguarsi di conseguenza.