
Détecte la compromission de la chaîne d'approvisionnement CVE-2026-45321 Mini Shai-Hulud — recherche 170 paquets npm + 2 paquets PyPI empoisonnés parmi TanStack, Mistral AI, UiPath, OpenSearch, Guardrails AI
Un scanner Bash rapide, sans dépendance, pour détecter si votre machine est affectée par l'attaque de la chaîne d'approvisionnement CVE-2026-45321 « Mini Shai-Hulud ».
Le 11 mai 2026, plus de 170 paquets npm et 2 paquets PyPI de TanStack, Mistral AI, UiPath, OpenSearch et Guardrails AI ont été empoisonnés simultanément. La charge utile malveillante vole les identifiants AWS, les jetons GitHub, les jetons npm, les secrets Vault et les clés SSH — et inclut un ver auto-propagateur qui se propage via les pipelines CI/CD.
curl -fsSL https://raw.githubusercontent.com/qi-scape/scan-shai-hulud/main/scan-shai-hulud.sh | bash
Ou clonez et exécutez :
git clone https://github.com/qi-scape/scan-shai-hulud.git
cd scan-shai-hulud
chmod +x scan-shai-hulud.sh
./scan-shai-hulud.sh
# Scan current directory + system-wide persistence checks
./scan-shai-hulud.sh
# Scan a specific project
./scan-shai-hulud.sh ~/my-project
# Deep scan across entire home directory
./scan-shai-hulud.sh --full
Le scanner exécute 8 étapes :
170 paquets npm répartis sur 15 scopes :
react-router, vue-router, solid-router, router-core, etc.)mistralai, mistralai-azure, mistralai-gcpopensearchagentwork-cli, cmux-agent-mcp, cross-stitch, , , , , , , 2 paquets PyPI :
mistralai==2.4.6guardrails-ai==0.10.1Si le scanner signale des résultats CRITIQUES :
ghp_*, gho_*, ghs_*), jetons npm, jetons Vault, clés SSH, jetons de compte de service Kubernetesnpm cache clean --force && rm -rf node_modules && npm installlaunchctl unload ~/Library/LaunchAgents/com.user.gh-token-monitor.plist2026-05-11T19:20Znpm access ls-packagesfind, grep, shasum)mdfind (Spotlight macOS, utilisé pour une recherche de fichiers plus rapide)npm, pip (pour les vérifications de paquets/jetons)git (pour les vérifications de dépôts)lsof (pour les vérifications de connexions réseau)MIT
| Étape | Description |
|---|
| Persistance | LaunchAgent macOS (fichier + état chargé launchctl), service systemd Linux, script de sécurité (dead-man's switch), dépôts de charge utile .claude/ et .vscode/, workflows GitHub Actions injectés, droppers /tmp |
| Fichiers malveillants | router_init.js, tanstack_runner.js, router_runtime.js, gh-token-monitor.sh, transformers.pyz — vérifiés par rapport à 3 hash SHA-256 connus |
| Indicateurs C2 | Analyse les fichiers de configuration (.npmrc, .bashrc, .zshrc, .env) et le code source du projet pour détecter 6 domaines C2 + des marqueurs de campagne |
| Paquets npm | Tous les arbres node_modules, la racine globale npm, les lockfiles (package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lock), le cache npm — avec correspondance précise par paquet (42 paquets @tanstack router spécifiques, pas tout le scope) |
| Paquets PyPI | pip show sur tous les environnements Python/conda + requirements.txt, pyproject.toml, Pipfile, poetry.lock |
| Dépôts Git | Hash de commit malveillant dans l'historique, branches dead-drop dependabout/*/setup-formatter, auteur du commit dead-drop, codeql_analysis.yml injecté |
| Historique shell et environnement | Historique Bash/Zsh/Fish pour les traces d'exécution de charge utile, fichiers RC du shell pour les injections, variables d'environnement pour les domaines C2 |
| Réseau et jetons | Connexions actives vers le C2 via lsof, /etc/hosts, ~/.ssh/known_hosts, liste des jetons npm |
git-branch-selectorgit-git-gitml-toolkit-tsnextmove-mcpsafe-actionts-dnawot-api| Indicateur | Valeur |
|---|
| Exfiltration principale | filev2.getsession.org |
| Seeds de session | seed{1,2,3}.getsession.org |
| C2 secondaire | api.masscan.cloud, git-tanstack.com |
| Staging de la charge utile | litter.catbox.moe/h8nc9u.js, litter.catbox.moe/7rrc6l.mjs |
| Commit malveillant | 79ac49eedf774dd4b0cfa308722bc463cfe5885c |