arrow_backVoltar ao Blog
segurancanpmsupply chainJavaScriptengenharia

TanStack npm sob ataque: worm Mini Shai-Hulud comprometeu 160+ pacotes e afetou ate a OpenAI

personLab Desenvolvimento
schedule5 min

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:

  1. 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.

  2. 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).

  3. 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

  1. pull_request_target e inerentemente arriscado - audite workflows que o utilizam
  2. Ataques de cache poisoning em CI/CD sao subestimados e extremamente dificeis de detectar
  3. A confianca cega em OIDC trusted publishers nao elimina riscos se o runtime runner estiver comprometido
  4. A cadeia de suprimentos do JavaScript continua sendo um dos vetores de ataque mais criticos

Post-mortem oficial: TanStack Blog