Falha no descodificador Brotli deixa um servidor malicioso tomar Node.js e Python

24.10.2026 5 min 5

Uma falha no descodificador Brotli da Google permite que um fluxo comprimido manipulado escreva para além do fim de um buffer na memória. Registada como CVE-2026-111497 e classificada com 9,2 em 10 no aviso do GitHub, afeta as versões 1.0.3 a 1.2.0 do Brotli. O Brotli comprime boa parte do tráfego web atual, por isso o problema vai muito além de uma biblioteca: o Node.js, o Bun, o Envoy, o Istio e os pacotes Python que o requests e o aiohttp usam por conta própria incluem ou carregam o código vulnerável. As correções saíram entre 21 e 23 de outubro.

O que corre mal

Um fluxo Brotli está dividido em blocos, e o descodificador alterna entre tipos de bloco à medida que lê. Segundo o aviso do Node.js, uma mudança de bloco inválida era tratada como uma necessidade temporária de mais dados, e não como um erro de formato. O descodificador continuava então a acrescentar bytes do atacante a um buffer interno de oito bytes e escrevia para além do seu fim. Consoante o que for sobrescrito, o resultado é uma falha do processo, uma fuga de memória ou a execução remota de código.

A falha foi comunicada ao Node.js por Khai Tran e Sylvie Mayer, da OpenAI Codex Security. A Google publicou as versões corrigidas 1.0.10, 1.1.1 e 1.2.1 do Brotli, e o Node.js lançou as 22.23.4, 24.22.1 e 26.12.1 a 21 de outubro. O Node.js 20 e outras linhas sem suporte não terão correção.

O ataque funciona nos dois sentidos

O descodificador entra em ação onde quer que cheguem dados comprimidos, por isso qualquer um dos lados de uma ligação pode ser o alvo. Um servidor malicioso pode atacar um cliente: o fetch() integrado no Node descomprime automaticamente respostas Brotli, tal como as bibliotecas Python requests, urllib3 e aiohttp sempre que há um pacote Brotli instalado. A aplicação nem precisa de o importar. Webhooks, pré-visualizações de links, crawlers e funções de «importar a partir de URL» vão buscar conteúdo a servidores alheios a toda a hora.

No sentido inverso, um cliente pode atacar um servidor que descomprime o corpo dos pedidos. O Express 5.0.0 a 5.3.0 e o body-parser 2.0.0 a 2.3.0 descomprimem Brotli nos parsers raw() e json(). A Imperva Red Team executou código próprio na imagem oficial do Node.js 24.22.0 pelas duas vias: uma resposta descarregada e o corpo de um pedido ao Express. Foram precisas várias tentativas, e a Imperva não publicou o exploit.

Até onde chega

A falha está no descodificador de referência em C da Google, e muitos projetos distribuem a sua própria cópia. Um levantamento publicado em broccoli2shell.com aponta correções para o Bun 1.4.4, Envoy, Istio, Chromium, Firefox, ngx_brotli e os pacotes Python Brotli 1.2.1 e brotlicffi 1.2.1.0. A 24 de outubro ainda listava cópias por corrigir no .NET, nas extensões brotli para PHP e Ruby, no DuckDB, ClickHouse, Apache Arrow, na biblioteca JPEG XL, em forks do 7-Zip e no MuPDF.

As distribuições Linux corrigem à parte a biblioteca partilhada libbrotli. O Debian, por exemplo, já o fez nas atualizações de segurança para bookworm e trixie. A 22 de outubro surgiu no GitHub uma prova de conceito pública, que segundo os relatos só executa código numa compilação deliberadamente enfraquecida. Até então não tinham sido registados ataques reais.

O que verificar

  • Browsers: o Chrome, o Edge e o Firefox descomprimem Brotli em quase todas as páginas. Instale a última atualização e reinicie o browser.
  • Node.js e Bun: execute node --version. Tudo abaixo de 22.23.4, 24.22.1 ou 26.12.1, ou numa linha sem suporte como a 20, precisa de atualização. O Bun tem de estar na 1.4.4 ou posterior.
  • Python: execute pip show Brotli brotlicffi. Se algum for anterior à 1.2.1, atualize-o ou desinstale-o, e o requests passará a usar gzip.
  • Servidores: aplique a atualização da libbrotli da distribuição e reinicie todos os serviços que a carregam. Um processo em execução mantém o descodificador antigo na memória até ser reiniciado.

Este último ponto passa facilmente despercebido. O gestor de pacotes pode instalar a correção de madrugada, enquanto o PHP, o Python e outros processos de longa duração continuam semanas com a cópia antiga. Para quem gere o seu próprio servidor, é o segundo «atualizar e reiniciar» do mês, depois das falhas do NGINX.

brotlinode.jspythongooglevulnerabilidadebunopenaiimpervalinuxservidoresnavegadorescódigo aberto

Leia também