Pular para o conteúdo
Categoria: Hardening18 min de leitura

Falha no Node.js Brotli, guia de patch para Dev e Ops

Compartilhar

Por Lucas Andrade ·

Falha no Node.js Brotli é o destaque do security release de 21 de outubro de 2026, com versões corrigidas, ordem de patch e mitigação até atualizar.

Neste artigo

A falha no Node.js Brotli é uma escrita fora dos limites no decodificador Brotli (CVE-2026-111497) corrigida no security release de 21 de outubro de 2026, com potencial de execução remota de código segundo o projeto Node.js. Quem roda 22.x, 24.x ou 26.x precisa subir para 22.23.4, 24.22.1 ou 26.12.1 e reiniciar os processos.

Se você mantém API, BFF, SSR, workers ou jobs em Node.js, o risco prático começa no inventário de runtime, não no node -v da sua máquina. Imagens Docker, tags móveis, nvm/asdf/volta, CI e runtimes gerenciados costumam esconder versões diferentes da que você lembra ter congelado no papel.

Este guia, no ângulo de defesa e operação, responde o que o aviso oficial do Node.js de 21 de outubro de 2026 confirma, quem está afetado, como achar a versão real em produção, em que ordem atualizar, o que fazer enquanto o patch não sobe e como encaixar isso num programa de gestão de vulnerabilidades.

O que mudou no security release do Node.js de 21 de outubro de 2026#

O projeto publicou correções para as linhas 22.x, 24.x e 26.x, e classificou a severidade máxima do pacote como HIGH. O destaque é a vulnerabilidade Brotli Node.js registrada como CVE-2026-111497, descrita como escrita fora dos limites no decoder com potencial de execução remota de código. As versões corrigidas confirmadas nas notas de release são Node.js 22.23.4, além de 24.22.1 e 26.12.1 na mesma data.

Além disso, o mesmo pacote traz outras falhas de alto impacto em DNS e TLS, além de itens médios e baixos em HTTP, crypto, zlib e Permission Model. O aviso também lista atualizações de dependências embutidas, entre elas c-ares, certificados (incluindo resposta ao compromisso da CA intermediária eMudhra), OpenSSL nas linhas onde aplicável, SQLite na 22.x e Undici nas três linhas suportadas.

Porém, há um ponto de cuidado na documentação pública. Em 21 de outubro de 2026, o registro em CVE.org para CVE-2026-111497 ainda aparecia como Reserved, enquanto o Node.js já descrevia o problema e publicava o patch. Quando a ficha CVE e o NVD ainda não consolidam CVSS, prevalece o que o aviso oficial afirma, e você registra a divergência no ticket de patch em vez de inventar nota.

Na prática, o erro que mais atrasa o fechamento é tratar o release como só Brotli e ignorar TLS e DNS no mesmo ciclo. Se fosse comigo, eu abriria um único change com as três linhas de runtime do inventário, o ID CVE-2026-111497 no topo e uma checklist de reinício, porque binário novo sem processo novo não reduz exposição.

Quem está afetado pela falha no Node.js Brotli e nas outras correções#

Estão no escopo confirmado pelo projeto as linhas 26.x, 24.x e 22.x para a falha no Node.js Brotli. O mesmo vale para CVE-2026-105482 (dns.resolve com byte NUL) e para CVE-2026-106069 (bypass de validação de hostname TLS quando o host resolve de forma frouxa para IP). Já o CVE-2026-105483, outro bypass de hostname TLS com dígitos fullwidth, o aviso limita a 26.x e 24.x, sem listar 22.x.

O projeto também afirma que versões em fim de vida são sempre consideradas afetadas quando há security release, e que não recebem o patch. A linha 25 está em EOL desde 1º de junho de 2026, conforme o cronograma do repositório de releases do Node.js e a página de End-of-Life do projeto. Linhas como 20.x, já encerradas em 30 de abril de 2026, ficam na mesma lógica de afetadas sem correção oficial nesta rodada.

