
Prova de conceito de exploit para a vulnerabilidade de double-free no Apache mod_http2 (CVE-2026-23918) com fases de reconhecimento, exploração e avaliação de risco de RCE.
Afetado: Apache HTTP Server 2.4.66 com mod_http2 + Event MPM
Corrigido em: Apache 2.4.67 (mod_h2 v2.0.37)
CVSS 3.1: 8.8 ALTA — Execução Remota de Código não autenticada possível
CWE: CWE-415 (Double Free)
mod_http2 no Apache 2.4.66 tem um bug de double free dentro de h2_mplx.c:m_stream_cleanup(). O problema ocorre quando um cliente envia um quadro HEADERS imediatamente seguido por um RST_STREAM no mesmo stream. Se o timing estiver correto, o stream acaba sendo inserido duas vezes no array de purga m->spurge. Quando o mplx é destruído, o pool APR é liberado duas vezes, o que corrompe o heap e causa um SIGABRT ou SIGSEGV.
O Apache corrigiu isso no mod_h2 v2.0.37 introduzindo add_for_purge(), uma simples verificação de desduplicação que impede que o mesmo stream seja adicionado duas vezes.
// Vulnerable (< v2.0.37)
APR_ARRAY_PUSH(m->spurge, h2_stream *) = stream; // can happen twice
// Fixed (v2.0.37+)
static int add_for_purge(h2_mplx *m, h2_stream *stream) {
for (int i = 0; i < m->spurge->nelts; ++i)
if (APR_ARRAY_IDX(m->spurge, i, h2_stream*) == stream)
return FALSE;
APR_ARRAY_PUSH(m->spurge, h2_stream *) = stream;
return TRUE;
}
Por padrão, o script executa um pipeline de 3 fases no alvo:
| Fase | O que faz |
|---|---|
| 1 — Reconhecimento | Detecta a versão do Apache, suporte a HTTP/2 via ALPN, tipo de MPM |
| 2 — Exploração | Envia rajadas de HEADERS+RST_STREAM em threads, tenta modo inline e depois staged |
| 3 — Avaliação de RCE | Mede a consistência da falha e classifica o nível de risco |
O escore de RCE é calculado a partir de três sinais detectáveis remotamente. Primeiro, se o Apache 2.4.66 está em execução. Segundo, se o MPM Event ou Worker está em uso (o mod_http2 se recusa a iniciar com Prefork, então se HTTP/2 funciona, é um MPM com threads). Terceiro, o quão determinística é a falha — uma falha na primeira rodada significa que a corrupção do heap é controlada e reproduzível, que é o que você precisa para RCE.
pip install hpack requests
# Full PoC on a single target (default behavior)
python poc.py -t 192.168.1.100
# Increase pressure with more rounds, bigger bursts and more threads
python poc.py -t 192.168.1.100 -n 20 -b 500 -w 5
# Passive check only, nothing is sent to the target
python poc.py -t example.com --check-only
# Scan a whole list of targets
python poc.py -l sites.txt -o results.json
# Passive check on a list
python poc.py -l sites.txt --check-only
# Generate a Markdown report after the run
python poc.py -t target.com --report report.md
| Flag | Padrão | Descrição |
|---|---|---|
-t | — | Alvo único (hostname ou IP) |
-l | — | Arquivo com alvos, um por linha |
-p | 443 | Porta |
-n | 10 | Número de rodadas de exploração |
-b | 200 | Pares HEADERS+RST por rodada |
-w | 3 | Conexões paralelas por rodada |
-d | 0.1 | Atraso entre rodadas em segundos |
-m | inline | Modo de ataque: inline ou staged |
--no-tls | — | Usar h2c em vez de TLS |
--check-only | — | Apenas reconhecimento passivo, sem exploração |
-o | — | Salvar resultados em um arquivo JSON |
--report | — | Gerar um relatório Markdown |
-v | — | Saída detalhada |
# one target per line, comments are ignored
192.168.1.100
example.com
example.com:8443
https://example.com
http://example.com:8080
| Nível | O que significa |
|---|---|
| CRITICAL | 2.4.66 confirmado, HTTP/2 ativo, Event MPM detectado, falha determinística — corrija agora |
| HIGH | 2.4.66 confirmado, HTTP/2 ativo, MPM com threads em uso |
| MEDIUM | 2.4.66 detectado mas HTTP/2 ou falha ainda não confirmados |
| LOW | Versão não corresponde ou nenhum HTTP/2 detectado |
| NONE | Já corrigido para 2.4.67+ ou não afetado |
A correção adequada é atualizar o Apache para 2.4.67 ou posterior. Se você não puder atualizar imediatamente, desabilitar HTTP/2 remove completamente a superfície de ataque:
# Before
Protocols h2 http/1.1
# After (disables HTTP/2)
Protocols http/1.1
Esta ferramenta destina-se apenas a testes de segurança autorizados e pesquisa. Certifique-se de ter permissão explícita por escrito antes de executá-la contra qualquer alvo. O autor não assume responsabilidade por uso indevido.