O Node.js lançou atualizações de segurança em 21 de outubro para suas três linhas de lançamento suportadas, 22.x, 24.x e 26.x, corrigindo 10 falhas. A mais grave é um bug no código de descompressão Brotli que o Node.js incorpora. Segundo o projeto, ele pode permitir execução remota de código, o que significa que um atacante poderia executar o código de sua escolha no sistema afetado.
Cada linha suportada tem uma versão corrigida: 22.23.4 e 24.22.1 nas linhas de suporte de longo prazo (LTS, na sigla em inglês), e 26.12.1 na linha atual. As versões 20.x e anteriores do Node.js chegaram ao fim da vida útil e não receberão a correção, por isso devem ser migradas para uma linha suportada.
A falha no Brotli está no código que o Node.js incorpora, e não no programa do próprio usuário. O Node.js executa esse código sempre que descomprime dados Brotli, seja diretamente pelo módulo node:zlib, seja automaticamente quando um código chama fetch() em uma resposta enviada com compressão Brotli.
Uma aplicação fica exposta quando descomprime dados Brotli controlados por um atacante, como o corpo de uma requisição ou uma resposta obtida de outro servidor.
A falha Brotli
A falha é uma escrita fora dos limites do buffer no decodificador Brotli, acionada por dados comprimidos malformados. A correção é um patch do próprio projeto Brotli, incorporado ao Node.js, que faz o decodificador identificar a entrada inválida e interromper o processo antes de escrever além do buffer.
O Brotli é a biblioteca de compressão do Google, e o Node.js traz sua própria cópia. A mesma correção foi publicada nas versões Brotli 1.2.1, 1.1.1 e 1.0.10 em 21 de outubro, de modo que outros softwares que incorporam o Brotli também podem precisar da mesma atualização. A mudança foi feita no código-fonte do Brotli em fevereiro de 2026, mas só foi lançada como atualização de segurança em outubro.
“Execução remota de código” é a descrição do projeto para o que a falha poderia permitir, e a falha foi classificada como alta, e não crítica. O quanto isso foi demonstrado na prática é mais restrito.
Uma prova de conceito pública, publicada em 22 de outubro, alcançou execução de código apenas em uma versão de teste deliberadamente enfraquecida. Em uma versão padrão do Node.js, seu autor relatou uma falha e uma leitura limitada da memória do processo, mas não execução de código, e afirmou que não conseguiu um ataque funcional em uma versão normal.
O Node.js corrigido rejeita a entrada malformada usada pela prova de conceito, e nenhuma exploração da falha em ambientes reais foi relatada até 22 de outubro.
As outras falhas
Três das demais correções também são classificadas como altas. Duas são verificações de certificados TLS (Segurança da Camada de Transporte) que um atacante poderia contornar escrevendo o endereço IP (Protocolo de Internet) de um servidor em um formato incomum, fazendo com que um certificado correspondesse a um host que não deveria (CVE-2026-106069 e CVE-2026-105483). A terceira impede que dns.resolve encurte um nome de host ao encontrar um byte nulo embutido (CVE-2026-105482).
O Node.js classifica a CVE-2026-105483 como alta, embora o commit que corrigiu a falha a descreva como de baixa gravidade e difícil de explorar.
As demais falhas são de gravidade média e baixa. Uma falha de gravidade média faz com que crypto.randomUUID() e crypto.randomInt() retornem os mesmos valores em todos os processos quando a aplicação é empacotada como um snapshot de inicialização ou um aplicativo de executável único (CVE-2026-106074). Isso compromete qualquer sistema que dependa desses valores serem imprevisíveis.
A lista completa, com as linhas afetadas por cada uma, é esta:
O bloqueio de certificados da eMudhra
As mesmas atualizações impedem que o Node.js confie em oito chaves de autoridades certificadoras intermediárias do provedor indiano eMudhra, que foram reportadas como comprometidas poucos dias antes.
O Node.js usa a lista de certificados raiz da Mozilla, mas não realiza verificações de revogação por padrão. Por isso, antes desta atualização, uma cadeia de certificados construída com uma das chaves comprometidas ainda era aceita.
As versões incluem um bloqueio embutido para as oito chaves e atualizam a lista de raízes incorporada para remover três raízes da emSign. O Go aplicou o mesmo bloqueio em sua própria atualização, em 20 de outubro.
Conexões retomadas a partir de uma sessão iniciada antes da atualização não são verificadas novamente até que essa sessão expire, e as linhas já fora de suporte não recebem o bloqueio.
Dependências atualizadas
Além das 10 falhas, as atualizações renovam diversos componentes incorporados. A cópia do undici, o cliente HTTP por trás do fetch(), passa para uma versão que corrige três alertas de gravidade moderada: um na sua verificação de Integridade de Sub-Recursos (SRI) e duas falhas de esgotamento de memória, uma delas no cliente WebSocket embutido no Node.js.
O Node.js também atualizou sua cópia do c-ares em todas as linhas, do OpenSSL nas linhas 22.x e 24.x e do SQLite na linha 22.x, para incluir correções de vulnerabilidades já conhecidas publicamente.
Se não for possível atualizar agora
A solução é atualizar. O comunicado não oferece nenhuma solução temporária para a falha no Brotli, de modo que uma aplicação que não pode ser atualizada de imediato não tem alternativa dentro do próprio Node.js.
A Vercel, que hospeda aplicações Node.js para seus clientes, informou que adicionou em 21 de outubro regras de firewall que bloqueiam o ataque em requisições recebidas. As regras não cobrem respostas Brotli que uma aplicação obtém de outros servidores e não substituem a atualização.