Se han revelado detalles sobre el método de ataque "Continuation flood", que afecta a varias implementaciones del protocolo HTTP/2, incluyendo Apache httpd, Apache Traffic Server, Node.js, oghttp, Go net/http2, Envoy, oghttp y nghttp2. La vulnerabilidad puede ser utilizada para llevar a cabo ataques contra servidores que soportan HTTP/2.0 y, dependiendo de la implementación, puede resultar en el agotamiento de la memoria (interrupción del procesamiento de solicitudes o finalización anormal de procesos) o en una alta carga en la CPU (reducción de la rapidez en el procesamiento de solicitudes). Según el investigador que descubrió la vulnerabilidad, el problema identificado es más peligroso que la vulnerabilidad "Rapid Reset" encontrada el año pasado, que fue utilizada para realizar los mayores ataques DDoS en ese momento.
El alto nivel de peligrosidad se explica por el hecho de que para interrumpir el funcionamiento servidores, causar una finalización anormal o una disminución grave del rendimiento, es suficiente con generar un flujo de solicitudes específicamente diseñadas desde una computadora común. En ciertos casos, incluso una sola conexión TCP puede ser suficiente para llevar a cabo el ataque. Además, el tráfico relacionado con el ataque no se distingue en los registros del tráfico regular de los usuarios.
La vulnerabilidad se debe a características en el procesamiento de los marcos HEADERS y CONTINUATION en las solicitudes del protocolo HTTP/2. Los marcos HEADERS se utilizan en HTTP/2 para transmitir encabezados HTTP, y los marcos CONTINUATION permiten dividir el envío de encabezados HTTP en varias etapas (por ejemplo, cuando los encabezados no caben en un único marco o cuando en un principio se deben enviar encabezados que se pueden completar en el estado actual, y luego enviar los encabezados cuyos valores aún son indeterminados). Cuando se transmiten encabezados en múltiples etapas, inicialmente se envía un marco HEADERS sin la bandera END_HEADERS, seguido de varios marcos CONTINUATION con encabezados adicionales, y la lista se cierra con un marco CONTINUATION con la bandera END_HEADERS.
El método de ataque consiste en enviar un flujo ininterrumpido de marcos CONTINUATION sin establecer la bandera END_HEADERS. Esta actividad resulta en la transmisión de servidor un gran número de encabezados que el servidor mantiene en la memoria RAM hasta que se agote la memoria disponible para el proceso. Para generar una alta carga en la CPU, además de agotar la memoria, un atacante puede aprovechar la compresión del contenido de los frames de CONTINUATION utilizando el formato HPACK, cuyo análisis requiere cálculos. En las implementaciones del protocolo HTTP/1.1 se aplicó un límite en el tamaño de los encabezados y un tiempo de espera para el envío de la conexión como protección contra inundaciones de encabezados. Para HTTP/2, debido a la complejidad del protocolo, muchas implementaciones no previeron tales métodos de protección contra el envío infinito de encabezados.
La vulnerabilidad representa el mayor riesgo para los usuarios de Node.js (CVE-2024-27983), ya que esta implementación permite provocar un fallo enviando solo unos pocos frames al servidor. Debido a una condición de carrera en Node.js, para provocar un cierre inesperado mediante la activación de una verificación Assert, es suficiente con cerrar las conexiones durante el envío de un flujo de encabezados incompleto (se produce un fallo si durante el cierre de las conexiones aún no se ha recibido un frame de CONTINUATION con el flag END_HEADERS). La vulnerabilidad ha sido corregida en Node.js 18.20.1, 21.7.2 y 20.12.1, así como en las versiones más recientes de las bibliotecas llhttp y undici. En las nuevas versiones de Node.js también se ha solucionado una vulnerabilidad menos crítica (CVE-2024-27982) de tipo "request smuggling", que permite infiltrarse en el contenido de las solicitudes de otros usuarios manipulando el valor de "Content Length", que se procesan en el mismo hilo entre el frontend y el backend.
Vulnerabilidades relacionadas con el manejo de CONTINUATION en otras implementaciones de HTTP/2.0:
- oghttp (CVE-2024-27919) — consumo de memoria ilimitado.
- Tempesta FW (CVE-2024-2758) — elusión de restricciones.
- Bibliotecas PHP amphp/http, amphp/http-client y amphp/http-server (CVE-2024-2653) — consumo de memoria ilimitado, hasta agotar toda la memoria disponible.
- Paquete Go net/http (CVE-2023-45288) — creación de alta carga en la CPU.
- Biblioteca nghttp2 (CVE-2024-28182) — provocar denegación de servicio.
- Apache Httpd (CVE-2024-27316) — consumo excesivo de memoria y carga en la CPU.
- Apache Traffic Server (CVE-2024-31309) — consumo excesivo de recursos.
- Envoy (CVE-2024-30255) — creación de alta carga en la CPU (para una carga completa de un núcleo de CPU se requiere un flujo de 300Mbit/s).
Fuente: opennet.ru
