Investigadores de las empresas Netflix y Google han encontrado ocho vulnerabilidades en diversas implementaciones del protocolo HTTP/2 que permiten provocar una denegación de servicio mediante el envío de un flujo de solicitudes de red formuladas de cierta manera. Los problemas afectan, en mayor o menor medida, a la mayoría de los servidores HTTP que soportan HTTP/2, lo que lleva al agotamiento de la memoria disponible para el proceso de trabajo o a una carga excesiva en la CPU. Las actualizaciones que corrigen las vulnerabilidades ya están disponibles en y , pero por ahora para Apache httpd y .
Los problemas surgieron como consecuencia de las complejidades añadidas al protocolo HTTP/2, relacionadas con el uso de estructuras binarias, el sistema de limitación de flujos de datos dentro de las conexiones, el mecanismo de priorización de flujos y la existencia de mensajes de control similares a ICMP que operan a nivel de conexión HTTP/2 (por ejemplo, operaciones de ping, reinicio y configuración de flujos). Muchas implementaciones no limitaban adecuadamente el flujo de mensajes de control, organizaban ineficientemente el trabajo de la cola de prioridades al procesar solicitudes o utilizaban implementaciones subóptimas de algoritmos de control de flujo.
La mayoría de los métodos de ataque identificados se reducen al envío al servidor de solicitudes específicas que generan un gran número de respuestas. Si el cliente no lee los datos del socket y no cierra la conexión, la cola de respuestas en el lado del servidor se llena continuamente. Este comportamiento crea carga en el sistema de gestión de la cola de procesamiento de conexiones de red y, dependiendo de las particularidades de la implementación, puede llevar al agotamiento de la memoria disponible o de los recursos de la CPU.
Vulnerabilidades detectadas:
- CVE-2019-9511 (Data Dribble) - el atacante solicita una gran cantidad de datos en varios flujos, manipulando el tamaño de la ventana deslizante y la prioridad del flujo, obligando al servidor a colocar datos en la cola en bloques de 1 byte;
- CVE-2019-9512 (Ping Flood) - el atacante inunda continuamente mensajes de ping a través de la conexión HTTP/2, iniciando el llenado del lado de la cola interna de respuestas enviadas;
- CVE-2019-9513 (Resource Loop) - el atacante crea varios flujos de solicitudes y cambia continuamente la prioridad de los flujos, causando la mezcla del árbol de prioridades;
- CVE-2019-9514 (Reset Flood) - el atacante crea varios flujos
y envía a través de cada flujo una solicitud incorrecta, provocando que el servidor envíe tramas RST_STREAM, pero no las acepta para llenar la cola de respuestas; - CVE-2019-9515 (Inundación de Configuración) — el atacante envía un flujo de tramas vacías "SETTINGS", a lo que el servidor debe confirmar la recepción de cada solicitud;
- CVE-2019-9516 (Filtración de Encabezados de 0 Longitud) — el atacante envía un flujo de encabezados con un nombre nulo y un valor nulo, y el servidor asigna un búfer en memoria para almacenar cada encabezado y no lo libera hasta que la sesión termina;
- CVE-2019-9517 (Almacenamiento Interno de Datos) — el atacante abre
una ventana deslizante HTTP/2 para enviar datos al servidor sin limitaciones, pero mantiene la ventana TCP cerrada, lo que impide que los datos se escriban efectivamente en el socket. A continuación, el atacante envía solicitudes que requieren una respuesta grande; - CVE-2019-9518 (Inundación de Tramas Vacías) — el atacante envía un flujo de tramas de tipo DATA, HEADERS, CONTINUATION o PUSH_PROMISE, pero con contenido útil vacío y sin la bandera de finalización de flujo. El servidor pasa tiempo procesando cada trama, desproporcionadamente en relación al ancho de banda utilizado por el atacante.
Fuente: opennet.ru
