
Toolkit di rilevamento e bonifica per il worm Miasma / Shai-Hulud e CVE-2026-35603 (iniezione di configurazione AI-agent/IDE)
Analisi degli incidenti + strumenti di rilevamento/risanamento per il worm Miasma (una variante Mini Shai-Hulud) che inietta payload ad avvio automatico nelle configurazioni di agenti AI / IDE e nei repository npm/GitHub.
⚠️ Disclaimer — nessuna garanzia. Questo è un toolkit difensivo comunitario fornito "così com'è", senza garanzie di alcun tipo (vedi
LICENSE). Lo scanner e le regole YARA sono di sola lettura, mapurge-history.shriscrive la cronologia git e gli hook.claude/spostano i file in quarantena — entrambe le cose possono alterare un repository. Fai un backup prima, verifica cosa fa ogni strumento ed eseguilo a tuo rischio. Una scansione pulita non è una garanzia di sicurezza: gli indicatori evolvono e compaiono nuove varianti. Usalo su sistemi e account che sei autorizzato a ispezionare. Hai trovato una lacuna o un bug? VediSECURITY.mdeCONTRIBUTING.md.
Installa YARA (Windows): winget install VirusTotal.YARA — oppure choco install yara / scoop install yara.
Su Linux/macOS: apt install yara / brew install yara. Verifica con yara --version.
Nota:
-Mode Localesegue la scansione solo di$env:USERPROFILEper impostazione predefinita. Passa-CodeRootsper coprire repository altrove, es.-CodeRoots E:\Sources,D:\work.
# Scan local machine + local repos (+ CVE-2026-35603 ProgramData)
pwsh -File Scan-Miasma.ps1 -Mode Local
pwsh -File Scan-Miasma.ps1 -Mode Local -CodeRoots E:\Sources,D:\work
# Scan remote GitHub repos (authenticate on the target account first for private repos/secrets)
gh auth login
pwsh -File Scan-Miasma.ps1 -Mode Remote -Owners your-org,your-user -OutReport report.md
# Everything + JSON + Markdown report
pwsh -File Scan-Miasma.ps1 -OutJson findings.json -OutReport report.md
Codice di uscita 1 se è presente un qualsiasi esito INFECTED (compatibile CI).
# Purge history of an infected repo (review PATHS in the script first)
./purge-history.sh /path/to/repo
# then, after reviewing the verification:
git push origin --force --all && git push origin --force --tags
# YARA scan
yara -r setup-js.yar /path/to/scan
# Linux/macOS: local scan (bash port — defaults to $HOME; pass roots to widen)
./scan-miasma.sh
./scan-miasma.sh ~/src /opt/work
# Statically deobfuscate a captured dropper (read-only — never runs it)
pwsh -File Expand-MiasmaPayload.ps1 -Path .github/setup.js # writes layers + iocs.txt to <Path>.deob/
pwsh -File Expand-MiasmaPayload.ps1 -SelfTest # verify the decode/decrypt engine
Il deoffuscatore decomprime il layer packer p,a,c,k,e,d, decodifica il layer a codici-char, rileva automaticamente e inverte lo scorrimento Caesar (sostituibile con -Shift), quindi decrittografa ogni blob AES-128-GCM incorporato (_b bootstrapper, _p stealer) ed esamina il codice recuperato alla ricerca di URL, IP e account dead-drop.
# After eradication: generate a prioritized secret-rotation checklist (revokes nothing)
pwsh -File Invoke-MiasmaRotation.ps1 # detects creds reachable here
pwsh -File Invoke-MiasmaRotation.ps1 -OutReport rotation.md
Usa l'azione composita inclusa come primo passo di qualsiasi workflow:
# In another repo (pin to a tag/SHA for supply-chain safety):
- uses: actions/checkout@v4
- uses: jchable/miasma-toolkit/.github/actions/miasma-guard@main
# with:
# full-scan: 'true' # also run Scan-Miasma.ps1 -Mode Local (needs pwsh)
Questo toolkit esegue la stessa guardia su sé stesso tramite .github/workflows/miasma-ci.yml (facendo riferimento all'azione tramite percorso relativo). La guardia è indipendente dalla variante ed è limitata ai file di configurazione del launcher del worm, quindi non produce falsi positivi sui documenti che menzionano soltanto la stringa IOC.
.claude/)Protezione in tempo reale per le macchine che eseguono Claude Code in questo repository. Gli hook riutilizzano iocs.psd1 (nessun indicatore duplicato) e sono collegati in .claude/settings.json:
.miasma-quarantine/<timestamp>/… (ignorati da git) e registrati in .miasma-quarantine/quarantine.log — ripristino con Move-Item. Nulla viene eliminato definitivamente.Test-MiasmaExcluded in Miasma.Common.ps1): i file del toolkit stesso contengono legittimamente stringhe IOC (iocs.psd1, Scan-Miasma.ps1, scan-miasma.sh, Expand-MiasmaPayload.ps1, Invoke-MiasmaRotation.ps1, purge-history.sh, setup-js.yar, content/, , , ) e non vengono mai bloccati/messi in quarantena.DROPPER, INJECT, FORGED, BADDEP, WORKFLOW, RUNNER, PAYLOAD, BUN-DROP, PROGRAMDATANPM-AUDIT, SECRETS (inventario di rotazione), SIGNATURE, PERSIST, PROGRAMDATA-CFGgh api <404> --jq invia il corpo dell'errore su stdout → non fidarti mai della veridicità dell'output; controlla $LASTEXITCODE + valida il formato (dimensione numerica, nome esatto del branch).master→main dopo la rinomina → branches/master restituisce 200; accetta un branch solo se il nome restituito == nome richiesto.--package-lock-only (niente npm install, nessuno script eseguito).Il backlog originale (porting bash, badge di gravità, deoffuscamento del layer packer, helper di rotazione) è completato. Idee future:
scan-miasma.sh: aggiungere la modalità remota/GitHub (attualmente solo locale).--revoke opzionale (protetta, con conferma) per gh/npm/aws.| File | Descrizione |
|---|
content/incident-report.fr.md / content/incident-report.en.md | Resoconto completo: come funziona, deoffuscamento del payload, IOC, eradicazione |
Scan-Miasma.ps1 | Scanner unificato (locale + remoto), report JSON strutturato + report Markdown per repository — usa questo |
iocs.psd1 | Indicatori condivisi (hash, firme, pacchetti dannosi, configurazioni) caricati dallo scanner — modifica gli IOC qui |
Expand-MiasmaPayload.ps1 | Deoffuscatore statico per setup.js — rimuove i layer packer/codici-char → Caesar → AES-128-GCM ed estrae C2/IOC (non esegue mai il payload) |
Invoke-MiasmaRotation.ps1 | Checklist di rotazione dei segreti — rileva quali credenziali sono raggiungibili da qui e stampa i comandi di revoca (sola lettura; non revoca nulla) |
scan-miasma.sh | Porting Bash della scansione locale per Linux/macOS (sottoinsieme multipiattaforma) |
purge-history.sh | Elimina i file dannosi da tutta la cronologia git (filter-repo → filter-branch) + backup |
setup-js.yar | Regole YARA per il dropper + configurazioni del launcher |
.github/actions/miasma-guard/ | Azione composita GitHub Actions riutilizzabile — rifiuta la build se dropper/launcher è presente |
.claude/ | Hook Claude Code — protezione/quarantena in tempo reale + comando /miasma-scan (vedi sotto) |
| Tool | Serve per | Obbligatorio? |
|---|
PowerShell 7+ (pwsh) | Scan-Miasma.ps1, Expand-MiasmaPayload.ps1, Invoke-MiasmaRotation.ps1 | obbligatorio (questi strumenti) |
bash + coreutils (sha256sum/shasum, awk, find) | scan-miasma.sh (Linux/macOS) | solo il porting bash |
| git | controlli della cronologia dei repository locali, purge-history.sh | obbligatorio |
GitHub CLI (gh, autenticato) | Scan-Miasma.ps1 -Mode Remote | solo scansione remota |
| npm | npm audit remoto (solo lockfile) | facoltativo (saltato automaticamente se assente) |
| git-filter-repo | riscrittura cronologia preferita (ripiega su git filter-branch integrato) | facoltativo |
YARA (yara) | scansione setup-js.yar | facoltativo |
| Hook | Evento | Azione |
|---|
Guard-Write.ps1 | PreToolUse (Write/Edit/MultiEdit) | Blocca una scrittura che inietterebbe un IOC del worm (annulla la chiamata dello strumento) |
Guard-Bash.ps1 | PreToolUse (Bash) | Blocca l'esecuzione del worm — node .github/setup.js, bun/bunx, un installer bun.sh via pipe |
Scan-Write.ps1 | PostToolUse (Write/Edit/MultiEdit) | Avvisa e mette in quarantena un file infetto dopo che viene scritto |
Session-Sweep.ps1 | SessionStart | Scansione rapida del repository; segnala qualsiasi infezione preesistente nel contesto |
/miasma-scan | comando | Wrapper on-demand attorno a Scan-Miasma.ps1 |
.claude/hooks|commands.github/actions/miasma-guard/.github/workflows/Guard-Bash blocca l'esecuzione, non la menzione: i suoi pattern (iocs.psd1 → CmdSigs) sono ancorati a una posizione di comando, quindi i comandi di triage che si limitano a menzionare un IOC (grep "node .github/setup.js", yara -r setup-js.yar, cat setup.js) non vengono bloccati — viene bloccata solo l'esecuzione effettiva di node …/setup.js / bun / una pipe di installazione bun.sh. Nota: l'invocazione di bun/bunx è bloccata del tutto (il runtime del worm); aggiungila alla allowlist tramite CmdSigs se hai davvero bisogno di Bun.Scan-Miasma.ps1 (sola lettura), questi hook modificano l'albero (quarantena). Sono opt-in: Claude Code chiede di approvare gli hook la prima volta che carica .claude/settings.json.