Além disso, o caminho de exposição da falha Brotli é a descompressão. Serviços que aceitam corpo com Content-Encoding: br, clientes que decodificam respostas br de origem não confiável, proxies que descomprimem e código que chama zlib.brotliDecompress, brotliDecompressSync ou createBrotliDecompress sobre dados controlados por terceiros merecem prioridade. Comprimir a própria resposta com Brotli não é o mesmo que descomprimir entrada hostil, mas o patch continua obrigatório porque o runtime vulnerável permanece na caixa.

Por isso, se o seu inventário ainda tem Node 25 porque era Current há pouco, a saída não é esperar backport. A saída é migrar para 22.23.4, 24.22.1 ou 26.12.1 na linha que o produto suporta. Muita gente acha que EOL só importa no papel, e quase sempre está enganada, porque o próximo CVE chega e o time descobre que não há binário oficial para aplicar.

Como saber a versão do Node em produção (containers e runtimes gerenciados)#

node -v no laptop não prova a versão do processo que atende tráfego. Você precisa medir o binário que de fato carrega memória no host, no pod, na função ou no container. Em muitos times, a imagem de build, a imagem de runtime e o runner de CI usam tags diferentes, e só uma delas está no caminho crítico.

Comece pelo processo vivo e pelo artefato. Em máquina ou VM, compare which -a node, node -v e o caminho absoluto do binário sob systemd, PM2 ou supervisor. Em Kubernetes, rode o comando dentro do container da Deployment ou StatefulSet real, não no init container de build. Em Docker, pinne tags semânticas e confira o digest, porque node:22 e node:lts andam com o tempo. Em 21 de outubro de 2026, o catálogo oficial no Docker Hub da imagem node já listava tags 22.23.4, 24.22.1 e 26.12.1 nas variantes Debian, Alpine e slim.

Além disso, inventarie runtimes gerenciados e serverless (Elastic Beanstalk, Cloud Run, App Service, Lambda com runtime Node, Heroku stacks, PaaS internos). Lá o controle costuma ser a versão da plataforma, não o package.json. Confira também nvm, asdf e volta no servidor, porque um unit file antigo pode apontar para um shim diferente do shell do operador. Em CI, leia a imagem do job e o cache de tool-cache. Em lockfiles, engines.node e .nvmrc são intenção, não prova de deploy.

FonteO que verificarSinal de risco
Processo em produçãonode -v no PID ou container que serve tráfegoVersão abaixo de 22.23.4, 24.22.1 ou 26.12.1 na respectiva linha
Imagem DockerTag pinada e digestTag móvel (22, lts) sem rebuild após 21/10/2026
Runtime gerenciadoVersão anunciada pelo provedorPlano ainda em 20.x, 23.x ou 25.x
Tooling local e CInvm, asdf, volta e imagem do pipelineBuild verde em versão patchada e deploy em versão antiga

O erro que mais custa caro aqui é auditar só o repositório e esquecer o base image do Dockerfile de produção. Se fosse comigo, eu exigiria evidência de versão por ambiente (dev, hml, prd) no mesmo ticket, com log do comando no container, antes de marcar o CVE como mitigado.

Como atualizar o Node.js e em que ordem#

A ordem certa reduz janela de risco sem transformar o patch numa migração de major. Primeiro atualize o que é internet-facing e o que descomprime Brotli de entrada ou de saída não confiável. Depois o restante dos workers, crons e ferramentas internas. Por fim, feche a cadeia de build para a imagem antiga não voltar no próximo deploy.

  1. Congele o inventário de serviços Node com exposição pública, com quem aceita Content-Encoding: br e com quem faz fetch ou HTTP client para origens externas.
  2. Escolha a linha suportada do produto e pinne a versão corrigida (atualizar Node.js 24.22.1 se você está em 24.x, Node.js 22.23.4 se está em 22.x, ou 26.12.1 se está em 26.x), conforme as notas da 24.22.1.
  3. Atualize o base image ou o pacote do sistema, rebuild com --pull quando for container, e publique digest novo.
  4. Reinicie ou faça rolling restart de todos os processos que ainda carregam o binário antigo.
  5. Valide smoke de saúde, TLS de saída e um fluxo que exercite compressão e descompressão usada pelo app.
  6. Só então atualize workers internos, jobs e imagens de CI, para o pipeline não redeployar a versão vulnerável.

