Para: desenvolvedores que instalam dependências JavaScript com npm (incluindo pnpm e yarn), quem usa extensões no VS Code ou em suas variantes, mantenedores que publicam pacotes a partir do GitHub Actions e administradores do GitHub Enterprise Server. Este artigo se baseia nos pós-mortems e comunicados publicados pela TanStack, pela Nx e pelo GitHub e não aborda técnicas de ataque.
O que os desenvolvedores devem fazer hoje
Verifique lockfiles e logs de CI em busca das versões afetadas da TanStack
Os pacotes afetados são 42 pacotes Router/Start, 84 versões, incluindo @tanstack/react-router, @tanstack/react-start, @tanstack/router-core e @tanstack/history (lista completa no aviso do GitHub GHSA-g7cv-rxg3-hmpx). A TanStack afirma que Query, Table, Form, Virtual e seus outros pacotes não foram afetados. Verifique não apenas o conteúdo atual do seu lockfile, mas também o histórico de alterações dele em torno de 11 de maio de 2026. As versões maliciosas foram removidas do npm em poucas horas, então uma instalação feita nessa janela pode não aparecer no lockfile atual. No CI, procure jobs que executaram uma instalação após 19:20 UTC de 11 de maio.
Verifique se você tinha o Nx Console v18.95.0
O pós-mortem do Nx mostra como verificar a versão instalada com code --list-extensions --show-versions (o ID da extensão contém angular-console). Apenas a v18.95.0 foi afetada, e ela esteve disponível em 18 de maio entre 12:30 e 13:09 UTC. O Nx pede que quem tinha o Nx Console com atualização automática habilitada durante essa janela trate a máquina como comprometida, independentemente de qual número de instalações se confirme como correto. O pós-mortem também lista arquivos e processos a procurar (indicadores de comprometimento); se você foi afetado, percorra essa lista.
Se foi afetado, rotacione todas as credenciais acessíveis a partir dessa máquina
A TanStack e o Nx listam os mesmos alvos: tokens do GitHub, tokens do npm, chaves SSH, credenciais de nuvem (AWS, GCP, Azure), Kubernetes, tokens do Vault e o conteúdo de qualquer arquivo .env. O Nx acrescenta as credenciais que ferramentas da máquina poderiam ter gerado durante a janela (credenciais temporárias de nuvem, tokens da GitHub CLI e assim por diante) e recomenda considerar uma reconstrução completa da máquina após a rotação. Para a ordem de revogação e como lidar com malware residente, veja a seção "se você suspeita de infecção" de Defendendo-se contra worms de supply chain no npm.
Se você mantém pacotes npm, verifique o histórico de publicações
Segundo a TanStack, o código procurava outros pacotes que a vítima mantém e tentava republicá-los com a mesma injeção. Se você publica no npm, verifique o histórico de versões dos seus pacotes em busca de versões que você não publicou desde 11 de maio.
Descubra onde o seu token do GitHub está armazenado na sua máquina
Segundo o Nx, a credencial roubada era um token da GitHub CLI. Nesse ambiente, ele estava armazenado em um arquivo no disco e legível por qualquer processo executado como o usuário, e foi usado contra a API do GitHub em até 74 segundos. Execute gh auth status para ver onde o seu está armazenado; se ele estiver em um arquivo de texto simples, considere movê-lo para o chaveiro do sistema operacional ou para uma integração com gerenciador de senhas que injete a credencial somente em tempo de execução. Após o incidente, a política do Nx passou a proibir o uso direto da GitHub CLI em máquinas de desenvolvedores. Para reduzir a duração e o escopo dos tokens, veja Defendendo-se contra worms de supply chain no npm.
Confirme que a sua configuração de idade mínima de release realmente tem efeito
Segundo o Nx, o projeto do contribuidor comprometido tinha minimum-release-age=10080 (7 dias) no seu .npmrc, mas o projeto fixava o pnpm 10.14, que não suporta essa configuração e a ignorou silenciosamente. O suporte começa com o pnpm 10.16. A versão maliciosa tinha apenas 77 minutos no momento da instalação, então uma configuração funcional a teria bloqueado. Verifique a versão fixada no campo packageManager do package.json e faça o CI verificar se ela é suficientemente recente. A configuração equivalente para o npm está em Defendendo-se contra worms de supply chain no npm.
Administradores do GitHub Enterprise Server: rotacionem a chave de assinatura
Em 26 de maio, o GitHub anunciou que está rotacionando chaves, incluindo a chave que assina os pacotes de atualização do GitHub Enterprise Server. Os administradores devem rotacionar as chaves públicas GPG em sua instância; caso contrário, as atualizações futuras falharão com um erro informando que o arquivo não é um pacote GHES válido. As instruções e o digest SHA256 do script auxiliar estão na publicação do GitHub. O GitHub também pede que os clientes baixem as atualizações do GHES apenas da fonte oficial e se preparem para receber atualizações de segurança com mais frequência nos próximos meses. Clientes do GitHub Enterprise Cloud não precisam tomar nenhuma providência.
O que quem publica pacotes deve revisar no CI
Os pós-mortems da TanStack e do Nx dizem especificamente quais configurações permitiram que a cadeia avançasse. A seguir, essas constatações são traduzidas em configurações e políticas que você pode verificar nos seus próprios repositórios.
Não execute código de forks sob pull_request_target
Segundo a TanStack, um workflow de tamanho de bundle era executado em pull_request_target e, dentro dele, fazia checkout e compilava código de um pull request de fork. O pull_request_target roda com os privilégios do repositório base, e a TanStack observa que a barreira de aprovação para contribuidores de primeira viagem não se aplica a esse gatilho. Mantenha-o apenas para tarefas que nunca executam código externo, como aplicar rótulos e comentar. Após o incidente, a TanStack removeu todo uso de pull_request_target do seu CI.
Não compartilhe caches entre jobs não confiáveis e jobs de release
Segundo a TanStack, o cache do GitHub Actions é compartilhado por repositório: execuções de pull_request_target e envios para a main usam o mesmo escopo. Além disso, o salvamento de cache também não é bloqueado ao definir permissions: do workflow como somente leitura. Como resultado, o workflow de release restaurou um cache gravado por um job que havia executado código externo. Após o incidente, a TanStack desativou o cache de pacotes em seu pipeline de release e limpou todos os caches. Não restaurar caches em workflows que publicam é a linha mais simples de traçar.
Conceda o direito de publicar (id-token: write) apenas ao job de publicação, atrás de uma aprovação
O workflow de release da TanStack tinha id-token: write para o trusted publishing do npm (OIDC). Segundo o pós-mortem, a publicação maliciosa não partiu da etapa de publicação definida no workflow; código executado em outra etapa da mesma execução extraiu um token e publicou diretamente. A lição da própria TanStack é que um vínculo de publicador confiável não tem revisão por publicação. Separe a publicação em um job próprio, apartado da compilação e dos testes, dê essa permissão somente a esse job e coloque-o atrás de um ambiente do GitHub com revisores obrigatórios. Após o incidente, o Nx tornou obrigatória, para a publicação, a aprovação de alguém diferente da pessoa que disparou a execução.
Fixe ações de terceiros em um SHA de commit
Após o incidente, tanto a TanStack quanto o Nx fixaram cada referência de ação em um SHA de commit, em vez de uma tag ou branch. A TanStack descreve as referências móveis como "risco permanente à cadeia de suprimentos, independente deste incidente".
Encaminhe as notificações de publicação e os logs de auditoria para alguém que os leia
O Nx detectou a versão adulterada graças ao e-mail de notificação de rotina que o marketplace de extensões envia a cada upload. Um mantenedor que não esperava uma versão a reconheceu como anômala e a removeu em cerca de 11 minutos. O segundo canal de distribuição não tinha essa notificação, e a remoção ali levou cerca de 36 minutos. Enquanto isso, atividades realizadas com o token roubado, como a exclusão de execuções de workflow, ficaram no log de auditoria por uma semana sem serem percebidas. Verifique se as notificações de publicação chegam a alguém da equipe e se alguém acompanha o log de auditoria em busca de execuções de workflow excluídas.
O que aconteceu (segundo as divulgações das três organizações)
Tudo a seguir está como declarado no pós-mortem da TanStack, no pós-mortem do Nx e no comunicado do GitHub. Os horários estão em UTC.
11 de maio de 2026, 19:20–19:26
Pelo workflow de release do repositório Router/Start da TanStack, 84 versões maliciosas de 42 pacotes são publicadas no npm.11 de maio, 19:46
Um pesquisador externo registra um relatório detalhado no repositório da TanStack. A TanStack inicia sua resposta.11 de maio, 20:43
Um contribuidor do Nx executapnpm installem um projeto não relacionado ao Nx e resolve o@tanstack/zod-adapter@1.166.15malicioso. Segundo o Nx, o token da GitHub CLI foi roubado e usado em até 74 segundos.11 de maio, até 21:03
A TanStack deprecia todas as 84 versões.11 de maio, 22:13–23:55
O npm remove do registro os tarballs afetados.15 de maio
A TanStack emite um comunicado de normalidade: todas as versões publicadas atualmente são seguras.18 de maio, 12:30–13:09
Usando o acesso do contribuidor roubado, o Nx Console v18.95.0 é publicado em dois canais de distribuição de extensões e depois retirado.18 de maio (segunda-feira, horário dos EUA)
O GitHub detecta e contém um comprometimento de um dispositivo de funcionário envolvendo uma extensão envenenada do VS Code, remove a versão maliciosa da extensão e isola o endpoint. Segredos críticos são rotacionados naquele dia e no seguinte.20 de maio
O GitHub torna o caso público: sua avaliação é que somente repositórios internos do GitHub foram exfiltrados.21 de maio
O Nx publica seu pós-mortem.26 de maio
O GitHub atualiza sua publicação: está rotacionando chaves, incluindo a chave de assinatura do GitHub Enterprise Server, e lista ações para administradores.
- TanStack: escopo
- 42 pacotes, 84 versões do repositório Router/Start. Repositórios Query, DB, Store, Table, Form, Virtual e outros não afetados. A TanStack afirma não ter evidências de que tokens do npm tenham sido roubados
- TanStack: o que o código fazia
- Executava como script durante a instalação, coletava credenciais de nuvem, Kubernetes, Vault, npm, GitHub e SSH e as enviava para fora, além de tentar se espalhar para outros pacotes que a vítima mantém
- TanStack: causa raiz
- A combinação de (1) compilar código de fork sob
pull_request_target, (2) esse job poder gravar um cache que o workflow de release restaura e (3) o workflow de release poder gerar um token OIDC capaz de publicar - Nx: escopo
- Somente o Nx Console v18.95.0 (v18.100.0 e posteriores são seguras). CLI do Nx, plugins oficiais
@nx/*e Nx Cloud não afetados. O marketplace oficial contabilizou 28 instalações; o segundo canal, 41 downloads. As análises próprias do Nx indicam cerca de 6.000 ativações, e a diferença ainda está sendo conciliada - Nx: causa raiz
- (1) o comprometimento upstream da TanStack, (2) uma configuração de idade mínima de release silenciosamente ignorada por um pnpm antigo, (3) um token da GitHub CLI legível em disco, (4) um pipeline que permitiu que um único contribuidor publicasse a extensão
- GitHub: escopo
- Avaliação: exfiltração somente de repositórios internos do GitHub. Não há evidências de impacto em informações de clientes armazenadas fora deles, como as de empresas, organizações e repositórios próprios dos clientes. Alguns repositórios internos contêm informações de clientes, como trechos de interações de suporte
- GitHub: resposta
- Removeu a versão maliciosa da extensão e isolou o endpoint. Rotacionou segredos críticos, começando pelos de maior impacto. Rotacionou chaves, incluindo a chave de assinatura do GitHub Enterprise Server, e pediu aos administradores que rotacionassem a chave pública. Afirma que publicará um relatório mais completo quando a investigação for concluída
Nota de leitura: o 'número de repositórios retirados do GitHub' não é um dado do próprio GitHub
A publicação do GitHub menciona um número de repositórios exfiltrados, mas apresenta esse valor como alegação do atacante, dizendo apenas que é "direcionalmente consistente" com sua investigação até o momento. Este site não trata alegações de atacantes como fatos, por isso esse número não é repetido aqui. Da mesma forma, o Nx afirma que seus números de instalação divergem entre as fontes e ainda estão sendo conciliados. Em vez de qualquer número, decida com base em se você tinha a versão afetada durante a janela.
Onde a cadeia poderia ter sido interrompida
1. CI da TanStack
Código externo de PR grava em cache compartilhado com o release
↓→
Interromper aqui
Sem pull_request_target / sem restauração de cache em workflows de publicação / aprovação para publicar
2. 84 versões maliciosas no npm
Publicadas pelo caminho legítimo, por isso pareciam reais
↓→
Interromper aqui
Um atraso de idade mínima de release — em uma versão da ferramenta que o respeite
3. Máquina de um contribuidor do Nx
Token da GitHub CLI lido de um arquivo em disco
↓→
Interromper aqui
Sem arquivos de token em texto simples / acompanhar exclusões no log de auditoria
4. Nx Console v18.95.0
O acesso de uma só pessoa publica a extensão
↓→
Interromper aqui
Exigir aprovação de alguém diferente de quem disparou a execução
5. Dispositivo de funcionário do GitHub
Extensão envenenada, depois repositórios internos exfiltrados
↓→
Interromper aqui
Tratar atualizações de extensões como dependências (próxima seção)
O que não comprovou segurança desta vez
- Caminho legítimo de publicação e proveniência: as versões maliciosas da TanStack saíram de um vínculo OIDC válido
- Uma conta real de contribuidor: o Nx Console foi publicado com o acesso de um contribuidor genuíno
- As verificações automatizadas do canal de distribuição: segundo o Nx, a versão adulterada passou pela verificação automatizada do marketplace oficial
- Configurações definidas, mas não realmente aplicadas: a configuração de idade mínima de release foi silenciosamente ignorada por um pnpm antigo
O que poderia ter interrompido a cadeia (segundo os pós-mortems)
- Aprovação de uma segunda pessoa antes da publicação: o Nx já a exigia em outros repositórios, mas não no Nx Console
- Separar os workflows de publicação dos caches: a TanStack desativou o cache depois
- Um atraso de idade mínima de release que realmente funcione: a versão maliciosa tinha 77 minutos no momento da instalação
- Uma pessoa lendo a notificação rotineira de publicação: foi a única detecção do Nx
Visão deste site: a atualização automática de extensões é uma entrada automática de dependências
Para dependências do npm, "não instale nada publicado nos últimos dias" está se tornando prática comum. As extensões de editor, porém, geralmente se atualizam automaticamente por padrão, e esse raciocínio ainda não chegou a elas. Por isso o Nx escreveu que quem tem a atualização automática habilitada deve presumir um comprometimento. Além disso, uma extensão roda na máquina que guarda suas credenciais do GitHub e da nuvem, com os seus privilégios. Em máquinas que têm direitos de produção ou de publicação de pacotes, considere desligar as atualizações automáticas com a configuração extensions.autoUpdate do VS Code e aplicar as atualizações você mesmo após alguns dias. O custo são correções de segurança mais lentas, mas uma versão retirada em minutos após o lançamento, como neste caso, é evitada apenas pelo atraso.
Um ponto adicional: essa cadeia atravessou fronteiras organizacionais. O contribuidor do Nx instalou o pacote malicioso em um projeto não relacionado ao Nx, e o funcionário do GitHub instalou a extensão do Nx. Sua máquina de desenvolvimento faz parte da cadeia de suprimentos de todo projeto para o qual você envia código, não apenas da cadeia do seu empregador.
Fontes (registros públicos)
Os fatos deste artigo vêm das fontes públicas listadas abaixo. Não tratamos de técnicas de ataque nem de informações que identifiquem os atacantes.
- TanStack, "Postmortem: TanStack npm supply-chain compromise" (publicado em 11 de maio de 2026; atualizado em 15 de maio) — tanstack.com
- TanStack, "Hardening TanStack After the npm Compromise" (mudanças pós-incidente) — tanstack.com
- GitHub Advisory Database, "GHSA-g7cv-rxg3-hmpx (CVE-2026-45321)" (lista completa das versões afetadas) — github.com
- Nx, "Postmortem: Nx Console v18.95.0 supply-chain compromise" (21 de maio de 2026) — nx.dev
- Aviso de segurança do Nx Console "GHSA-c9j4-9m59-847w" — github.com
- GitHub, "Investigation update: GitHub Enterprise Server signing key rotation" (publicado em 20 de maio de 2026; atualizado em 26 de maio) — github.blog
- GitHub Security Lab, "Keeping your GitHub Actions and workflows secure: Preventing pwn requests" (uso seguro de pull_request_target) — securitylab.github.com
- GitHub Docs, "Managing environments for deployment" (revisores obrigatórios) — docs.github.com
Histórico de atualizações
2026-09-30: Primeira versão, com base no pós-mortem da TanStack (revisão de 15 de maio), no pós-mortem do Nx (21 de maio) e no comunicado do GitHub (atualização de 26 de maio). O GitHub diz que publicará um relatório mais completo quando sua investigação for concluída; atualizaremos esta página quando isso acontecer.
Leia a seguir
- Um caso em que tokens roubados do GitHub foram usados para atingir segredos de CI: Cerca de 4.800 contas do GitHub abusadas (novembro de 2026)
- Um caso mais recente de canal de distribuição adulterado: GODDESS OF VICTORY: NIKKE: arquivos do launcher para PC adulterados para distribuir malware
- O mesmo padrão e a ordem de revogação: Defendendo-se contra worms de supply chain no npm
- Mantenha segredos fora dos repositórios: Impeça segredos de chegarem ao commit com o gitleaks / Por que arquivos .env e chaves de API são arriscados
- Violações por meio de credenciais válidas: Em 2026, as violações ocorreram por meio de credenciais válidas
- Proteção de contas: Escolhendo a autenticação multifator / Privilégio mínimo para chaves SSH
- Tokens de desenvolvedor roubados usados para distribuir código pelo fluxo oficial de release: Malware no LiteLLM 1.107.0
- Outros incidentes de 2026: Vazamentos de dados e ciberataques de 2026 / A violação de dados do Canvas (Instructure)