
Comprobador de IOC para el ataque a la cadena de suministro de npm TanStack/Mini Shai-Hulud (CVE-2026-45321)
curl -fsSL https://raw.githubusercontent.com/nkopylov/tanscript-exploit-check/main/check-tanstack-exploit.sh | bash
O clonar y ejecutar localmente:
git clone https://github.com/nkopylov/tanscript-exploit-check.git
cd tanscript-exploit-check
./check-tanstack-exploit.sh [directorio_del_proyecto ...]
Este comprobador cubre dos oleadas de la campaña de ataque a la cadena de suministro Mini Shai-Hulud por parte de TeamPCP:
El 11 de mayo de 2026 (19:20-19:26 UTC), un atacante publicó 84 versiones maliciosas en 42 paquetes @tanstack/* de npm en una ventana de 6 minutos. El ataque también afectó a paquetes de Mistral AI, UiPath, OpenSearch y otros, con más de 170 paquetes en total en npm y PyPI.
No se robaron credenciales de mantenedores. El atacante explotó la propia cadena de confianza del CI/CD mediante un ataque de 3 etapas:
pull_request_target — Un fork de GitHub desechable abrió un PR que ejecutaba código del atacante en el contexto de seguridad del repositorio base.El 19 de mayo de 2026 (01:39-02:06 UTC), la cuenta comprometida de npm atool ([email protected]) publicó 637 versiones maliciosas en 314 paquetes en dos oleadas automatizadas. Los objetivos de alto impacto incluyen:
size-sensor (4.2M descargas/mes)echarts-for-react (3.8M descargas/mes)@antv/scale (2.2M descargas/mes)timeago.js (1.15M descargas/mes)@antv/* y otrosEsta oleada utilizó una carga útil basada en Bun (498KB index.js) activada mediante "preinstall": "bun run index.js", con una carga útil de segunda etapa oculta en commits impostores enviados al repositorio de GitHub antvis/G2 mediante la explotación del objeto compartido del fork.
Ambas oleadas utilizan la misma familia de herramientas "Mini Shai-Hulud":
gh-token-monitor (Oleada 1) y kitty-monitor (Oleada 2) mediante LaunchAgent/systemd; hooks en .claude/settings.json y .vscode/tasks.json.toJSON(secrets), intercambio de tokens OIDC de npm.rm -rf ~/ si el token de GitHub se revoca mientras el daemon está activo.firedalazer, comandos firmados con RSA-PSS.| # | Comprobación | Descripción |
|---|---|---|
| 1 | Interruptor de hombre muerto | Demonios de persistencia: gh-token-monitor (Oleada 1), kitty-monitor (Oleada 2) |
| 2 | Procesos maliciosos | Nombres de procesos conocidos del atacante (ambas oleadas) |
| 3 | Archivos de carga útil | Archivos maliciosos conocidos por nombre y hash SHA-256 (4 hashes) |
| 4 | Hooks de Claude Code | Hooks inyectados en .claude/settings.json + heurística genérica de SessionStart |
| 5 | Tareas de VS Code | Tareas inyectadas en .vscode/tasks.json + heurística genérica de runOn: folderOpen |
| 6 | GitHub Actions | toJSON(secrets) en cualquier flujo de trabajo + advertencia de pull_request_target |
| 7 | Archivos lock de npm | Versiones de paquetes comprometidos en archivos lock |
| 8 | optionalDependencies | @tanstack/setup y @antv/setup maliciosos + 4 SHAs de commits impostores |
| 9 | Conexiones de red | Conexiones activas a infraestructura C2 (5 dominios/IPs) |
| 10 | Caché DNS | Resolución previa de dominios del atacante (4 dominios) |
| 11 | Ramas de Git | Patrón de nombres de ramas del atacante con temática de Dune |
| 12 | Scripts de ciclo de vida | Heurística: bun run en preinstall/postinstall (paquetes instalados) |
| 13 | C2 de buzón muerto | Palabra clave firedalazer y marcadores "Shai-Hulud" en el historial de git |
| 14 | Dependencias de GitHub | Heurística: dependencias github: fijadas a un SHA de commit en optionalDeps |
Solo se vieron afectados @tanstack/router* y @tanstack/start*. NO afectados: @tanstack/query*, @tanstack/table*, @tanstack/form*, @tanstack/virtual*, @tanstack/store.
| Paquete | Versiones maliciosas | Primera versión segura |
|---|---|---|
@tanstack/react-router | 1.169.5, 1.169.8 | 1.169.9 |
@tanstack/router-core | 1.169.5, 1.169.8 | 1.169.9 |
@tanstack/vue-router | 1.169.5, 1.169.8 | 1.169.9 |
@tanstack/solid-router | 1.169.5, 1.169.8 | 1.169.9 |
@tanstack/react-start | 1.167.68, 1.167.71 | 1.167.72 |
@tanstack/router-plugin | 1.167.38, 1.167.41 | 1.167.42 |
Consulte el aviso completo para los 42 paquetes.
Todos los paquetes publicados por el usuario de npm atool ([email protected]) recibieron versiones maliciosas el 19 de mayo de 2026. Los paquetes de alto impacto incluyen:
| Paquete | Descargas mensuales |
|---|---|
size-sensor | 4.2M |
echarts-for-react | 3.8M |
@antv/scale | 2.2M |
timeago.js | 1.15M |
Además de 310+ paquetes principalmente en el ámbito @antv/* (@antv/g2, @antv/g6, @antv/l7, @antv/s2, @antv/x6, @antv/f2, etc.), ai-figure, timeago-react, jest-canvas-mock, jest-date-mock y otros.
Consulte el informe de SafeDep para la lista completa.
CRÍTICO: Deshabilite el interruptor de hombre muerto ANTES de revocar cualquier token. El malware borra
$HOMEsi los tokens se revocan mientras el daemon está activo.
gh-token-monitor Y kitty-monitor) y elimine los servicios de LaunchAgent/systemd..claude/router_runtime.js, .vscode/setup.mjs, ~/.local/share/kitty/cat.py, /var/tmp/.gh_update_state, etc.)node_modules y los archivos lock, reinstale con --ignore-scriptsapi.masscan.cloud, filev2.getsession.org, git-tanstack.com, t.m-kosche.com)