TanStack npm sob ataque: worm Mini Shai-Hulud comprometeu 160+ pacotes e afetou ate a OpenAI
Em 11 de maio de 2026, o ecossistema JavaScript sofreu um dos ataques mais sofisticados ja vistos na cadeia de suprimentos de pacotes npm. O TanStack manteve bibliotecas amplamente utilizadas como React Query e TanStack Table e foi alvo de um ataque que comprometeu 42 pacotes em 84 versoes maliciosas, afetando indiretamente centenas de projetos downstream, incluindo a OpenAI.
Como o ataque funcionou
O incidente, documentado em post-mortem detalhado pelo fundador Tanner Linsley, combinou tres vulnerabilidades:
-
Pull Request Target (Pwn Request): O atacante abriu um PR contra o repositorio TanStack/router usando conta recem-criada. Como o workflow pull_request_target tem acesso irrestrito a segredos do repositorio base, ele nao precisa de aprovacao de primeiro-contribuidor.
-
Cache Poisoning: Dentro do PR, um commit malicioso (vite_setup.mjs, ~30.000 linhas de JS ofuscado) foi executado durante o benchmark, envenenando o cache do GitHub Actions com chave que correspondia a branch principal (refs/heads/main).
-
Extracao de Token OIDC: Quando a release foi executada dias depois, o cache envenenado foi restaurado. O malware extraiu o token OIDC do runtime do GitHub Actions runner e o usou para publicar pacotes diretamente no registro npm, mesmo com os testes falhando.
Nao houve roubo de tokens npm. O mecanismo de publish nao foi comprometido. O atacante usou o token OIDC do proprio workflow, que tem permissao id-token: write, para autenticar diretamente no npm, explicou Tanner Linsley no post-mortem.
O worm Mini Shai-Hulud
O payload de ~2.3 MB (router_init.js) era um worm autopropagavel que:
- Coletava credenciais de AWS IMDS, GCP metadata, tokens Kubernetes, Vault, GitHub, SSH keys e .npmrc
- Exfiltrava via rede de upload da Session/Oxen Messenger (protocolo criptografado ponta a ponta, impossivel bloquear por C2)
- Autopropagava-se: enumerava outros pacotes que a vitima mantinha e os republicava com a mesma injecao maliciosa
Deteccao e resposta
- 19:20-19:26 UTC - Pacotes maliciosos publicados
- 19:46 UTC - Pesquisador externo ashishkurmi (StepSecurity) abriu issue relatando o ataque
- ~20:00 UTC - Equipe TanStack iniciou resposta a incidentes
- 20:19 UTC - Primeiro pacote deprecado
- Todas as versoes afetadas foram deprecadas e removidas pelo npm
Impacto: O worm se espalhou alem do TanStack. Como o payload enumerava e republicava pacotes das vitimas, centenas de pacotes na cadeia foram comprometidos, atingindo ate projetos como a OpenAI.
Licoes
- pull_request_target e inerentemente arriscado - audite workflows que o utilizam
- Ataques de cache poisoning em CI/CD sao subestimados e extremamente dificeis de detectar
- A confianca cega em OIDC trusted publishers nao elimina riscos se o runtime runner estiver comprometido
- A cadeia de suprimentos do JavaScript continua sendo um dos vetores de ataque mais criticos