Comprometimento

Em 11 de maio de 2026, entre 19h20 e 19h26 UTC, um atacante publicou 84 versões maliciosas em 42 pacotes @tanstack/* do NPM, combinando o padrão “Pwn Request” de pull_request_target, envenenamento de cache do GitHub Actions across a fronteira de confiança fork↔base e extração de memória de um token OIDC do processo do GitHub Actions runner. Nenhum token do NPM foi roubado e o fluxo de trabalho de publicação do NPM em si não foi comprometido. As versões maliciosas foram detectadas publicamente dentro de 20 minutos por um pesquisador externo, ashishkurmi, trabalhando para stepsecurity. Todas as versões afetadas foram depreciadas; a segurança do NPM foi engajada para remover os tarballs do registro. Não temos evidências de que credenciais do NPM tenham sido roubadas, mas recomendamos fortemente que qualquer pessoa que tenha instalado uma versão afetada em 11 de maio de 2026 rotule suas credenciais do AWS, GCP, Kubernetes, Vault, GitHub, NPM e SSH alcançáveis a partir do host de instalação.

O problema foi rastreado e documentado em TanStack/router#7383 e no GitHub Security Advisory: GHSA-g7cv-rxg3-hmpx. Foram afetados 42 pacotes, com 84 versões (duas por pacote, publicadas aproximadamente 6 minutos aparte). A tabela completa pode ser vista no problema de rastreamento. As famílias de pacotes confirmadas como limpas incluem @tanstack/query*, @tanstack/table*, @tanstack/form*, @tanstack/virtual*, @tanstack/store e @tanstack/start (o pacote meta, e não @tanstack/start-*). Quando um desenvolvedor ou ambiente de CI executa npm install, pnpm install ou yarn install em alguma versão afetada, o NPM resolve a entrada maliciosa de optionalDependencies, busca o commit de payload órfão da rede de fork, executa o script de ciclo de vida prepare e executa um script router_init.js obfuscado de cerca de 2,3 MB contrabandeado no tarball afetado. O script é executado como parte do ciclo de vida do npm install, portanto, qualquer pessoa que tenha instalado uma versão afetada em 11 de maio de 2026 deve tratar o host de instalação como potencialmente comprometido.

Todas as horas são em UTC, com carimbos de data e hora locais do GitHub API e registro do NPM. Três vulnerabilidades foram encadeadas juntas. Cada uma delas é necessária para o ataque; nenhuma delas é suficiente sozinha. O arquivo bundle-size.yml executou pull_request_target para pull requests de fork e, dentro desse contexto de disparo, verificou a referência de mesclagem do fork e executou uma compilação. O autor do fluxo de trabalho tentou uma divisão de confiança (o trabalho comment-pr é separado do benchmark-pr, com um comentário no YAML notando a intenção de manter o benchmark-pr “não confiável com permissões somente leitura”). A divisão é correta em espírito, mas perdeu dois fatos: o arquivo malicioso vite_setup.mjs foi projetado especificamente para gravar dados no diretório pnpm-store sob uma chave que o fluxo de trabalho legitimo release.yml computaria e procuraria: Linux-pnpm-store-${hashFiles(‘**/pnpm-lock.yaml’)}. Quando o trabalho benchmark-pr terminou, a etapa pós-estágio do actions/cache@v5 salvou a loja pnpm envenenada para essa chave exata. Quando o release.yml foi executado novamente em uma push para o principal, a etapa de instalação de ferramentas restaurou a entrada envenenada — inteiramente como projetado.

Este é o tipo de ataque documentado por Adnan Khan em 2024. Não é um bug específico do TanStack; é uma questão de design conhecida do GitHub Actions que exige mitigação consciente. O release.yml declara id-token: write (necessário legitimamente para publicação confiável do NPM OIDC). Quando a loja pnpm envenenada é restaurada no executor, os binários controlados pelo atacante agora estão no disco e são invocados durante a etapa de compilação. Esses binários: este é a mesma técnica de extração de memória (e script Python verbatim, com comentário de atribuição) usada no comprometimento do tj-actions/changed-files em março de 2025. O atacante não inventou novas técnicas; recombinau pesquisas publicadas. A cadeia só funciona porque cada vulnerabilidade cruza a fronteira de confiança que as outras supõem: código de fork de PR cruzando para cache de repositório base, cache de repositório base cruzando para tempo de execução do fluxo de trabalho de lançamento e tempo de execução do fluxo de trabalho de lançamento cruzando para acesso de gravação no registro do NPM.

A detecção foi externa. O carlini abriu o problema #7383 cerca de 20 minutos após a publicação, com análise técnica completa. O Tanner recebeu uma ligação do Socket.dev apenas momentos após iniciar a sala de guerra, confirmando a situação. Em qualquer manifesto do pacote @tanstack/*: essas perguntas precisam ser respondidas antes de fecharmos a análise pós-morte. Veja o GitHub Security Advisory para a lista completa de versões afetadas: GHSA-g7cv-rxg3-hmpx. É fundamental que os desenvolvedores e equipes de segurança estejam cientes dessas vulnerabilidades e tomem medidas para mitigá-las e proteger seus projetos e infraestruturas.

Além disso, é importante notar que a comunidade de desenvolvedores e segurança do GitHub Actions deve trabalhar juntos para melhorar a segurança e a confiabilidade do ecossistema. Isso inclui a implementação de práticas de segurança robustas, como a validação de inputs, a autenticação e a autorização, além de realizar testes e auditorias regulares para identificar e corrigir vulnerabilidades. A colaboração e a compartilhamento de conhecimentos e experiências são fundamentais para melhor