Falha no decodificador Brotli do Node.js pode permitir execução remota de código em todas as versões suportadas
22 de Outubro de 2026

O Node.js lançou atualizações de segurança em 21 de outubro para suas três linhas com suporte, 22.x, 24.x e 26.x, corrigindo 10 falhas. A mais grave está no código de descompressão Brotli incorporado ao Node.js. Segundo o projeto, ela pode permitir execução remota de código, o que significa que um invasor poderia executar comandos de sua escolha no sistema afetado.

Cada linha com suporte recebeu uma versão corrigida: 22.23.4 e 24.22.1 nas linhas com suporte de longo prazo, e 26.12.1 na linha atual. O Node.js 20.x e versões anteriores chegaram ao fim da vida útil e não receberão a correção. Por isso, devem ser atualizados para uma linha com suporte.

A falha no Brotli está no código incorporado ao Node.js, não no programa desenvolvido pelo usuário. O Node.js executa esse código sempre que descompacta dados Brotli, seja diretamente pelo módulo `node:zlib`, seja automaticamente quando o código chama `fetch()` para obter uma resposta enviada com compressão Brotli.

Um aplicativo fica exposto quando descompacta dados Brotli controlados por um invasor, como o corpo de uma solicitação ou uma resposta obtida de outro servidor.

A falha no Brotli

A falha consiste em uma gravação fora dos limites da memória no decodificador Brotli, provocada por dados compactados malformados. A correção foi desenvolvida pelo projeto Brotli e incorporada ao Node.js. Com ela, o decodificador identifica dados inválidos e interrompe o processamento antes de gravar além dos limites do espaço reservado na memória.

O Brotli é uma biblioteca de compressão do Google, e o Node.js inclui uma cópia própria. A mesma correção foi lançada no Brotli 1.2.1, 1.1.1 e 1.0.10 em 21 de outubro. Outros programas que incorporam o Brotli também podem precisar da atualização. A mudança foi feita inicialmente no código-fonte do Brotli em fevereiro de 2026, mas só foi distribuída como atualização de segurança em outubro.

O projeto descreve a falha como capaz de permitir execução remota de código e a classifica como de gravidade alta, não crítica. No entanto, as evidências públicas sobre o que foi demonstrado na prática são mais limitadas.

Uma prova de conceito publicada em 22 de outubro conseguiu executar código apenas em uma versão de teste deliberadamente enfraquecida. Em uma versão padrão do Node.js, o autor relatou uma falha do programa e uma leitura limitada da memória do processo, mas não execução de código. Também afirmou não ter conseguido realizar um ataque funcional em uma versão normal.

As versões corrigidas do Node.js rejeitam os dados malformados usados pela prova de conceito. Até 22 de outubro, não havia relatos de exploração da falha no mundo real.

As demais falhas

Três das outras correções também receberam classificação de gravidade alta. Duas tratam de verificações de certificados TLS que um invasor poderia contornar ao escrever o endereço IP de um servidor em um formato incomum. Com isso, um certificado poderia corresponder a um host que não deveria autenticar (CVE-2026-106069 e CVE-2026-105483). A terceira impede que `dns.resolve` corte um nome de host ao encontrar um byte nulo inserido nele (CVE-2026-105482).

O Node.js classifica a CVE-2026-105483 como de gravidade alta, embora a alteração que corrigiu a falha a descreva como de baixa gravidade e difícil exploração.

As demais falhas são de gravidade média ou baixa. Uma delas, de gravidade média, faz com que `crypto.randomUUID()` e `crypto.randomInt()` retornem os mesmos valores em todos os processos quando um aplicativo é compilado como um snapshot de inicialização ou como um executável único (CVE-2026-106074). Isso compromete qualquer recurso que dependa da imprevisibilidade desses valores.

A lista completa, com as linhas afetadas:

