Um worm de npm voltado ao roubo de credenciais, que surgiu primeiro em [email protected], se espalhou além dos namespaces Keyv e Cacheable e alcançou centenas de pacotes em várias organizações em 4 de agosto de 2026.
A SafeDep confirmou 353 versões adulteradas em 79 nomes de pacotes no registro do npm.
O monitoramento da empresa ampliou esse número para 442 versões em 353 nomes, enquanto a Aikido depois relatou pelo menos 868 pacotes em 1.381 versões.
Nenhum desses totais mais amplos pôde ser reproduzido de forma independente a partir de uma lista pública completa no momento do fechamento da apuração.
A versão maliciosa usou um script de preinstall para executar um bundle de roubo de credenciais em ambientes de desenvolvedores e de integração contínua (CI).
A SafeDep e a Socket afirmam que o código pode coletar dados de repositórios, do registro de pacotes, da nuvem e de chaves privadas, e depois usar o acesso disponível de publicação no npm para contaminar mais pacotes.
O repositório do Keyv também manteve ganchos separados para Claude Code e Visual Studio Code (VS Code), capazes de executar o payload assim que o usuário confiasse no workspace ou permitisse a configuração do projeto.
A Socket afirma que qualquer estação de trabalho ou runner que tenha executado uma versão afetada deve ser tratada como exposta a credenciais.
A SafeDep orienta equipes de resposta a remover primeiro o observador de revogação de credenciais do malware antes de girar os tokens e chaves expostos.
A revogação é o gatilho do observador.
Se a rotação vier antes, ela pode acionar um manipulador local fornecido pelo atacante.
O npm 12 bloqueia por padrão scripts de ciclo de vida de dependências não aprovados, mas clientes anteriores do npm e outros caminhos de instalação que permitam esses scripts continuam expostos.
A primeira versão maliciosa confirmada foi [email protected].
Ela adicionou node setup.mjs como comando de preinstall e incluiu setup.mjs e Math_Symbol.js no pacote, mantendo inalterado o código compilado da biblioteca.
A primeira etapa verifica se o Bun está presente e, se necessário, baixa a versão 1.3.13 a partir dos lançamentos oficiais no GitHub do runtime.
Em seguida, entrega a execução para um bundle compilado de 727.680 bytes.
A análise do payload feita pela SafeDep indica que o bundle coleta dados de GitHub, npm, cloud, Vault, Kubernetes, bancos de dados e chaves privadas.
Ele também lê a memória de runners do GitHub Actions, instala um observador de revogação de tokens e traz mecanismos de publicação no npm.
A Socket decodificou separadamente código para modificar, versionar e republicar pacotes acessíveis a uma identidade roubada do npm.
O registro mudou rápido demais para sustentar uma lista fixa, em toda a campanha, dos pacotes que ainda apareciam como latest.
Às 17h40, no horário padrão da Índia (IST), de 4 de agosto, páginas do npm mostravam versões anteriores restauradas como latest para pelo menos nove pacotes do conjunto inicial identificado pela SafeDep, incluindo [email protected], [email protected] e [email protected].
A campanha completa não pôde ser mapeada pacote por pacote de forma independente.
Por isso, as verificações de exposição precisam usar nomes exatos de pacotes, versões resolvidas e lockfiles, em vez de uma lista em cache dos rótulos atuais.
Os totais divulgados pela SafeDep e pela Aikido contam artefatos de pacotes maliciosos, não sistemas vítimas.
Eles indicam a escala da campanha, mas não mostram quantas máquinas instalaram ou executaram o payload.
Determinar a exposição em nível de sistema exige a versão exata da dependência resolvida na máquina e se o script de ciclo de vida foi executado.
Com os rótulos mudando, alguns pacotes relacionados permanecendo limpos e o conjunto completo ainda incompleto, um bloqueio baseado apenas em namespace corre o risco de deixar passar versões adulteradas e, ao mesmo tempo, tratar lançamentos inofensivos como comprometidos.
O repositório tem um segundo caminho de execução.
O arquivo .claude/settings.json contém um hook SessionStart que chama .vscode/setup.mjs. O arquivo .vscode/tasks.json traz uma tarefa Environment Setup com runOn: folderOpen que chama .claude/setup.mjs. Esses arquivos criam uma rota para executar o payload a partir de um repositório já clonado, mas não rodam de forma incondicional em todo ambiente padrão.
O VS Code bloqueia tarefas automáticas em um workspace não confiável e pede confirmação antes de permitir sua execução por padrão.
O Claude Code aplica confiança de workspace às configurações de projeto fornecidas pelo repositório.
Às 17h40 IST de 4 de agosto, ambos os arquivos de hook ainda estavam presentes na branch main.
O manifesto core/keyv/package.json ainda declarava a versão 6.0.0, mantinha node setup.mjs como comando de preinstall e listava setup.mjs e Math_Symbol.js para publicação.
A versão contaminada do Keyv carregava proveniência válida de OpenID Connect (OIDC) e de Supply-chain Levels for Software Artifacts (SLSA), porque passou pelo fluxo legítimo de release do GitHub Actions do projeto.
A atestação identificava corretamente o processo de build, mas não conseguia provar que a origem que entrou nele era segura.
A SafeDep encontrou o mesmo payload sob contas diretas de publicação no npm em outras partes da campanha.
A empresa afirma que a propagação automatizada é a hipótese que melhor explica o timing e os surtos de publicação em namespaces inteiros, embora a função inicial não tenha sido recuperada.
As evidências não mostram se o worm se espalhou apenas a partir de uma única identidade de publicação roubada ou se também envolveu credenciais de publicadores comprometidas separadamente.
Assim, o surto de pacotes não permite estabelecer quantas contas foram comprometidas.
O commit que inseriu os hooks de Claude Code e VS Code exibia o selo verde de verificação do GitHub e atribuía a autoria a github-actions[bot].
O selo verificado confirma que a assinatura do commit era válida, enquanto a SafeDep informou que o campo de autor estava definido como github-actions[bot].
Nenhum desses elementos identifica quem controlava a credencial que enviou o commit.
Juntos, os registros de proveniência e de commits validaram as rotas de build e assinatura, mas não provaram que a origem era segura nem quem controlava a credencial.
Nem todo pacote ligado ao mantenedor original foi adulterado.
A SafeDep diz que os adapters publicados em @keyv/* e a linha Keyv 5.x estavam limpos.
O repositório, porém, representa um risco separado: um commit posterior preparou os arquivos do payload em todos os 19 pacotes do workspace, de modo que um release gerado a partir da árvore ainda contaminada os carregaria.
A Semgrep documentou os mesmos hooks de Claude Code e VS Code, o nome de arquivo setup.mjs e o download do Bun 1.3.13 em um comprometimento de abril do pacote lightning no PyPI.
A Aikido atribui a atividade de agosto à família Shai-Hulud.
A sobreposição reforça a ligação com uma família de malware, mas não prova quem operou a atividade de agosto, e nem o vetor inicial de acesso nem um ator nomeado são conhecidos.
Até o fechamento da apuração, não foi localizada uma nota pública de incidente do mantenedor, do npm ou do GitHub.
Atualização, 4 de agosto de 2026: a SafeDep ampliou sua contagem com base no registro para 1.684 versões adulteradas em 420 nomes de pacotes ligados a nove organizações, substituindo o retrato anterior citado acima.
A empresa afirmou que o worm migrou entre organizações a cada dois a sete minutos e concluiu o surto de publicação entre organizações em cerca de meia hora.
A contagem separada da Aikido continua maior em número de pacotes, mas menor em número de versões, por isso os dois números não devem ser somados.
A SafeDep disse que as versões contaminadas de Keyv e Cacheable foram despublicadas depois, mas o latest ainda resolvia para uma versão maliciosa na maioria dos outros nomes de pacotes afetados no momento da atualização.
Apenas atualizar pode, portanto, preservar a exposição.
As equipes devem comparar lockfiles e versões resolvidas com a lista de pacotes afetados, desativar scripts de instalação desnecessários e tratar como comprometidos os ambientes que executaram uma versão afetada.
Os pesquisadores também contabilizaram 546 repositórios públicos no GitHub criados em 4 de agosto com a descrição Shai-Hulud: Here We Go Again e um diretório results/.
Esses repositórios são potenciais artefatos de exfiltração ou de preparação, e não 546 vítimas confirmadas.
Em uma nova verificação, o repositório do Keyv ainda mantinha os diretórios .claude e .vscode na branch main, inclusive os arquivos associados ao caminho separado de execução via Claude Code e VS Code descrito acima.
Publicidade
Vibecoding cria 10x mais sistemas, 20x mais vulneráveis. E quem ganha com isso é a galera do hacking ético e pentest. Quer ser pago para invadir sistemas? Então você tem que aprender com a Solyd que são os melhores do Brasil. Saiba mais...