
Detecta o CVE-2026-45321 (comprometimento da cadeia de suprimentos do TanStack) e artefatos do worm Mini Shai-Hulud. Examina node_modules, lockfiles, ganchos de persistência (Claude Code, VS Code, systemd, LaunchAgent), workflows do GitHub, histórico do git, domínios C2 e configurações de ferramentas de IA.
⚠️ Aviso: Esta ferramenta foi criada para o meu próprio caso de uso. Todos os indicadores são derivados das seguintes fontes de advisories:
Se novos IOCs, variantes de payload ou infraestrutura do atacante surgirem após a última atualização, eles não serão detectados. Sempre faça a verificação cruzada com os advisories publicados mais recentes.
Detecta o comprometimento da cadeia de suprimentos do TanStack (CVE-2026-45321) e artefatos relacionados ao worm Mini Shai-Hulud em um checkout local de projeto.
O script foi criado para triagem rápida em checkouts de código-fonte, jobs de CI e builds Docker. Um resultado limpo significa que nenhum dos indicadores conhecidos abaixo foi encontrado. Não é uma investigação forense completa nem uma garantia de que uma máquina nunca foi exposta.
| Categoria | Detalhes |
|---|---|
| Pacotes comprometidos | Todos os 42 pacotes @tanstack/* + 20 vítimas secundárias propagadas pelo worm (@mistralai, @opensearch-project, @draftlab, safe-action, etc.) |
| Varredura de lockfile | pnpm-lock.yaml, yarn.lock, bun.lock, bun.lockb, package-lock.json, incluindo entradas packages multilinha do npm v3 e blocos de seletor/versão do Yarn v1 |
| Arquivos de payload | router_init.js, tanstack_runner.js em node_modules com verificação SHA-256; correspondências exatas de hash e divergências de hash ambas falham na verificação |
| Vetor de infecção | @tanstack/setup como optionalDependency em qualquer pacote instalado |
| Persistência | Hooks SessionStart do Claude Code nas configurações do projeto e do diretório home, tarefas folderOpen do VS Code, gh-token-monitor (LaunchAgent + systemd), workflows maliciosos do GitHub |
| Artefatos em disco | .claude/router_runtime.js, .claude/setup.mjs, .vscode/setup.mjs, gh-token-monitor.sh, com.user.gh-token-monitor.plist |
| IOCs de código-fonte | Hashes de commits do atacante, domínios C2 (api.masscan.cloud, git-tanstack.com), endpoints do Session Protocol, salt PBKDF2, strings de campanha |
| Histórico do Git | Commits de autoria de [email protected] |
| Padrões de branch | dependabot/github_actions/format/* e dependabout/*/setup-formatter |
| Configurações de ferramentas de IA | e adulterados |
pnpm, yarn, bun e depois npm). Se um repositório contiver intencionalmente vários lockfiles, faça a varredura separadamente do estado de cada gerenciador de pacotes relevante.npm está disponível e autenticado o suficiente para npm token list.HOME atual do processo que executa o script. Em CI ou contêineres, isso pode diferir do diretório home da estação de trabalho de um desenvolvedor.# 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 saída 0 = nenhum indicador coberto encontrado.
Código de saída 1 = comprometimento coberto ou indicador de payload suspeito encontrado.
═══════════════════════════════════════════════════════════════
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.
Instale o Aikido Safe Chain para verificar automaticamente cada instalação de pacote em busca de malware:
curl -fsSL https://github.com/AikidoSec/safe-chain/releases/latest/download/install-safe-chain.sh | sh
Reinicie o terminal em seguida. O Safe Chain encapsula npm, npx, yarn, pnpm, pip, uv e outros — bloqueando pacotes com menos de 48 horas e versões conhecidamente ruins antes que toquem o disco. Nenhum token ou configuração é necessário.
O Dockerfile de integração cria apenas fixtures sintéticas. Ele não baixa pacotes comprometidos reais.
A fixture principal verifica se todas as 33 mensagens de detecção são acionadas em manifests de pacotes, lockfiles, artefatos de persistência, workflows, histórico do git, IOCs de código-fonte, nomes de arquivos de payload, configurações de ferramentas de IA e saída de remediação:
docker build -f integration.Dockerfile -t tanstack-check-test .
O build Docker também inclui cobertura de regressão direcionada para:
package-lock.json v3 em que o nome do pacote e a versão comprometida aparecem em linhas separadas.version comprometida aparecem em linhas separadas.router_init.js com hash divergente retornando código de saída 1.SessionStart do Claude Code no nível do diretório home mesmo quando existe um .claude/settings.json limpo no nível do projeto.Após o build, o comando da imagem pode ser executado diretamente:
docker run --rm tanstack-check-test
.claude/mcp.json.kiro/settings/mcp.json| Processos em execução | Processos do payload daemonizado e do gh-token-monitor |
| Tokens npm | Tokens marcados com resgate (IfYouRevokeThisTokenItWillWipeTheComputerOfTheOwner) |