
Prueba de concepto (PoC) para CVE-2026-49975: ataque de agotamiento de memoria del servidor HTTP/2 que aprovecha la amplificación de HPACK y la retención de conexiones (HTTP/2 Slowloris).
Una prueba de concepto de denegación de servicio (DoS) dirigida a servidores HTTP/2. Al combinar la amplificación HPACK con la retención de flujos, una única máquina con una conexión de red modesta puede dejar un servidor vulnerable no disponible en cuestión de segundos.
CVE-2026-49975mod_http2 de Apache HTTP Server permite un ataque de denegación de servicio mediante solicitudes HTTP especialmente manipuladas.El exploit procede a través de varias etapas, tal y como ilustran sus registros de ejecución:
Establecimiento de conexión TCP/TLS
Se abren múltiples conexiones TCP/TLS concurrentes hacia el servidor objetivo.
Negociación HTTP/2
El cliente detecta el número máximo de flujos concurrentes permitidos por el servidor (normalmente 100 o 128).
Preparación HPACK
Se envían cabeceras HTTP cuidadosamente manipuladas para forzar al servidor a asignar tablas de compresión HPACK excesivamente grandes, incrementando rápidamente el consumo de memoria.
Retención de conexiones
Una vez abiertos los flujos, las conexiones permanecen activas indefinidamente, impidiendo que la memoria asignada sea liberada y agotando eventualmente la RAM disponible del servidor.
Se realizaron pruebas contra varios servidores web usando sus configuraciones por defecto.
h2.exceptions.TooManyStreamsErrorOcurre cuando el valor suministrado a --streams supera el máximo de flujos concurrentes soportado por el servidor.
Solución: Sondea el límite de flujos del servidor antes de iniciar el ataque.
NameError: name 'SettingsAcknowledued' is not definedUn simple error tipográfico en el código fuente de la PoC.
Solución: Reemplaza:
SettingsAcknowledued
por:
SettingsAcknowledged
[SSL] unknown errorNormalmente indica que el objetivo no soporta HTTP/2 sobre TLS o está rechazando conexiones entrantes.
EOF occurred in violation of protocolEl servidor remoto cerró la conexión inesperadamente.
Esto ocurre comúnmente cuando el servidor comienza a agotar sus recursos y empieza a rechazar nuevas conexiones.
Invalid input ConnectionInputs.SEND_HEADERSEl servidor cerró la conexión HTTP/2 antes de que todas las cabeceras de la solicitud pudieran transmitirse.
La prueba de concepto está implementada como un script de Python.
git clone https://github.com/califio/http2-bomb.git
cd http2-bomb
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
Ataque básico usando 10 conexiones y 100 flujos:
python bomb.py example.com --streams 100 --connections 10
(Requiere que el objetivo permita al menos 100 flujos concurrentes por conexión.)
Detección automática del límite de flujos:
python bomb.py example.com --connections 10
Ataque a gran escala:
python bomb.py target.example.com --connections 50
Prueba de conexiones de alto volumen:
python h2bomb.py -t target.example.com:443 -c 1000
Prueba de conexiones a muy gran escala:
python h2bomb.py -t example.com -c 20000
Este software se proporciona exclusivamente para investigación de seguridad, fines educativos y pruebas de sistemas para los cuales usted cuenta con autorización explícita.
El uso no autorizado de esta herramienta contra sistemas que no posea o para los que no tenga permiso de prueba puede violar las leyes y regulaciones aplicables. Los autores y colaboradores no asumen ninguna responsabilidad por el mal uso o los daños derivados del uso de este software.
| Servidor web | Versión probada | RAM | Agotamiento de memoria | Comportamiento observado |
|---|
| Envoy | 1.37.2 | 32 GB | ~10 segundos | Agotó la memoria con éxito muy rápidamente. |
| Apache HTTP Server | 2.4.67 | 32 GB | ~18 segundos | Límite de flujos normalmente 100. Progresión estándar del ataque mediante preparación HPACK y retención indefinida de conexiones. |
| nginx | 1.29.7 | 32 GB | ~45 segundos | Límite de flujos normalmente 128. El ataque tiene éxito pero requiere más tiempo para consumir la memoria disponible. |
| Microsoft IIS | No especificado | 64 GB | ~45 segundos | Puede anunciar límites de flujos inusualmente grandes, como 4294967297. |
| Objetivos no vulnerables | Varias | - | - | Fallos TLS inmediatos o TooManyStreamsError al intentar superar el límite de flujos configurado por el servidor. |