TL;DR
⚠️ O Brotli é uma biblioteca de compressão amplamente utilizada, desenvolvida pela Google. Na quarta-feira, 21 de outubro, a NodeJS divulgou a vulnerabilidade CVE-2026-111497, apelidada de «node2shell», na qual um processo Node.js que descomprime dados Brotli controlados por um atacante pode ser levado a vazar memória ou a executar código arbitrário. Na quinta-feira, a equipa do Python revelou que os pacotes Python também estavam vulneráveis ao CVE-2026-111497.
Na sexta-feira, 23 de outubro, soube-se que este CVE afeta outras linguagens de programação importantes e aplicações de serviço que utilizam HTTP, para as quais ainda não estão totalmente disponíveis correções.
Verifique se está a descodificar Brotli como dependência nas suas bibliotecas. Mantenha-se atento a comunicados mais abrangentes e esteja preparado para atualizar o mais rapidamente possível. Se não houver qualquer correção disponível para uma biblioteca ou aplicação que possa estar afetada, recomendamos desativar a descodificação do Brotli até que as correções estejam disponíveis.
Atualização às 16h12 PT:Estão disponíveis correções para a libbrotli, Python, C++, NodeJS, bun, Envoy e mais a caminho. O Apache e o Nginx não descodificam o Brotli por predefinição.
Atualização às 16h15 (PT): A OpenAIinforma que descobriu esta vulnerabilidade em fevereiro. Embora a causa principal do problema tenha sido corrigida no código-fonte do Brotli na altura, não se sabia que isso dava origem a uma vulnerabilidade de segurança. Consulte os avisos da OpenAI aqui.