Porém, atualizar a linha major no meio do incidente (por exemplo, pular de 22 para 26 sem regressão) amplia o blast radius. Se o app ainda não foi validado na linha alvo, prefira o menor salto que recebe o patch. Em distros que linkam libbrotli do sistema em vez do Brotli embutido do binário oficial, o caminho de correção pode passar pelo pacote da distribuição além do pacote nodejs, e isso precisa entrar no mesmo change.

Além disso, trate o patch como mudança de runtime com rollback pronto. Guarde a imagem anterior, o digest e o procedimento de volta. Mitigações de proxy ajudam a comprar tempo, mas não substituem o binário corrigido. Na prática, o que eu vejo com mais frequência é o time atualizar o laptop do desenvolvedor e deixar o Deployment em tag antiga. O critério de pronto é processo em produção reportando a versão patchada após restart.

O que fazer enquanto não dá para atualizar#

Mitigação sem patch reduz superfície, mas não elimina a falha no decoder embutido no runtime. Enquanto o change de versão não sobe, priorize cortar a chegada de Brotli não confiável e reforçar a validação de hostname TLS por uma camada extra, sem fingir que isso fecha o CVE.

No perímetro, recuse ou normalize pedidos com Content-Encoding: br no reverse proxy quando o seu app não precisa descomprimir corpo de cliente. Navegadores comuns raramente enviam corpo de requisição Brotli, então essa trava costuma ter baixo impacto em tráfego legítimo de formulário e API JSON. No app, desative parsers que inflacionam Brotli de upload até o patch. Em clientes HTTP que falam com terceiros, limite origens, preferências de encoding e timeouts, sabendo que a correção definitiva ainda é o runtime novo.

Além disso, para o bypass de validação de hostname TLS, acrescente controles fora do Node, como mTLS onde fizer sentido, allowlist de destinos, inspeção de certificado em sidecar ou política de egress. WAF e rate limit ajudam contra abuso óbvio, mas não são antídoto confiável para escrita fora dos limites em biblioteca nativa. Limites de tamanho de body e de tempo de descompressão reduzem impacto de payload patológico, porém continuam sendo controles parciais.

Por isso, documente a mitigação com data absoluta, dono e prazo de remoção. Mitigação eterna vira dívida invisível. Se fosse comigo, eu só aceitaria ainda não patchamos com data de expiração no ticket e com monitoramento de crash, OOM e de respostas 4xx ou 5xx ligadas a encoding, porque silêncio nos logs não prova ausência de tentativa.

Qual é o impacto no ecossistema de frameworks e imagens#

Frameworks e apps que rodam sobre Node.js herdam a versão do runtime do host. Next.js, Nest, Express, Fastify, Adonis e similares não escapam do CVE-2026-111497 se o processo ainda usa binário vulnerável. Em 21 de outubro de 2026, o que as fontes do próprio Node.js confirmam é o patch nas linhas 22, 24 e 26 e a atualização do Undici embutido (por exemplo, undici 6.29.1 na nota da 22.23.4, 7.30.1 na 24.22.1 e 8.12.2 na 26.12.1), e não um advisory separado de cada framework para este CVE.

Além disso, a imagem oficial node no Docker Hub passou a oferecer as tags patchadas, o que importa para qualquer pipeline que faça FROM node. Quem usa tag móvel precisa rebuildar e redeployar. Quem usa distribuição Linux com Node empacotado pelo vendor precisa acompanhar o advisory da distro, porque o Brotli pode ser o da árvore do Node ou o libbrotli do sistema. O projeto google/brotli também publicou releases de segurança 1.0.10, 1.1.1 e 1.2.1 citando o mesmo CVE, o que mostra que a correção não é exclusiva do binário Node.

Porém, provedores serverless e PaaS podem atrasar a disponibilidade da versão patchada em relação ao tarball oficial. Nesse caso, a mitigação de perímetro e a pressão de suporte ao provedor entram no mesmo plano, sem inventar prazo que a fonte não deu. Undici e fetch no Node acompanham a atualização embutida do release. Se o app pinna undici próprio no package.json, revise a versão declarada à parte do runtime.

