Alarme de malware no Zod 4.6.6: o commit malicioso nunca chegou ao npm
O Zod 4.6.6 saiu em 11 de outubro com commits maliciosos de 21 de setembro no histórico. Eles foram revertidos no mesmo dia, e nenhum chegou ao npm.
4 min de leitura

O Zod 4.6.6, a versão mais recente da popular biblioteca de validação para TypeScript, foi lançado em 11 de outubro de 2026. A página da versão lista commits de um ataque de malware, e desenvolvedores deram o alarme no GitHub e no Hacker News. Esses commits foram enviados em 21 de setembro e revertidos no mesmo dia. Segundo o aviso de segurança do GitHub, as alterações maliciosas no Zod nunca chegaram ao npm, o registro onde os pacotes JavaScript são publicados.
O Zod verifica se os dados, como um formulário ou uma resposta de API, têm o formato que um programa espera. Muitos projetos TypeScript dependem dele.
Por que o Zod 4.6.6 parecia infectado
A página da versão 4.6.6 lista todos os commits desde a versão anterior, a 4.6.5. Essa lista inclui dois commits com o título «Fix bugs and improve performance» e mudanças de versão chamadas «4.6.7» e «4.6.8». Ela também inclui duas alterações na configuração de publicação: «ci: publish to npm with NPM_TOKEN» e «ci: drop the npm environment approval gate from publish».
Uma issue do GitHub com o título «Suspicious preinstall script in v4.6.6 commit history» apontou o primeiro desses commits. Uma discussão no Hacker News perguntou «Zod 4.6.6 compromised by malware?». O autor da issue fez uma ressalva:
A alteração parece ter sido revertida antes da versão final, e os arquivos suspeitos não parecem estar presentes na versão 4.6.6 publicada no npm.
A mesma lista também inclui «Cleanup bad commits (#6620)», a alteração que os removeu.
O que o ataque de 21 de setembro fez
O aviso do GitHub traz a cronologia. O mesmo carregador chegou a três projetos em menos de uma hora.
| Horário (UTC) | Repositório | O que aconteceu |
|---|---|---|
| 11:56 | colinhacks/zod | Commit d821685, «Fix bugs and improve performance» |
| 12:37 | standard-schema/standard-schema | Commit com o mesmo título e o mesmo carregador |
| 12:54 | nubjs/nub | Commit com o mesmo título e o mesmo carregador |
| 13:00 | nubjs/nub | Complemento, «chore: update npm/nub package» |
| 13:09 | npm | Análise do @nubjs/nub@0.9.4 registrada; a versão foi bloqueada |
O commit no Zod adicionou dois arquivos de quatro linhas chamados meta.test.mjs, um no pacote principal e outro no Zod Mini. Apesar do nome, eles não são testes. O commit também adicionou uma entrada preinstall para executá-los. Isso é um hook de instalação: código que roda quando um pacote é instalado. Ele mudou a versão para 4.6.6 e alterou o workflow de lançamento para que um push na branch principal iniciasse uma publicação.
O carregador pede um endereço web a um contrato inteligente, um pequeno programa armazenado na blockchain do Ethereum. Em seguida, baixa JavaScript desse endereço, executa o código com as permissões do usuário que está instalando e apaga seus arquivos temporários. Como o endereço vem da blockchain, o código do repositório nunca mostra onde o payload fica. O malware de npm MALFEX, noticiado este mês, usa um truque parecido com a Solana.
Por que nada chegou ao npm
O mantenedor, colinhacks no GitHub, escreveu na discussão do aviso: «Parece que algum tipo de credencial de git push foi comprometida, não um token do npm ou do GitHub». O mantenedor também escreveu: «O ataque consistiu em commits maliciosos e pushes com tags para a main».
Outros commits naquele dia tentaram forçar um lançamento. Eles removeram a etapa de aprovação, adicionaram um caminho de publicação usando um secret NPM_TOKEN e aumentaram a versão duas vezes. Segundo o mantenedor, o fluxo de lançamento do Zod não estava exposto a esse tipo de ataque desde que o npm removeu a publicação baseada em token em dezembro passado. O aviso afirma que as alterações no Zod e no standard-schema «não chegaram à publicação no npm».
O Nub foi diferente. O lançamento dele podia ser iniciado com a criação de uma tag, então o @nubjs/nub@0.9.4 chegou ao pipeline de publicação do npm. O registro segurou a versão para verificações, encontrou o código malicioso e a bloqueou antes que alguém pudesse instalá-la.
O pull request #6620, «Cleanup bad commits», reverteu seis commits e foi mesclado em 21 de setembro. Ele apagou o novo workflow de publicação do invasor e os arquivos do carregador, removeu as entradas preinstall e voltou a versão para 4.6.5.
Como o Zod 4.6.6 foi publicado
Segundo o registro do pacote no npm, a 4.6.6 foi publicada pelo GitHub Actions via publicação confiável (trusted publishing), com aprovação de colinhacks. A publicação confiável permite que o npm aceite um lançamento apenas de um workflow específico do GitHub, então não existe token de longa duração para roubar. No início deste mês, o npm passou a permitir que a publicação confiável mova dist-tags como latest. O pacote traz um atestado de proveniência, um registro assinado de onde ele foi compilado. O manifesto não lista nenhum script preinstall, install ou postinstall.
O lançamento também reforça o processo. Duas das suas alterações, #6622 e #6638, deixam as novas versões do npm em espera em vez de publicá-las e seguram cada execução até que essas versões sejam aprovadas. Em 24 de setembro, o mantenedor escreveu que todos os seus pacotes npm agora usam publicação em etapas que só pode ser iniciada manualmente.
Segundo o mantenedor, a forma como a credencial de push foi obtida ainda está sendo investigada junto com o GitHub.
O que isso significa para os desenvolvedores
- Nenhum sinal de malware no Zod 4.6.6 do npm. O manifesto não tem hook de instalação, e o pacote traz proveniência.
npm view zod@4.6.6 scriptsmostra os scripts sem instalar nada. - Procure o domínio de entrega nos logs. O aviso lista
dsakldjklsaj33112[.]comcomo indicador. Verifique as máquinas que compilaram o Zod, o standard-schema ou o nub a partir do código-fonte do Git em 21 de setembro. Remova os colchetes ao pesquisar. - Desative scripts de instalação onde puder. Esse ataque dependia de um hook preinstall. A configuração
ignore-scriptsdo npm impede que esses hooks sejam executados. Teste se o projeto ainda compila, já que alguns pacotes precisam dos seus scripts. - Mantenedores podem copiar a configuração do Zod. O invasor conseguia fazer push na main e editar o workflow, mas mesmo assim não conseguiu publicar o Zod. A publicação confiável somada a uma etapa de aprovação manual resistiu. Um lançamento que começa a partir de uma tag, como o do nub, é o design mais fraco.
Fontes
- Security advisory: malicious npm package changes affecting zod, nub, and standard-schema - GitHub Community
- Fix bugs and improve performance (commit d821685) - GitHub (colinhacks/zod)
- Cleanup bad commits (#6620) - GitHub (colinhacks/zod)
- Release v4.6.6 - GitHub (colinhacks/zod)
- Suspicious preinstall script in v4.6.6 commit history - GitHub (colinhacks/zod)
- zod 4.6.6 package manifest - npm registry
Artigos relacionados

MALFEX: malware no npm passou 14 meses sem ser detectado
MALFEX, uma campanha de malware no npm feita por uma só pessoa, publicou 12 pacotes desde 2023 e somou 40.767 downloads. Alguns pacotes continuam no ar, sem aviso de segurança.

O trusted publishing do npm agora pode mover dist-tags via OIDC
O trusted publishing do npm agora pode adicionar, mover e remover dist-tags como latest com tokens OIDC de curta duração. O recurso vem desativado por padrão e exige o npm 11.21.0.

Node.js 22.23.3 LTS corrige um bug use-after-free no HTTP/2
O Node.js 22.23.3 LTS, lançado em 23 de setembro, corrige um bug use-after-free no HTTP/2, adiciona suporte a SharedArrayBuffer na Node-API e passa para o OpenSSL 3.5.8.