| CVE | Descrição | Gravidade | Linhas afetadas |
|---|---|---|---|
| CVE-2026-111497 | Gravação fora dos limites no decodificador Brotli; execução remota de código, segundo o projeto | Alta | 22.x, 24.x, 26.x |
| CVE-2026-106069 | Contorno da verificação do nome de host TLS quando um host é convertido em endereço IP em formato não canônico | Alta | 22.x, 24.x, 26.x |
| CVE-2026-105483 | Contorno da verificação do nome de host TLS quando um endereço IP é escrito com algarismos de largura completa | Alta | 24.x, 26.x |
| CVE-2026-105482 | `dns.resolve` trunca nomes que contêm um byte nulo | Alta | 22.x, 24.x, 26.x |
| CVE-2026-105481 | Um soquete com conexão persistente pode processar uma resposta recebida antes do envio da solicitação | Média | 22.x, 24.x, 26.x |
| CVE-2026-106072 | A validação de certificados para endereços IPv4 em formato não canônico permite que nomes DNS autentiquem endpoints de IP | Média | 22.x, 24.x, 26.x |
| CVE-2026-106074 | Caches de `randomUUID()` e `randomInt()` reutilizados em snapshots de inicialização e aplicativos de executável único | Média | 22.x, 24.x, 26.x |
| CVE-2026-106070 | `ZipFile` retorna bytes controlados por um invasor após uma verificação de cabeçalho malsucedida | Baixa | 26.x |
| CVE-2026-106071 | O Modelo de Permissões concede acesso excessivo a arquivos por meio de uma consulta com curinga | Baixa | 26.x |
| CVE-2026-106073 | Contorno do Modelo de Permissões com `fs.realpathSync` | Baixa | 22.x, 24.x, 26.x |

Bloqueio de certificados da eMudhra

As atualizações também impedem que o Node.js confie em oito chaves de autoridades certificadoras intermediárias da provedora indiana eMudhra, cujo comprometimento havia sido divulgado dias antes.

O Node.js usa a lista de certificados raiz da Mozilla, mas não verifica revogações por padrão. Antes da atualização, uma cadeia de certificados baseada em uma das chaves comprometidas ainda era aceita.

As novas versões bloqueiam essas oito chaves e atualizam a lista de certificados raiz incorporada ao programa para remover três certificados raiz da emSign. O Go adotou o mesmo bloqueio em uma atualização própria, lançada 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 a sessão expire. As linhas que chegaram ao fim da vida útil também não recebem esse bloqueio.

Dependências atualizadas

Além das 10 falhas, as atualizações renovam vários componentes incorporados. A versão do undici, cliente HTTP usado por `fetch()`, foi atualizada para corrigir três avisos de gravidade moderada: um relacionado à verificação de Integridade de Subrecursos e dois ligados ao esgotamento de memória. Um deles afeta o cliente WebSocket incorporado ao Node.js.

O Node.js também atualizou o c-ares incorporado em todas as linhas, o OpenSSL nas versões 22.x e 24.x, e o SQLite na versão 22.x. As mudanças incluem correções para vulnerabilidades conhecidas publicamente.

Se não for possível atualizar agora

A atualização é a solução. O aviso não oferece uma alternativa temporária para a falha no Brotli. Portanto, aplicativos que não puderem ser atualizados de imediato não terão uma medida de proteção substituta dentro do próprio Node.js.

A Vercel, que executa o Node.js para seus clientes, afirmou ter adicionado regras de firewall em 21 de outubro para bloquear tentativas de exploração em solicitações recebidas. As regras não protegem contra respostas Brotli que um aplicativo obtém de outros servidores e não substituem a atualização.

Publicidade

Anuncie no CaveiraTech e coloque sua marca na frente de milhares de profissionais de cybersecurity

Nossa audiência é formada por analistas, pentesters, decisores e entusiastas que consomem nossas notícias todo dia pelo Site, Newsletter e Instagram. Fale com quem realmente importa para o seu negócio. Anuncie aqui. Saiba mais...