Na prática, o que eu vejo com mais frequência é o time patchar o serviço A e esquecer a imagem base compartilhada do monorepo. Se a cadeia de suprimentos com SBOM já lista o runtime, use esse inventário para achar todos os artefatos com Node abaixo do piso. Sem SBOM, o atalho é grep de FROM node e de engines em todos os repos que deployam.

As outras falhas do release (dns.resolve com NUL e bypass de hostname TLS)#

O security release não é um CVE isolado. O CVE-2026-105482 trata de dns.resolve truncando nomes que contêm byte NUL, o que pode fazer a aplicação resolver um nome diferente do que o código acreditava validar. Isso afeta 22.x, 24.x e 26.x. Em sistemas que montam hostname a partir de entrada externa antes do resolve, a inconsistência vira bug de autorização ou de roteamento.

Já o bypass de validação de hostname TLS aparece em mais de um identificador. O CVE-2026-105483 cobre o caso de IP escrito com dígitos fullwidth e, segundo o aviso, afeta 26.x e 24.x. O CVE-2026-106069 cobre o caso em que o host resolve de forma frouxa para um endereço IP e afeta as três linhas. Há ainda CVE-2026-106072 associado a validação imprópria para hostnames IPv4 não canônicos, tratado nas notas de release junto das correções de TLS. Em todos esses casos, o risco típico é conexão de saída que aceita certificado errado para o destino pretendido.

Além disso, o pacote inclui itens médios e baixos (HTTP keep-alive fora de ordem, caches de aleatoriedade em snapshots, ZIP, Permission Model). Eles não devem sequestrar a prioridade do Brotli e do TLS, mas merecem entrada no mesmo ciclo de atualização, porque você já vai reiniciar o runtime. Relatórios secundários da imprensa de segurança chegaram a contar dez vulnerabilidades no conjunto. Use a lista do aviso oficial como fonte normativa e trate contagens externas como apoio.

Por isso, se o seu serviço é cliente TLS intensivo (webhooks, SSO, APIs bancárias, scraping interno), o patch de hostname não é secundário cosmético. Muita gente acha que só API pública importa, e quase sempre está enganada, porque o bypass enfraquece a confiança do lado que inicia a conexão. Eu priorizaria, logo após os descompressores Brotli, os workers de integração de saída.

Checklist para desenvolvedores#

O papel do time de desenvolvimento é achar onde o app descomprime, onde resolve DNS com entrada externa e onde confia cegamente no tls ou fetch do runtime. Sem esse mapa, o patch de plataforma sobe e o risco residual do código permanece opaco.

  • Confirme engines e .nvmrc alinhados às versões patchadas da linha escolhida.
  • Busque uso de brotliDecompress, createBrotliDecompress, parsers de body com Brotli e clientes que aceitam br.
  • Revise pontos que passam hostname de usuário para dns.resolve ou para conexão TLS.
  • Atualize undici próprio se o projeto o declara fora do Node embutido.
  • Garanta testes de smoke cobrindo upload, proxy e webhooks de saída após o bump de runtime.
  • Não publique PoC nem payload de exploração em repositório da empresa. Foque em regressão e telemetria.

Além disso, abra o PR de Dockerfile ou base image junto com o PR de app quando ambos existirem, para evitar merge pela metade. Se o framework exige piso mínimo de Node, valide a matriz antes do deploy. Em ambientes com feature flag de compressão, prefira falhar fechado (recusar br inesperado) até o runtime novo estar estável.

O erro que mais custa caro aqui é assumir que não usamos Brotli porque a resposta do app vai em gzip. Descompressão de entrada e de respostas de terceiros é outro caminho. Se fosse comigo, eu só fecharia o card de desenvolvimento com grep documentado, versão pinada e smoke verde no ambiente que espelha produção.

Checklist para operações e SRE#