O que é o Brotli?
O Brotli é um algoritmo de compressão sem perdas e um formato de dados desenvolvido pela Google. É uma forma de reduzir o tamanho dos dados para armazenamento ou envio pela Internet. Posteriormente, o software descompacta-os para recuperar os dados originais. É amplamente utilizado para compressão HTTP, com o objetivo de comprimir conteúdos web, tais como HTML, CSS e JavaScript.
O que é o CVE-2026-111497?
A CVE-2026-111497 é uma falha de escrita fora dos limites no descodificador Brotli do Google, que afeta as versões 1.0.3 a 1.2.0 em todas as plataformas. Trata-se da mesma falha no descodificador Brotli que está na origem do Node2Shell, anunciada há alguns dias. Um atacante remoto e não autenticado pode enviar um fluxo comprimido em Brotli especialmente criado para corromper a memória, divulgar dados confidenciais, provocar a falha do processo ou, potencialmente, executar código arbitrário. A falha tem uma pontuação CVSS v4.0 de 9,2 (Crítica), e o Node.js é afetado através da sua biblioteca Brotli integrada.
Um erro faz com que o descodificador Brotli continue a aceitar mais bytes quando deveria rejeitar os dados. Esses bytes podem causar um estouro num pequeno buffer de trabalho e danificar a memória do programa. Um atacante pode aproveitar esse dano para controlar o que é executado, como, por exemplo, o seu próprio código.
A OpenAI descobriu esta vulnerabilidade em fevereiro e relatou-a como uma execução remota de código não autenticada que funciona em ambos os sentidos, pelo que um cliente malicioso pode assumir o controlo de um servidor sem patch e um servidor malicioso pode assumir o controlo de um cliente sem patch que aceite respostas comprimidas.
A causa principal foi corrigida no código-fonte do Brotli em fevereiro, mas, na altura, não foi identificada como um problema de segurança e, até agora, nenhuma versão foi lançada com essa correção. Isso significa que todos os projetos que incluem o Brotli têm de lançar a sua própria atualização.
Encontra-sevulnerável se algum ambiente tiver instalado o Brotli 1.2.0 ou versões anteriores, ou o brotlicffi 1.2.0.x, uma vez que clientes HTTP como o requests, o httpx e o aiohttp carregam automaticamente estes pacotes quando estão presentes. Atualize para o Brotli 1.2.1 ou o brotlicffi 1.2.1.0 e recompile quaisquer imagens do container que os incluam. A partir de 23 de outubro, as bases de dados de alertas não associam o CVE a nenhum dos pacotes do PyPI, pelo que o pip-audit, o Dependabot e o Safety ainda não irão sinalizar as versões vulneráveis.
Pode ver o que acompanhámos aqui, em « Aikido Intel».
Quanto ao software não afetado, o padrão do Apache mod_brotli não descodifica Brotli
Como corrigir a vulnerabilidade HTTP2Shell CVE-2026-111497
No caso do CVE-2026-111497, atualize o ambiente de execução afetado ou a biblioteca Brotli:
- Node.js: atualize para a versão 22.23.4, 24.22.1 ou 26.12.1, ou para uma versão mais recente suportada na linha de versões correspondente.
- Brotli nativo / libbrotli: atualize para a versão 1.2.1 ou posterior. Para versões mais antigas, utilize a versão 1.0.10 ou 1.1.1 com correções.
- Pacotes Python: atualize o Brotli para a versão 1.2.1 ou posterior e o brotlicffi para a versão 1.2.1.0 ou posterior, independentemente do local onde estejam instalados.
- curl / libcurl: atualize a sua dependência do Brotli para a versão 1.2.1, uma versão anterior corrigida ou o pacote com correções de segurança fornecido pelo fabricante. As cópias incluídas no pacote ou ligadas estaticamente requerem uma nova compilação da aplicação.
- Bun: atualize para a versão 1.4.4 ou posterior. Recompile os executáveis que incluem o Bun.
- Envoy: atualize para a versão 1.40.0, 1.39.3, 1.38.6 ou 1.37.8, ou para uma versão mais recente de um ramo suportado. A versão 1.36.12 também inclui a correção, mas o ramo 1.36 já não é suportado.
- Istio: a correção está incluída nas versões 1.29.9, 1.30.6 e 1.31.2. Utilize uma versão mais recente e suportada na linha correspondente; o ramo 1.29 chegou ao fim do ciclo de vida.
- Pacotes do sistema operativo: instale a atualização de segurança do fornecedor. Os fornecedores podem aplicar a correção retroativamente sem alterar o número da versão do fornecedor original.
- Outros servidores HTTP, proxies inversos, gateways de API e clientes HTTP: atualize o ambiente de execução afetado ou a biblioteca Brotli que utilizam. Nos casos em que o Brotli esteja integrado no produto, instale a versão do fornecedor do produto que resolva explicitamente esta vulnerabilidade (CVE). No caso de serviços geridos, confirme a correção junto do fornecedor.
Atualize os bloqueios de dependências, recompile as aplicações afetadas e as imagens do container , volte a implementar e reinicie os serviços. Verifique se as cargas de trabalho em execução utilizam os componentes corrigidos.
O que fazer se ainda não for possível atualizar
Estas soluções alternativas reduzem a exposição enquanto prepara a atualização:
- Aplicações em Python: Nos casos em que o suporte ao Brotli é opcional, desinstale tanto o Brotli como o brotlicffi dos ambientes afetados. Remova dependências adicionais, tais como o httpx[brotli] e quaisquer outros pré-requisitos que possam reinstalá-los; em seguida, gere novamente os bloqueios de dependências e recompile/reinicie as cargas de trabalho. O HTTPX, o Requests e o urllib3 mantêm o suporte a gzip e deflate sem estes pacotes opcionais. No entanto, um servidor que envie Brotli na mesma pode produzir uma resposta ilegível ou um erro de aplicação; o recurso automático a alternativas não é garantido.
- A desinstalação de ambos os pacotes Python e o reinício das cargas de trabalho removem os percursos de descodificação fornecidos por esses pacotes para os dados de entrada e saída. Não remove os descodificadores Brotli independentes incluídos noutros ambientes de execução, bibliotecas ou produtos.
- Pedidos HTTP recebidos: rejeitar os pedidos cujo campo «Content-Encoding» inclua «br» no proxy inverso, no equilibrador de carga ou no middleware da aplicação, antes de qualquer descodificador vulnerável processar o corpo do pedido. A correspondência com «br» deve ser feita sem distinção entre maiúsculas e minúsculas, incluindo nas listas de codificações.
- Pedidos HTTP de saída: remova «br» do campo «Accept-Encoding». Desative também a descodificação de respostas Brotli ou rejeite as respostas cujo campo «Content-Encoding» inclua «br» antes de iniciar a descodificação. Certifique-se de que esta verificação ocorre antes do processamento automático do corpo da resposta; verificar depois de o cliente ter descarregado e descodificado a resposta é demasiado tarde.
Alterar apenas o cabeçalho «Accept-Encoding» não é suficiente: um servidor malicioso pode enviar uma resposta Brotli independentemente do que o cliente indicar, e o urllib3 seleciona o seu descodificador com base no cabeçalho «Content-Encoding» da resposta.
Mantenha estas medidas de controlo em vigor até que os componentes afetados sejam corrigidos e verificados. Reveja o âmbito de aplicação à medida que os fornecedores confirmarem componentes afetados adicionais ou vias de ataque.
Como o « Aikido » ajuda a resolver a vulnerabilidade CVE-2026-111497
Aikido Identifica versões vulneráveis do Brotli e do brotlicffi nos seus repositórios, imagens docontainer e dependências, incluindo quando estas surgem como dependências transitivas. O seu painel de controlo mostra quais os serviços que ainda executam uma versão vulnerável, para que possa atualizar primeiro aqueles que acedem a servidores externos ou aceitam corpos de pedidos comprimidos.
Depois de efetuar a atualização, o comando « Aikido » verifica se o problema já desapareceu.
A linha do tempo
O Brotli é uma biblioteca de compressão da Google amplamente utilizada. Na quarta-feira, 22 de outubro, o NodeJS divulgou a vulnerabilidade CVE-2026-111497, apelidada de «node2shell», na qual um processo do Node.js que descomprime dados Brotli controlados por um atacante pode ser levado a sofrer uma fuga de memória ou a executar código arbitrário. Os utilizadores ficavam expostos se a sua aplicação ou uma biblioteca descomprimisse dados Brotli maliciosos (por exemplo, o método `fetch()` integrado ou o `body-parser`).
No dia seguinte, o Python lançou uma atualização de segurança que corrige essa mesma falha; os pacotes do Python também estavam vulneráveis à CVE-2026-111497. A falha do Brotli poderá afetar ainda mais linguagens de programação e aplicações de serviço, dada a ampla integração da biblioteca em sistemas a jusante. Afinal, a OpenAI já tinha detetado esta falha em fevereiro.
Detalhes técnicos do CVE-2026-111497
A falha reside em DecodeBlockTypeAndLength(), que lida com as mudanças de bloco, os pontos em que um fluxo Brotli altera a árvore de Huffman que utiliza. Nas versões vulneráveis, a função devolve um valor booleano simples, e BROTLI_FALSE pode significar tanto «este fluxo está malformado» como «preciso de mais dados de entrada». Os chamadores não conseguem distinguir entre as duas situações e, no caminho rápido, o descodificador descarta completamente o valor devolvido.
Um fluxo criado manualmente pode declarar um único tipo de bloco e, em seguida, esgotar o comprimento desse bloco, o que força uma mudança que não pode ser bem-sucedida. O descodificador, então, ou indica que necessita de mais dados de entrada para um fluxo que já está completo, ou continua a descodificar com o estado do bloco que já possuía. Esse segundo cenário conduz à escrita fora dos limites.
A correção a montante, commit 0ed4268 do repositório google/brotli, faz com que a função devolva um código de erro e adiciona um novo erro, BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH (-17). A descodificação pára agora em caso de erro de formato, tanto no percurso seguro como no rápido. A OSM comparou as distribuições de código-fonte do Brotli 1.2.0 e 1.2.1 e constatou que a versão 1.2.1 difere apenas no aumento da versão e nas alterações ao descodificador introduzidas nesse commit.
Vulnerabilidades do Brotli em bibliotecas Python (CVE-2026-111497)
A falha do Brotli subjacente ao Node2Shell (CVE-2026-111497) afeta o Python. Dois pacotes do PyPI, o Brotli e o brotlicffi, compilam o mesmo descodificador Brotli vulnerável que o Node.js inclui. Foi publicado um aviso oficial no GitHub. O Brotli regista 82,8 milhões de downloads por mês.
Estás afetado se algum ambiente Python que executes tiver o Brotli 1.2.0 ou anterior, ou o brotlicffi 1.2.0.x, instalado. Clientes HTTP populares, como o requests e o httpx, carregam estes pacotes automaticamente quando estão presentes. Alguns pacotes instalam automaticamente o Brotli como dependência, como o Scrapy, enquanto outros exigem que seja explicitamente indicado. Um atacante pode aceder ao descodificador vulnerável enviando uma resposta Brotli maliciosa a um pedido feito pela sua aplicação, ou enviando à sua aplicação um corpo de pedido comprimido com o Brotli. Isso significa que uma aplicação pode ficar exposta sem que o Brotli seja importado em qualquer parte do seu próprio código. Trata-se de uma dependência transitiva comum, por isso verifique os seus sistemas.
Para resolver o problema, atualize para as versões corrigidas:
- Brotli -> 1.2.1
- brotlicffi -> 1.2.1.0
As notas de lançamento de ambas as versões corrigidas não mencionam o CVE. A 23 de outubro, as bases de dados de alertas ainda não o associam a nenhum dos pacotes do PyPI, pelo que o pip-audit, o Dependabot e o Safety não irão sinalizar estas versões.
Quem é afetado pela vulnerabilidade CVE-2026-111497 no Python?
Estás afetado se algum dos teus ambientes Python tiver um destes pacotes instalado:
O seu código não precisa de importar nenhum dos dois pacotes. Estes clientes HTTP indicam «Accept-Encoding: br» e descodificam automaticamente as respostas Brotli:
- urllib3 (e, por conseguinte, o requests) quando o Brotli ou o brotlicffi estiverem instalados
- httpx com o extra brotli
- aiohttp quando o Brotli estiver instalado
- O Scrapy e tudo o que for desenvolvido com base nos clientes acima referidos
Os dados do atacante podem chegar ao descodificador por duas vias:
- Pedidos de saída. A sua aplicação obtém uma resposta Brotli de um servidor controlado por um atacante, por exemplo, através de um webhook, de uma pré-visualização de URL, de um rastreador ou da funcionalidade «obter esta URL».
- Pedidos recebidos. O seu framework ou middleware descodifica o corpo de um pedido enviado com Content-Encoding: br, que é o equivalente em Python ao caso «Express 5» no Node.js.
Como corrigir a vulnerabilidade CVE-2026-111497 em Python
A correção consiste numa atualização do pacote e envolve quatro passos:
- Atualize o pacote que tiver instalado com o comando `pip install -U "Brotli>=1.2.1"` ou `pip install -U "brotlicffi>=1.2.1.0"`. Se utilizar um ficheiro de bloqueio com o Poetry, o uv ou o pip-tools, atualize a restrição e gere novamente o ficheiro de bloqueio.
- Recrie as suas imagens do container e quaisquer «wheels» que incluam qualquer um desses pacotes. Uma imagem criada a partir de uma versão vulnerável permanece vulnerável até que a recrie.
- Verifique todos os ambientes em que o seu código é executado, incluindo portáteis, executores de CI, servidores e contentores. Muitos projetos incorporam o Brotli através de um cliente HTTP extra, por isso analise a sua árvore completa de dependências resolvidas.
- Por enquanto, recorra a uma verificação manual. O pip-audit, o Dependabot e o Safety só irão assinalar este problema quando as bases de dados de alertas associarem o CVE aos pacotes do PyPI.
Se as suas ligações Brotli para Python vieram de um pacote de uma distribuição Linux, em vez de do PyPI, a correção é disponibilizada pela sua distribuição; por isso, consulte também o aviso de segurança desta.
O que é a vulnerabilidade Brotli do Python (CVE-2026-111497)?
A vulnerabilidade do Brotli no Python refere-se ao CVE-2026-111497, a falha no descodificador do Brotli conhecida como Node2Shell, uma vez que afeta pacotes Python no PyPI. O registo CVE associa o CWE-252 (valor de retorno não verificado) ao CWE-787 (gravação fora dos limites).
Qual é o grau de gravidade da vulnerabilidade CVE-2026-111497 no Python e está a ser explorada?
O registo CVE atribui à falha uma pontuação CVSS 4.0 de 9,2, e o Node.js classifica-a como de gravidade elevada. A OSM compilou as versões 1.2.0 e 1.2.1 do Brotli com o AddressSanitizer e executou um fluxo manipulado em ambas. A versão 1.2.0 consumiu todo o fluxo de aproximadamente 23 MB e continuou a indicar que necessitava de mais dados de entrada, quer o fluxo chegasse de uma só vez, quer em pedaços tão pequenos quanto um byte. A versão 1.2.1 rejeitou o fluxo com o erro -17 em todas as ocasiões.
A OSM não investigou a corrupção de memória nem a execução de código na extensão Python. O código do descodificador é o mesmo que os investigadores exploraram numa versão não modificada do Node.js 24.22.0, tal como Imperva e outros relataram. No que diz respeito ao Node.js, o The Hacker News não registou qualquer exploração em ambiente real até 22 de outubro.
De qualquer forma, trate isto como urgente. O bug consiste numa falha de segurança de memória num componente que processa entradas de rede não confiáveis, e a correção consiste numa atualização de versão de rotina. Os serviços que contactam servidores externos ou aceitam corpos de pedidos comprimidos devem ser os primeiros a ser corrigidos.
Como verificar se a sua aplicação Python está exposta
- Check installed versions with pip show Brotli brotlicffi in each environment, and with docker run --rm <image> pip show Brotli brotlicffi for each container image.
- Descubra o que faz com que os pacotes sejam instalados. Execute o comando `pipdeptree -r -p Brotli` para ver quais as dependências que o requerem e pesquise nos seus ficheiros de bloqueio com o comando `grep -i brotli poetry.lock uv.lock requirements*.txt`.
- Enumere as chamadas HTTP de saída que são direcionadas para servidores que não controla e quaisquer pontos finais que descodifiquem corpos de pedido com o cabeçalho «Content-Encoding: br».
- Atualize primeiro os serviços correspondentes ao passo 3 e, em seguida, os restantes.
Se estiver a reproduzir o erro a partir do Python, o método `brotli.decompress()` lança um erro genérico `brotli.error: decoder failed` para qualquer tipo de erro, pelo que não é possível identificar qual o código de erro que foi acionado. Um objeto `Decompressor()` alimentado incrementalmente com o fluxo manipulado nunca terminará a decompressão na versão 1.2.0.
FAQ
Quais são as versões que corrigem a vulnerabilidade CVE-2026-111497 no Python?
Brotli 1.2.1 e brotlicffi 1.2.1.0, bem como quaisquer versões mais recentes.
Preciso de importar o Brotli no meu código para que isto me afete?
Basta ter um pacote instalado. O urllib3, o requests, o httpx e o aiohttp utilizam o Brotli ou o brotlicffi automaticamente quando qualquer um deles estiver presente e descodificam respostas Brotli de qualquer servidor que a sua aplicação contacte.
O «pip-audit» ou o « Dependabot » irão assinalar isto?
Ainda não. A data de 23 de outubro, nem o registo CVE, nem o OSV, nem a Base de Dados de Alertas do GitHub incluem qualquer um desses pacotes do PyPI. A OSM está a enviar entradas para a PYSEC e um mapeamento dos pacotes do PyPI para o alerta do GitHub, para que as ferramentas possam detetar esta informação.
Existe alguma solução alternativa?
A desinstalação do Brotli e do brotlicffi remove o descodificador vulnerável, e os clientes HTTP passam a utilizar o gzip e o deflate. A rejeição de pedidos codificados com Brotli na periferia reduz a exposição de entrada, mas não protege contra respostas em Brotli que a sua aplicação possa receber.