
Sondas HTTP/2 leves para validação controlada dos vetores DoS CVE-2019-9511 (Data Dribble) e CVE-2019-9513 (Priority Churn) em ambientes autorizados.
Repositório com scripts de validação controlada para comportamentos associados às CVEs CVE-2019-9511 e CVE-2019-9513, ambas relacionadas a vetores de negação de serviço em implementações HTTP/2.
Os scripts foram criados para apoiar validações técnicas em ambientes autorizados, permitindo observar se o servidor negocia HTTP/2 e responde a padrões específicos relacionados a Data Dribble e Priority Churn, sem executar ataque de negação de serviço.
A proposta é comprovar o vetor de forma leve e segura, com baixo volume de requisições e sem objetivo de indisponibilizar o ambiente.
| CVE | Nome | Script | Descrição |
|---|---|---|---|
CVE-2019-9511 | HTTP/2 Data Dribble | data_dribble_probe.py | Valida comportamento de controle de fluxo HTTP/2 liberando pequenos volumes de dados de forma controlada. |
CVE-2019-9513 | HTTP/2 Priority Churn / Resource Loop | priority_churn_probe.py | Valida comportamento de processamento de frames PRIORITY em baixa intensidade. |
A CVE-2019-9511, conhecida como HTTP/2 Data Dribble, afeta algumas implementações de HTTP/2 que não tratam de forma eficiente a manipulação da janela de fluxo e da entrega gradual de dados.
Nesse cenário, um atacante pode solicitar dados ao servidor e manipular o controle de fluxo para fazer com que a resposta seja mantida aberta e entregue em pequenos blocos, como pacotes de 1 byte. Dependendo da implementação, esse comportamento pode gerar consumo excessivo de CPU, memória ou recursos de conexão, resultando em risco de negação de serviço.
Neste repositório, o script relacionado é:
data_dribble_probe.py
O objetivo do script é validar o comportamento de forma leve, sem gerar carga agressiva e sem tentar causar indisponibilidade.
Referências:
A CVE-2019-9513, conhecida como HTTP/2 Priority Churn ou Resource Loop, afeta algumas implementações de HTTP/2 que processam alterações contínuas na árvore de prioridade dos streams de forma custosa.
Nesse cenário, um atacante pode criar múltiplos streams e alterar repetidamente a prioridade entre eles, causando churn na árvore de prioridades. Dependendo da implementação, esse comportamento pode gerar consumo excessivo de CPU e levar à negação de serviço.
Neste repositório, o script relacionado é:
priority_churn_probe.py
O objetivo do script é validar se o servidor aceita e processa frames PRIORITY, usando baixa intensidade e sem executar um ataque de DoS.
Referências:
As CVEs CVE-2019-9511 e CVE-2019-9513 não estão associadas a uma única versão específica de servidor web, como apenas nginx, Apache ou Tomcat.
Elas afetam determinadas implementações HTTP/2 em diferentes produtos, bibliotecas, proxies, balanceadores e servidores. Por isso, a validação deve considerar qual componente está negociando e processando HTTP/2 no ambiente analisado.
Exemplos de componentes que podem estar envolvidos:
nginx
Apache HTTP Server
Envoy
HAProxy
Tomcat
Jetty
Node.js
Go net/http2
nghttp2
CDN
WAF
Load Balancer
Ingress Controller Kubernetes
O primeiro critério técnico é confirmar se o serviço negocia HTTP/2 via ALPN. Caso o serviço não negocie h2, estes scripts não são aplicáveis.
A confirmação de vulnerabilidade por versão deve ser feita com base no advisory oficial do fabricante do componente identificado.
Antes de executar os scripts, valide se o alvo negocia HTTP/2 via ALPN.
Use somente o domínio no comando, sem https://.
openssl s_client -alpn h2 -connect exemplo.com.br:443 </dev/null 2>/dev/null | grep -i "ALPN"
Também é possível usar com placeholder:
openssl s_client -alpn h2 -connect <HOST>:443 </dev/null 2>/dev/null | grep -i "ALPN"
Saída esperada:
ALPN protocol: h2
Se a saída indicar h2, o serviço negocia HTTP/2 e os scripts podem ser aplicáveis.
Se não houver retorno ou o protocolo negociado for outro, como http/1.1, os scripts não são aplicáveis para aquele endpoint.
| Script | CVE relacionada | Objetivo | Quando usar |
|---|---|---|---|
data_dribble_probe.py | CVE-2019-9511 | Validar comportamento associado ao Data Dribble usando controle de janela para liberar pequenos blocos de dados | Usar quando o servidor suporta HTTP/2 e há necessidade de verificar comportamento de entrega de DATA frames com janela reduzida. |
priority_churn_probe.py | CVE-2019-9513 | Validar comportamento associado ao Priority Churn usando frames PRIORITY em baixa intensidade | Usar quando o servidor suporta HTTP/2 e há necessidade de verificar se ele processa alterações de prioridade de streams. |
A ordem mais lógica para utilização dos scripts é:
1. Pré-validação HTTP/2 com openssl
↓
2. priority_churn_probe.py
↓
3. data_dribble_probe.py
Primeiro, use o comando com openssl para confirmar se o alvo negocia HTTP/2. Depois, use o priority_churn_probe.py para validar se o servidor aceita e processa frames de prioridade. Em seguida, use o data_dribble_probe.py para observar o comportamento do servidor diante de uma janela de fluxo reduzida, liberando pequenos volumes de dados de forma controlada.
Ambos os scripts são probes leves. Eles não têm como objetivo causar indisponibilidade, mas sim gerar uma evidência técnica do comportamento observado.
O priority_churn_probe.py é uma PoC leve para validação de comportamento relacionado à CVE-2019-9513, conhecida como HTTP/2 Priority Churn.
O script estabelece uma conexão HTTP/2 via TLS, abre pequenos streams HTTP e envia alterações de prioridade por meio de frames PRIORITY. Em seguida, mede a latência antes e depois do envio desses frames para observar se há variação no processamento.
PING;PRIORITY em baixa intensidade;Use este script quando for necessário validar se um servidor HTTP/2 aceita e processa frames de prioridade relacionados ao vetor Priority Churn, sem executar um teste agressivo de DoS.
Ele é indicado para validação controlada em pentests, análise de exposição HTTP/2 e comprovação técnica de comportamento vulnerável ou potencialmente sensível.
O script recebe os valores por argumento de linha de comando:
--host
--port
--paths
--shuffles
| Parâmetro | Descrição |
|---|---|
--host | FQDN do alvo autorizado. Não incluir https://. |
--port | Porta TLS onde o serviço HTTP/2 está disponível. Padrão: 443. |
--paths | Lista de paths simples para abrir streams HTTP/2. |
--shuffles | Quantidade de ciclos de alteração de prioridade. Manter baixo para teste seguro. |
Use paths leves, públicos e de baixo impacto, como:
/
/robots.txt
/favicon.ico
/health
/login