Ops fecha o ciclo inventário, patch, restart e prova. Sem a prova no processo vivo, o CVE permanece aberto no radar mesmo com pipeline verde.

  • Liste todos os serviços Node por ambiente e exposição (internet-facing primeiro).
  • Compare versão do processo com 22.23.4, 24.22.1 e 26.12.1.
  • Atualize imagens oficiais e digests. Evite tags móveis sem rebuild controlado.
  • Aplique mitigação de proxy para Content-Encoding: br só como ponte, com prazo.
  • Reinicie unidades systemd, pods e funções. Binário novo com processo antigo não conta.
  • Monitore crash, restart loop e anomalias de encoding. Encaminhe achados para análise de logs em resposta a incidentes.
  • Atualize runners de CI e templates de segurança de contêineres e imagens Docker para não regredir no próximo deploy.
  • Remova Node 25 e outras linhas EOL do inventário com plano de migração datado.

Além disso, alinhe janela de change com rollback de imagem e smoke automatizado. Em clusters grandes, use canary por serviço internet-facing antes do rolling completo. Confirme com o provedor PaaS a data em que a versão patchada fica disponível, porque o tarball oficial e o runtime gerenciado nem sempre andam juntos no mesmo dia.

Na prática, o que eu vejo com mais frequência é alguém marcar o ticket como resolvido após docker pull sem recriar o Deployment. Se fosse comigo, o critério de aceite seria o comando de versão dentro do container de produção mais o digest da imagem em execução, anexados ao change.

Perguntas frequentes sobre a falha no Node.js Brotli#

Atualizar só o pacote do sistema operacional basta?#

Só basta se esse pacote for de fato o binário que o serviço executa e se a versão publicada pelo vendor já incluir o patch equivalente ao 22.23.4, 24.22.1 ou 26.12.1. Em muitos ambientes o Node vem de imagem Docker oficial, NodeSource, nvm ou runtime gerenciado, e o pacote da distro nem entra no caminho. Por isso, meça a versão do processo em produção depois do upgrade e do restart. Se a distro usa libbrotli compartilhado, confirme também o advisory do pacote de biblioteca, porque o Node oficial embute cópia própria e o empacotamento da distro pode diferir.

Node 25 recebe correção desta falha?#

Não. O security release de 21 de outubro de 2026 cobre 22.x, 24.x e 26.x, e o projeto afirma que linhas em fim de vida são afetadas sem receber o patch. A linha 25 entrou em EOL em 1º de junho de 2026. Quem ainda está em 25 precisa migrar para uma linha suportada e só então aplicar a versão corrigida. Permanecer em EOL deixa o serviço sem caminho oficial quando o próximo CVE aparecer, o que aumenta custo operacional e risco de conformidade.

Há exploração em massa confirmada em 21 de outubro de 2026?#

O aviso oficial do Node.js descreve o impacto potencial e publica o patch, mas não afirma exploração em massa. Em 21 de outubro de 2026, buscas no catálogo KEV da CISA não mostraram o CVE-2026-111497 como item listado, e o registro em CVE.org ainda estava Reserved. Relatos operacionais isolados podem dizer que não acharam sinais no próprio ambiente, e isso não generaliza para a internet inteira. O posto correto para Dev e Ops é patchar com urgência de HIGH com RCE potencial, sem esperar headline de exploração para agir.

Desligar Brotli no CDN elimina o risco do Node?#

Reduz parte da superfície se o Node deixar de descomprimir entrada ou respostas br não confiáveis, mas não remove o decoder vulnerável do binário. Clientes internos, jobs, webhooks e ferramentas de CI ainda podem exercitar o caminho. Além disso, as falhas de TLS e DNS do mesmo release continuam independentes de Brotli. Use o desligamento como mitigação temporária com prazo, e mantenha o objetivo no runtime patchado com restart comprovado.

Preciso republicar o app ou só reiniciar o processo?#

Se o binário ou a imagem mudou, você precisa fazer o deploy ou rebuild que coloca o artefato novo no host e depois reiniciar ou recriar o processo. Reiniciar sem trocar a imagem deixa a versão vulnerável em execução. Em imutável (Kubernetes ou ECS), o caminho típico é nova imagem com digest pinado e rolling update. Em VM com pacote, é upgrade do pacote mais restart da unit. Em todos os casos, prove com node -v no ambiente alvo após a mudança.

Conclusão#

