
Detecta CVE-2026-45321 Mini Shai-Hulud compromiso en la cadena de suministro — escanea en busca de 170 paquetes npm y 2 paquetes PyPI envenenados en TanStack, Mistral AI, UiPath, OpenSearch, Guardrails AI
Un escáner Bash rápido y sin dependencias para detectar si tu máquina está afectada por el ataque a la cadena de suministro CVE-2026-45321 "Mini Shai-Hulud".
El 11 de mayo de 2026, más de 170 paquetes npm y 2 paquetes PyPI de TanStack, Mistral AI, UiPath, OpenSearch y Guardrails AI fueron envenenados simultáneamente. El payload malicioso roba credenciales de AWS, tokens de GitHub, tokens de npm, secretos de Vault y claves SSH, e incluye un gusano que se propaga automáticamente a través de pipelines CI/CD.
curl -fsSL https://raw.githubusercontent.com/qi-scape/scan-shai-hulud/main/scan-shai-hulud.sh | bash
O clona y ejecuta:
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
# Escanea el directorio actual + verificaciones de persistencia en todo el sistema
./scan-shai-hulud.sh
# Escanea un proyecto específico
./scan-shai-hulud.sh ~/my-project
# Escaneo profundo en todo el directorio home
./scan-shai-hulud.sh --full
El escáner ejecuta 8 pasos:
170 paquetes npm en 15 ámbitos:
react-router, vue-router, solid-router, router-core, etc.)mistralai, mistralai-azure, mistralai-gcpopensearchagentwork-cli, cmux-agent-mcp, cross-stitch, , , , , , , 2 paquetes PyPI:
mistralai==2.4.6guardrails-ai==0.10.1Si el escáner reporta hallazgos CRÍTICOS:
ghp_*, gho_*, ghs_*), tokens de npm, tokens de Vault, claves SSH, tokens de cuenta de servicio de 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 (macOS Spotlight, usado para búsqueda más rápida de archivos)npm, pip (para verificaciones de paquetes/tokens)git (para verificaciones de repositorios)lsof (para verificaciones de conexiones de red)MIT
| Paso | Descripción |
|---|
| Persistencia | macOS LaunchAgent (archivo + estado cargado en launchctl), servicio systemd de Linux, script de dead-man's switch, depósitos de payload en .claude/ y .vscode/, flujos de trabajo de GitHub Actions inyectados, droppers en /tmp |
| Archivos maliciosos | router_init.js, tanstack_runner.js, router_runtime.js, gh-token-monitor.sh, transformers.pyz — verificados contra 3 hashes SHA-256 conocidos |
| Indicadores C2 | Escanea archivos de configuración (.npmrc, .bashrc, .zshrc, .env) y el código fuente del proyecto en busca de 6 dominios C2 + marcadores de campaña |
| Paquetes npm | Todos los árboles node_modules, la raíz global de npm, archivos de bloqueo (package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lock), caché de npm — con coincidencia precisa por paquete (42 paquetes específicos de @tanstack router, no todo el ámbito) |
| Paquetes PyPI | pip show en todos los entornos Python/conda + requirements.txt, pyproject.toml, Pipfile, poetry.lock |
| Repositorios Git | Hash de commit malicioso en el historial, ramas de 'dead-drop' dependabout/*/setup-formatter, autor del commit de 'dead-drop', codeql_analysis.yml inyectado |
| Historial de shell y env | Historial de Bash/Zsh/Fish en busca de rastros de ejecución de payload, archivos RC del shell para inyecciones, variables de entorno para dominios C2 |
| Red y tokens | Conexiones activas a C2 a través de lsof, /etc/hosts, ~/.ssh/known_hosts, lista de tokens npm |
git-branch-selectorgit-git-gitml-toolkit-tsnextmove-mcpsafe-actionts-dnawot-api| Indicador | Valor |
|---|
| Exfiltración principal | filev2.getsession.org |
| Semillas de sesión | seed{1,2,3}.getsession.org |
| C2 secundario | api.masscan.cloud, git-tanstack.com |
| Almacenamiento de payload | litter.catbox.moe/h8nc9u.js, litter.catbox.moe/7rrc6l.mjs |
| Commit malicioso | 79ac49eedf774dd4b0cfa308722bc463cfe5885c |