
Detecta CVE-2026-45321 (compromiso de la cadena de suministro de TanStack) y artefactos del gusano Mini Shai-Hulud. Escanea node_modules, lockfiles, hooks de persistencia (Claude Code, VS Code, systemd, LaunchAgent), flujos de trabajo de GitHub, historial de git, dominios C2 y configuraciones de herramientas de IA.
⚠️ Aviso legal: Esta herramienta fue creada para mi propio caso de uso. Todos los indicadores se derivan de las siguientes fuentes de avisos de seguridad:
- GHSA-g7cv-rxg3-hmpx
- Snyk: Paquetes npm de TanStack comprometidos
- StepSecurity: Análisis en profundidad de Mini Shai-Hulud
Si aparecen nuevos IOC, variantes de payload o infraestructura del atacante después de la última actualización, no serán detectados. Comprueba siempre los avisos de seguridad publicados más recientes.
Detecta el compromiso de la cadena de suministro de TanStack (CVE-2026-45321) y los artefactos relacionados con el gusano Mini Shai-Hulud en una copia local de un proyecto.
El script está pensado para un triaje rápido en copias de código fuente, trabajos de CI y builds de Docker. Un resultado limpio significa que no se encontró ninguno de los indicadores conocidos que se indican a continuación. No es una investigación forense completa ni una garantía de que una máquina nunca estuvo expuesta.
| Categoría | Detalles |
|---|---|
| Paquetes comprometidos | Los 42 paquetes @tanstack/* + 20 víctimas secundarias propagadas por el gusano (@mistralai, @opensearch-project, @draftlab, safe-action, etc.) |
| Escaneo de lockfiles | pnpm-lock.yaml, yarn.lock, bun.lock, bun.lockb, package-lock.json, incluyendo entradas packages multilínea de npm v3 y bloques selector/versión de Yarn v1 |
| Archivos payload | router_init.js, tanstack_runner.js en node_modules con verificación SHA-256; tanto las coincidencias exactas de hash como los desajustes de hash hacen fallar el escaneo |
| Vector de infección | @tanstack/setup como optionalDependency en cualquier paquete instalado |
| Persistencia | Hooks SessionStart de Claude Code en la configuración del proyecto y del home, tareas folderOpen de VS Code, gh-token-monitor (LaunchAgent + systemd), workflows maliciosos de GitHub |
| Artefactos en disco | .claude/router_runtime.js, .claude/setup.mjs, .vscode/setup.mjs, gh-token-monitor.sh, com.user.gh-token-monitor.plist |
| IOC de código fuente | Hashes de commits del atacante, dominios C2 (api.masscan.cloud, git-tanstack.com), endpoints de Session Protocol, salt PBKDF2, cadenas de campaña |
| Historial de Git | Commits creados por [email protected] |
| Patrones de ramas | dependabot/github_actions/format/* y dependabout/*/setup-formatter |
| Configuraciones de herramientas de IA |
pnpm, yarn, bun y luego npm). Si un repositorio contiene intencionadamente varios lockfiles, escanea por separado el estado de cada gestor de paquetes relevante.npm está disponible y con la autenticación suficiente para npm token list.HOME actual del proceso que ejecuta el script. En CI o contenedores, puede diferir del directorio home de la estación de trabajo del desarrollador.# Scan current directory
bash check-tanstack-compromise.sh .
# Scan a specific project
bash check-tanstack-compromise.sh /path/to/project
# One-liner (curl)
curl -sL https://raw.githubusercontent.com/ry-allan/tanstack-compromise-checker/main/check-tanstack-compromise.sh | bash
Código de salida 0 = no se encontraron indicadores cubiertos.
Código de salida 1 = se encontró un compromiso cubierto o un indicador de payload sospechoso.
═══════════════════════════════════════════════════════════════
TanStack Supply Chain Compromise Check (CVE-2026-45321)
═══════════════════════════════════════════════════════════════
Advisory: GHSA-g7cv-rxg3-hmpx
Reference: https://snyk.io/blog/tanstack-npm-packages-compromised/
Deep dive: https://www.stepsecurity.io/blog/mini-shai-hulud-is-back-…
[*] Scanning: /Users/xxxxx/repos/xxxxx
[*] Package manager: pnpm (pnpm-lock.yaml)
[*] Checking installed TanStack packages against 42 known-compromised versions…
[*] Checking worm-propagated secondary victims (Mini Shai-Hulud)…
[*] Packages: @mistralai, @opensearch-project, @draftlab, @draftauth,
[*] @dirigible-ai, safe-action, cmux-agent-mcp, nextmove-mcp,
[*] git-git-git, git-branch-selector, agentwork-cli, ml-toolkit-ts,
[*] wot-api, cross-stitch, ts-dna
[*] Scanning lockfile for known-compromised versions (pnpm-lock.yaml)…
[✓] No compromised versions in lockfile
[*] Checking for persistence artifacts (payload files, hooks, services, C2)…
[✓] No malicious author commits in git history
───────────────────────────────────────────────────────────────
[✓] No compromise detected.
Instala Aikido Safe Chain para escanear automáticamente cada instalación de paquetes en busca de malware:
curl -fsSL https://github.com/AikidoSec/safe-chain/releases/latest/download/install-safe-chain.sh | sh
Reinicia tu terminal después. Safe Chain envuelve npm, npx, yarn, pnpm, pip, uv y más, bloqueando paquetes con menos de 48 horas de antigüedad y versiones conocidas como maliciosas antes de que lleguen al disco. No requiere tokens ni configuración.
El Dockerfile de integración solo crea fixtures sintéticos. No descarga paquetes comprometidos reales.
El fixture principal verifica que los 33 mensajes de detección se disparan en manifiestos de paquetes, lockfiles, artefactos de persistencia, workflows, historial de git, IOC de código fuente, nombres de archivos payload, configuraciones de herramientas de IA y salida de remediación:
docker build -f integration.Dockerfile -t tanstack-check-test .
El build de Docker también incluye cobertura de regresión específica para:
package-lock.json v3 en las que el nombre del paquete y la versión comprometida aparecen en líneas separadas.version comprometida aparecen en líneas separadas.router_init.js con hash no coincidente que devuelven el código de salida 1.SessionStart de Claude Code a nivel de home incluso cuando existe un .claude/settings.json limpio a nivel de proyecto.Tras el build, el comando de la imagen puede ejecutarse directamente:
docker run --rm tanstack-check-test
.claude/mcp.json y .kiro/settings/mcp.json manipulados |
| Procesos en ejecución | Procesos daemonizados del payload y de gh-token-monitor |
| Tokens de npm | Tokens marcados con mensaje de ransomware (IfYouRevokeThisTokenItWillWipeTheComputerOfTheOwner) |