Falar com a gente
Menu
#segurança #engenharia

Falha no Brotli CVE-2026-111497 atinge o Python

A falha no Brotli CVE-2026-111497 afeta requests, httpx e aiohttp quando o pacote Brotli está instalado. Veja como saber se você usa e como corrigir.

Publicado em · por Wilson Molin Junior · 5 min de leitura

Em resumo

Em 22 de outubro de 2026, o Google divulgou a CVE-2026-111497, uma falha no Brotli, o formato de compressão usado na web, com nota 9.2 de 10. Um fluxo de dados comprimido montado de propósito corrompe a memória do programa que o descomprime e pode levar à execução de código. No Python, ficam expostos os ambientes com os pacotes Brotli ou brotlicffi instalados: com eles, requests, httpx e aiohttp passam a descomprimir respostas em Brotli. A correção é atualizar para Brotli 1.2.1 ou brotlicffi 1.2.1.0.

O que aconteceu

O Brotli é um formato de compressão criado pelo Google e usado por navegadores e servidores para encolher páginas, com o cabeçalho Content-Encoding: br. Em 21 de outubro, o Google lançou as versões 1.0.10, 1.1.1 e 1.2.1 da biblioteca, e o Node.js saiu com correções no mesmo dia. No dia 22, a falha ganhou número de CVE e nota 9.2 no CVSS, a escala usada para medir a gravidade de vulnerabilidades. O crédito é de pesquisadores do Codex Security, da OpenAI.

O defeito está no decodificador. Diante de um certo trecho inválido, ele entendia que faltavam dados, em vez de acusar erro, e continuava gravando bytes num espaço pequeno de memória. Segundo o registro da CVE, um atacante remoto, sem login, consegue corromper memória, expor dados do processo, derrubar o serviço e, em potencial, executar código. A correção estava no código-fonte desde fevereiro, sem menção a segurança, mas não tinha entrado em nenhuma versão até agora.

A Imperva batizou a falha de Node2Shell, um apelido no estilo do PHP2Shell, e mostrou execução de código no Node.js em laboratório, sem publicar o código. Até 23 de outubro, não havia relato de ataques, e ninguém tinha mostrado execução de código em Python.

Onde o Python entra

O Python em si não traz Brotli. O risco está nos pacotes do PyPI que embutem a biblioteca em C: o Brotli, mantido pelo próprio Google, e o brotlicffi. As versões corrigidas, Brotli 1.2.1 e brotlicffi 1.2.1.0, saíram em 22 de outubro.

O que importa é se o pacote está instalado no ambiente, não quem pediu por ele:

  • requests e httpx passam a anunciar br no cabeçalho Accept-Encoding e descomprimem a resposta do servidor. Um servidor malicioso, ou uma URL informada pelo usuário, entrega o fluxo montado.
  • aiohttp faz o mesmo como cliente. Como servidor, ele descomprime o corpo das requisições por padrão, e aí basta alguém mandar um POST com Content-Encoding: br.
  • Scrapy, a partir da 2.18, traz Brotli como dependência obrigatória e sempre descomprime.

Muitos pacotes instalam Brotli sem você perceber: o flask-compress e o gradio, por exemplo, como dependência obrigatória, e o httpx[brotli], o urllib3[brotli], o aiohttp[speedups] e o whitenoise[brotli] como extra. Um pacote que só comprime respostas, como o flask-compress, já faz o requests do mesmo ambiente descomprimir Brotli.

Django, Flask, FastAPI e uvicorn não descomprimem o corpo das requisições por conta própria. Nesses, a exposição vem do lado cliente da aplicação, ou de um middleware que descomprime.

Como verificar

Em cada ambiente virtual e dentro de cada container:

python -m pip show brotli brotlicffi

Se nada aparecer, o ambiente não tem a biblioteca. Se aparecer, o campo Required-by mostra quem puxou o pacote. Com o uv, use uv tree --invert --package brotli.

No começo do dia 23 de outubro, ferramentas como pip-audit e Dependabot ainda não marcavam os pacotes do Python; os avisos com eles entraram ao longo do dia. Não espere o alerta: confira à mão.

No Debian, o python3-brotli vem do pacote brotli, já corrigido em 23 de outubro: 1.0.9-2+deb12u1 no Debian 12 e 1.1.0-2+deb13u1 no Debian 13. O número da versão de origem não muda; o que mostra a correção é o final +deb. No Ubuntu, a falha ainda estava em avaliação.

O que fazer

  • Atualize o pacote. Rode python -m pip install --upgrade "brotli>=1.2.1" ou python -m pip install --upgrade "brotlicffi>=1.2.1.0", conforme o que estiver instalado. Atualize o arquivo de dependências, reconstrua as imagens de container e reinicie o serviço.
  • Se você não precisa de Brotli, remova com python -m pip uninstall brotli brotlicffi e tire o extra que o instala. Sem o pacote, requests, httpx e aiohttp deixam de descomprimir Brotli.
  • No servidor, recuse requisições com corpo em Brotli antes que cheguem à aplicação. No Nginx, por exemplo, dentro do bloco server:
if ($http_content_encoding ~* "br") {
    return 415;
}
  • No cliente, tirar br do Accept-Encoding não basta. Um servidor malicioso pode mandar Brotli mesmo assim, e a biblioteca descomprime pelo que o servidor declarou. Enquanto não atualiza, a saída segura é remover o pacote.
  • Se você também roda Node.js, atualize para 22.23.4, 24.22.1 ou 26.12.1. Quem fica exposto e o passo a passo estão no nosso post sobre as correções de segurança do Node.js.

Próximos passos

É a terceira correção urgente no Python nesta semana, depois das três falhas no Pillow e das versões de emergência do Python, que pedem a atualização do pip. Se vai mexer nos ambientes para atualizar o Brotli, aproveite e confira os três de uma vez.

Falhas em bibliotecas embutidas, como esta, passam despercebidas porque ninguém lembra que elas estão lá. Se quiser ajuda para mapear as dependências dos seus sistemas em Python e mantê-las em dia, fale com a gente sobre desenvolvimento web sob medida. Para os servidores, veja a nossa gestão de servidores.

Fontes