
Kit de détection et de correction pour le ver Miasma / Shai-Hulud et CVE-2026-35603 (AI-agent/IDE config injection)
Outils d'analyse d'incident + détection/remédiation pour le ver Miasma (une variante Mini Shai-Hulud) qui injecte des charges utiles de démarrage automatique dans les configurations AI-agent / IDE et dans les dépôts npm/GitHub.
⚠️ Avertissement — aucune garantie. Il s'agit d'une boîte à outils défensive communautaire fournie « en l'état », sans garantie d'aucune sorte (voir
LICENSE). Le scanner et les règles YARA sont en lecture seule, maispurge-history.shréécrit l'historique git et les hooks.claude/déplacent les fichiers en quarantaine — les deux peuvent modifier un dépôt. Sauvegardez d'abord, examinez ce que fait chaque outil et exécutez-le à vos propres risques. Un scan propre n'est pas une garantie de sécurité : les indicateurs évoluent et de nouveaux variants apparaissent. Utilisation sur des systèmes et des comptes que vous êtes autorisé à inspecter. Vous avez trouvé une lacune ou un bug ? VoirSECURITY.mdetCONTRIBUTING.md.
Installer YARA (Windows) : winget install VirusTotal.YARA — ou choco install yara / scoop install yara.
Sur Linux/macOS : apt install yara / brew install yara. Vérifier avec yara --version.
Remarque :
-Mode Localscanne par défaut uniquement$env:USERPROFILE. Passez-CodeRootspour couvrir les dépôts ailleurs, par ex.-CodeRoots E:\Sources,D:\work.
# Scanner la machine locale + les dépôts locaux (+ CVE-2026-35603 ProgramData)
pwsh -File Scan-Miasma.ps1 -Mode Local
pwsh -File Scan-Miasma.ps1 -Mode Local -CodeRoots E:\Sources,D:\work
# Scanner les dépôts GitHub distants (authentifiez-vous d'abord sur le compte cible pour les dépôts privés/secrets)
gh auth login
pwsh -File Scan-Miasma.ps1 -Mode Remote -Owners votre-org,votre-utilisateur -OutReport report.md
# Tout + JSON + rapport Markdown
pwsh -File Scan-Miasma.ps1 -OutJson findings.json -OutReport report.md
Code de sortie 1 si une découverte INFECTED (compatible CI).
# Purger l'historique d'un dépôt infecté (vérifiez d'abord PATHS dans le script)
./purge-history.sh /chemin/vers/depot
# puis, après avoir vérifié :
git push origin --force --all && git push origin --force --tags
# Scan YARA
yara -r setup-js.yar /chemin/vers/scan
# Linux/macOS : scan local (port bash — par défaut $HOME ; passez des racines pour élargir)
./scan-miasma.sh
./scan-miasma.sh ~/src /opt/work
# Désobfuscation statique d'un dropper capturé (lecture seule — ne l'exécute jamais)
pwsh -File Expand-MiasmaPayload.ps1 -Path .github/setup.js # écrit layers + iocs.txt dans <Path>.deob/
pwsh -File Expand-MiasmaPayload.ps1 -SelfTest # vérifier le moteur de décodage/déchiffrement
Le désobfuscateur déballe la vague p,a,c,k,e,d du packer, décode la vague de codes de caractères, détecte automatiquement
et inverse le décalage Caesar (remplacer avec -Shift), puis déchiffre chaque blob AES-128-GCM intégré
(_b bootstrap, _p voleur) et scanne le code récupéré pour les URL, IP et comptes de dépôt mort.
# Après éradication : générer une liste de vérification priorisée de rotation des secrets (ne révoque rien)
pwsh -File Invoke-MiasmaRotation.ps1 # détecte les identifiants accessibles ici
pwsh -File Invoke-MiasmaRotation.ps1 -OutReport rotation.md
Utilisez l'action composite fournie comme première étape de tout workflow :
# Dans un autre dépôt (épinglez sur un tag/SHA pour la sécurité de la chaîne d'approvisionnement) :
- uses: actions/checkout@v4
- uses: jchable/miasma-toolkit/.github/actions/miasma-guard@main
# with:
# full-scan: 'true' # exécute aussi Scan-Miasma.ps1 -Mode Local (nécessite pwsh)
Cette boîte à outils exécute la même garde sur elle-même via .github/workflows/miasma-ci.yml
(en référence à l'action par chemin relatif). La garde est indépendante de la vague et limitée aux fichiers de configuration
du lanceur du ver, donc ne produit jamais de faux positifs sur des documents qui mentionnent simplement la chaîne IOC.
.claude/)Protection en temps réel pour les machines qui exécutent Claude Code dans ce dépôt. Les hooks réutilisent
iocs.psd1 (pas d'indicateurs dupliqués) et sont câblés dans .claude/settings.json :
.miasma-quarantine/<timestamp>/…
(ignorés par git) et journalisés dans .miasma-quarantine/quarantine.log — restaurez avec Move-Item.
Rien n'est supprimé définitivement.Test-MiasmaExcluded dans Miasma.Common.ps1) : les fichiers propres de la boîte à outils
contiennent légitimement des chaînes IOC (iocs.psd1, Scan-Miasma.ps1, scan-miasma.sh,
Expand-MiasmaPayload.ps1, Invoke-MiasmaRotation.ps1, purge-history.sh, setup-js.yar,
content/, , , )
et ne sont jamais bloqués/mis en quarantaine.DROPPER, INJECT, FORGED, BADDEP, WORKFLOW, RUNNER, PAYLOAD, BUN-DROP, PROGRAMDATANPM-AUDIT, SECRETS (inventaire de rotation), SIGNATURE, PERSIST, PROGRAMDATA-CFGgh api <404> --jq envoie le corps de l'erreur sur stdout → ne jamais se fier à la véracité de la sortie ;
vérifier $LASTEXITCODE + valider le format (taille numérique, nom de branche exact).master→main après le renommage → branches/master retourne 200 ;
n'accepter une branche que si le nom retourné == nom demandé.--package-lock-only (pas de npm install, pas de scripts exécutés).La réserve initiale (port bash, badges de sévérité, désobfuscation de vague de packer, assistant de rotation) est terminée. Idées futures :
scan-miasma.sh : ajouter le mode distant/GitHub (actuellement local uniquement).--revoke optionnel (protégé, avec confirmation) pour gh/npm/aws.| Fichier | Description |
|---|
content/incident-report.fr.md / content/incident-report.en.md | Rapport complet : fonctionnement, désobfuscation de la charge utile, IOCs, éradication |
Scan-Miasma.ps1 | Scanner unifié (local + distant), JSON structuré + rapport Markdown par dépôt — utilisez celui-ci |
iocs.psd1 | Indicateurs partagés (hachages, signatures, mauvais paquets, configurations) chargés par le scanner — éditez les IOCs ici |
Expand-MiasmaPayload.ps1 | Désobfuscateur statique pour setup.js — dépile le packer/codes de caractères → Caesar → AES-128-GCM et extrait le C2/IOCs (n'exécute jamais la charge utile) |
Invoke-MiasmaRotation.ps1 | Liste de vérification de rotation des secrets — détecte les identifiants accessibles ici et imprime les commandes de révocation (lecture seule ; ne révoque rien) |
scan-miasma.sh | Port Bash du scan local pour Linux/macOS (sous-ensemble multiplateforme) |
purge-history.sh | Purge des fichiers malveillants de tout l'historique git (filter-repo → filter-branch) + sauvegarde |
setup-js.yar | Règles YARA pour le dropper et les configurations de lanceur |
.github/actions/miasma-guard/ | Action composite GitHub Actions réutilisable — refuse de construire si le dropper/lanceur est présent |
.claude/ | Hooks Claude Code — garde/quarantaine en temps réel + commande /miasma-scan (voir ci-dessous) |
| Outil | Nécessaire pour | Requis ? |
|---|
PowerShell 7+ (pwsh) | Scan-Miasma.ps1, Expand-MiasmaPayload.ps1, Invoke-MiasmaRotation.ps1 | requis (ces outils) |
bash + coreutils (sha256sum/shasum, awk, find) | scan-miasma.sh (Linux/macOS) | seulement pour le port bash |
| git | vérifications de l'historique du dépôt local, purge-history.sh | requis |
GitHub CLI (gh, authentifié) | Scan-Miasma.ps1 -Mode Remote | scan distant uniquement |
| npm | npm audit distant (uniquement le fichier de verrouillage) | optionnel (ignoré automatiquement si absent) |
| git-filter-repo | réécriture d'historique préférée (repli sur git filter-branch intégré) | optionnel |
YARA (yara) | scan setup-js.yar | optionnel |
| Hook | Événement | Action |
|---|
Guard-Write.ps1 | PreToolUse (Write/Edit/MultiEdit) | Bloque une écriture qui injecterait un IOC du ver (annule l'appel d'outil) |
Guard-Bash.ps1 | PreToolUse (Bash) | Bloque l'exécution du ver — node .github/setup.js, bun/bunx, un tube d'installation bun.sh |
Scan-Write.ps1 | PostToolUse (Write/Edit/MultiEdit) | Alarme + met en quarantaine un fichier infecté après son arrivée |
Session-Sweep.ps1 | SessionStart | Balayage rapide du dépôt ; signale toute infection préexistante dans le contexte |
/miasma-scan | commande | Sur demande, encapsule Scan-Miasma.ps1 |
.claude/hooks|commands.github/actions/miasma-guard/.github/workflows/Guard-Bash cible l'exécution, pas la mention : ses motifs (iocs.psd1 → CmdSigs) sont
ancrés à une position de commande, donc les commandes de triage qui nomment simplement un IOC
(grep "node .github/setup.js", yara -r setup-js.yar, cat setup.js) ne sont pas bloquées —
seulement l'exécution réelle de node …/setup.js / bun / un tube d'installation bun.sh l'est. Note : l'invocation
bun/bunx est bloquée directement (le runtime du ver) ; autorisez via CmdSigs si vous avez vraiment besoin de Bun.Scan-Miasma.ps1 (lecture seule), ces hooks modifient l'arborescence (quarantaine). Ils sont
facultatifs : Claude Code demande l'approbation des hooks la première fois qu'il charge .claude/settings.json.