
Sondas ligeras HTTP/2 para validación controlada de vectores DoS CVE-2019-9511 (Data Dribble) y CVE-2019-9513 (Priority Churn) en entornos autorizados.
Repositorio con scripts de validación controlada para comportamientos asociados a las CVEs CVE-2019-9511 y CVE-2019-9513, ambas relacionadas con vectores de denegación de servicio en implementaciones HTTP/2.
Los scripts fueron creados para apoyar validaciones técnicas en entornos autorizados, permitiendo observar si el servidor negocia HTTP/2 y responde a patrones específicos relacionados con Data Dribble y Priority Churn, sin ejecutar un ataque de denegación de servicio.
La propuesta es comprobar el vector de forma ligera y segura, con bajo volumen de peticiones y sin objetivo de indisponibilizar el entorno.
| CVE | Nombre | Script | Descripción |
|---|---|---|---|
CVE-2019-9511 | HTTP/2 Data Dribble | data_dribble_probe.py | Valida comportamiento de control de flujo HTTP/2 liberando pequeños volúmenes de datos de forma controlada. |
CVE-2019-9513 | HTTP/2 Priority Churn / Resource Loop | priority_churn_probe.py | Valida comportamiento de procesamiento de frames PRIORITY en baja intensidad. |
La CVE-2019-9511, conocida como HTTP/2 Data Dribble, afecta a algunas implementaciones de HTTP/2 que no tratan de forma eficiente la manipulación de la ventana de flujo y la entrega gradual de datos.
En este escenario, un atacante puede solicitar datos al servidor y manipular el control de flujo para hacer que la respuesta se mantenga abierta y se entregue en pequeños bloques, como paquetes de 1 byte. Dependiendo de la implementación, este comportamiento puede generar consumo excesivo de CPU, memoria o recursos de conexión, resultando en riesgo de denegación de servicio.
En este repositorio, el script relacionado es:
data_dribble_probe.py
El objetivo del script es validar el comportamiento de forma ligera, sin generar carga agresiva y sin intentar causar indisponibilidad.
Referencias:
La CVE-2019-9513, conocida como HTTP/2 Priority Churn o Resource Loop, afecta a algunas implementaciones de HTTP/2 que procesan cambios continuos en el árbol de prioridad de los streams de forma costosa.
En este escenario, un atacante puede crear múltiples streams y cambiar repetidamente la prioridad entre ellos, causando churn en el árbol de prioridades. Dependiendo de la implementación, este comportamiento puede generar consumo excesivo de CPU y llevar a la denegación de servicio.
En este repositorio, el script relacionado es:
priority_churn_probe.py
El objetivo del script es validar si el servidor acepta y procesa frames PRIORITY, usando baja intensidad y sin ejecutar un ataque de DoS.
Referencias:
Las CVEs CVE-2019-9511 y CVE-2019-9513 no están asociadas a una única versión específica de servidor web, como solo nginx, Apache o Tomcat.
Afectan a determinadas implementaciones HTTP/2 en diferentes productos, bibliotecas, proxies, balanceadores y servidores. Por eso, la validación debe considerar qué componente está negociando y procesando HTTP/2 en el entorno analizado.
Ejemplos de componentes que pueden estar involucrados:
nginx
Apache HTTP Server
Envoy
HAProxy
Tomcat
Jetty
Node.js
Go net/http2
nghttp2
CDN
WAF
Load Balancer
Ingress Controller Kubernetes
El primer criterio técnico es confirmar si el servicio negocia HTTP/2 via ALPN. Si el servicio no negocia h2, estos scripts no son aplicables.
La confirmación de vulnerabilidad por versión debe hacerse con base en el advisory oficial del fabricante del componente identificado.
Antes de ejecutar los scripts, valide si el objetivo negocia HTTP/2 via ALPN.
Use solo el dominio en el comando, sin https://.
openssl s_client -alpn h2 -connect ejemplo.com.br:443 </dev/null 2>/dev/null | grep -i "ALPN"
También es posible usar con placeholder:
openssl s_client -alpn h2 -connect <HOST>:443 </dev/null 2>/dev/null | grep -i "ALPN"
Salida esperada:
ALPN protocol: h2
Si la salida indica h2, el servicio negocia HTTP/2 y los scripts pueden ser aplicables.
Si no hay retorno o el protocolo negociado es otro, como http/1.1, los scripts no son aplicables para ese endpoint.
| Script | CVE relacionada | Objetivo | Cuándo usar |
|---|---|---|---|
data_dribble_probe.py | CVE-2019-9511 | Validar comportamiento asociado a Data Dribble usando control de ventana para liberar pequeños bloques de datos | Usar cuando el servidor soporta HTTP/2 y hay necesidad de verificar comportamiento de entrega de DATA frames con ventana reducida. |
priority_churn_probe.py | CVE-2019-9513 | Validar comportamiento asociado a Priority Churn usando frames PRIORITY en baja intensidad | Usar cuando el servidor soporta HTTP/2 y hay necesidad de verificar si procesa cambios de prioridad de streams. |
El orden más lógico para la utilización de los scripts es:
1. Pre-validación HTTP/2 con openssl
↓
2. priority_churn_probe.py
↓
3. data_dribble_probe.py
Primero, use el comando con openssl para confirmar si el objetivo negocia HTTP/2. Luego, use priority_churn_probe.py para validar si el servidor acepta y procesa frames de prioridad. A continuación, use data_dribble_probe.py para observar el comportamiento del servidor ante una ventana de flujo reducida, liberando pequeños volúmenes de datos de forma controlada.
Ambos scripts son probes ligeros. No tienen como objetivo causar indisponibilidad, sino generar una evidencia técnica del comportamiento observado.
El priority_churn_probe.py es una PoC ligera para validación de comportamiento relacionado a la CVE-2019-9513, conocida como HTTP/2 Priority Churn.
El script establece una conexión HTTP/2 via TLS, abre pequeños streams HTTP y envía cambios de prioridad mediante frames PRIORITY. Luego, mide la latencia antes y después del envío de esos frames para observar si hay variación en el procesamiento.
PING;PRIORITY en baja intensidad;Use este script cuando sea necesario validar si un servidor HTTP/2 acepta y procesa frames de prioridad relacionados con el vector Priority Churn, sin ejecutar una prueba agresiva de DoS.
Está indicado para validación controlada en pentests, análisis de exposición HTTP/2 y comprobación técnica de comportamiento vulnerable o potencialmente sensible.
El script recibe los valores por argumento de línea de comandos:
--host
--port
--paths
--shuffles
| Parámetro | Descripción |
|---|---|
--host | FQDN del objetivo autorizado. No incluir https://. |
--port | Puerto TLS donde el servicio HTTP/2 está disponible. Por defecto: 443. |
--paths | Lista de paths simples para abrir streams HTTP/2. |
--shuffles | Cantidad de ciclos de cambio de prioridad. Mantener bajo para prueba segura. |