Para a maioria dos times que rodam Node em produção, a resposta em 21 de outubro de 2026 é direta. Suba para 22.23.4, 24.22.1 ou 26.12.1 na linha suportada, reinicie o que ainda carrega o binário antigo e prove a versão no processo que atende tráfego. A falha no Node.js Brotli merece o topo da fila porque o próprio projeto aponta potencial de execução remota de código, e as falhas de TLS e DNS do mesmo pacote justificam não fatiar o patch em três mudanças soltas.

A resposta muda quando você está em linha EOL, em runtime gerenciado sem a versão patchada disponível ou em distro que empacota Brotli fora do tarball oficial. Nesses casos o primeiro passo é migrar de linha ou alinhar o vendor, com mitigação de perímetro datada enquanto isso. O primeiro passo concreto para qualquer time é inventariar internet-facing e descompressores Brotli ainda nesta janela de change, anexar evidência de versão e só então marcar o CVE como tratado.

Este texto tem caráter informativo e educativo sobre o security release do Node.js e a falha no decoder Brotli. Não substitui a avaliação do seu time de segurança e de infraestrutura nem um parecer formal de risco para o seu ambiente.

Perguntas frequentes

Atualizar só o pacote do sistema operacional basta?
Só basta se esse pacote for de fato o binário que o serviço executa e se a versão publicada pelo vendor já incluir o patch equivalente ao 22.23.4, 24.22.1 ou 26.12.1. Em muitos ambientes o Node vem de imagem Docker oficial, NodeSource, nvm ou runtime gerenciado, e o pacote da distro nem entra no caminho. Por isso, meça a versão do processo em produção depois do upgrade e do restart. Se a distro usa libbrotli compartilhado, confirme também o advisory do pacote de biblioteca, porque o Node oficial embute cópia própria e o empacotamento da distro pode diferir.
Node 25 recebe correção desta falha?
Não. O security release de 21 de outubro de 2026 cobre 22.x, 24.x e 26.x, e o projeto afirma que linhas em fim de vida são afetadas sem receber o patch. A linha 25 entrou em EOL em 1º de junho de 2026. Quem ainda está em 25 precisa migrar para uma linha suportada e só então aplicar a versão corrigida. Permanecer em EOL deixa o serviço sem caminho oficial quando o próximo CVE aparecer, o que aumenta custo operacional e risco de conformidade.
Há exploração em massa confirmada em 21 de outubro de 2026?
O aviso oficial do Node.js descreve o impacto potencial e publica o patch, mas não afirma exploração em massa. Em 21 de outubro de 2026, buscas no catálogo KEV da CISA não mostraram o CVE-2026-111497 como item listado, e o registro em CVE.org ainda estava Reserved. Relatos operacionais isolados podem dizer que não acharam sinais no próprio ambiente, e isso não generaliza para a internet inteira. O posto correto para Dev e Ops é patchar com urgência de HIGH com RCE potencial, sem esperar headline de exploração para agir.
Desligar Brotli no CDN elimina o risco do Node?
Reduz parte da superfície se o Node deixar de descomprimir entrada ou respostas br não confiáveis, mas não remove o decoder vulnerável do binário. Clientes internos, jobs, webhooks e ferramentas de CI ainda podem exercitar o caminho. Além disso, as falhas de TLS e DNS do mesmo release continuam independentes de Brotli. Use o desligamento como mitigação temporária com prazo, e mantenha o objetivo no runtime patchado com restart comprovado.
Preciso republicar o app ou só reiniciar o processo?
Se o binário ou a imagem mudou, você precisa fazer o deploy ou rebuild que coloca o artefato novo no host e depois reiniciar ou recriar o processo. Reiniciar sem trocar a imagem deixa a versão vulnerável em execução. Em imutável (Kubernetes ou ECS), o caminho típico é nova imagem com digest pinado e rolling update. Em VM com pacote, é upgrade do pacote mais restart da unit. Em todos os casos, prove com node -v no ambiente alvo após a mudança.

Compartilhar

Compartilhar

Leituras relacionadas

Nenhum comentário ainda

Seja o primeiro a comentar.

Deixe seu comentário

Entre com sua conta Canverly para comentar. Você pode usar a mesma conta em qualquer site da rede.

Entrar com Canverly