Instituto Nacional de ciberseguridad. Sección Incibe
Instituto Nacional de Ciberseguridad. Sección INCIBE-CERT

Vulnerabilidad en el código del servidor HTTP en peticiones con múltiples encabezados transfer-encoding en hyper para Rust (CVE-2021-21299)

Gravedad CVSS v3.1:
ALTA
Tipo:
No Disponible / Otro tipo
Fecha de publicación:
11/02/2021
Última modificación:
19/02/2021

Descripción

hyper es una biblioteca HTTP de código abierto para Rust (crates.io). En Hyper desde la versión 0.12.0 y antes de las versiones 0.13.10 y 0.14.3, se presenta una vulnerabilidad que puede habilitar un ataque de trafico no autorizado de peticiones. El código del servidor HTTP tenía un fallo que entiende incorrectamente que algunas peticiones con múltiples encabezados transfer-encoding tienen una carga útil fragmentada, cuando debería haber sido rechazada como ilegal. Esto, combinado con un proxy HTTP aguas arriba que entiende el límite de carga útil de la petición de manera diferente, puede resultar en "request smuggling" o "desync attacks". Para determinar si es vulnerable, todas estas cosas deben ser ciertas: 1) Usar Hyper como servidor HTTP (el cliente no se ve afectado), 2) Usar HTTP/1.1 (HTTP/2 no usa transfer-encoding), 3) Usar un Proxy HTTP vulnerable aguas arriba de hiper. Si un proxy aguas arriba rechaza correctamente los encabezados transfer-encoding ilegales, el ataque de desincronización no puede tener éxito. Si no existe un proxy aguas arriba de Hyper, Hyper no puede iniciar el ataque de desincronización, ya que el cliente reparará los encabezados antes de reenviar. Esto se corrige en las versiones 0.14.3 y 0.13.10. Como solución alternativa, se pueden tomar las siguientes opciones: 1) Rechazar las peticiones que contengan un encabezado "transfer-encoding", 2) Asegurarse de que cualquier proxy ascendente maneje correctamente "transfer-encoding"

Productos y versiones vulnerables

CPE Desde Hasta
cpe:2.3:a:hyper:hyper:*:*:*:*:*:rust:*:* 0.12.0 (incluyendo) 0.13.10 (excluyendo)
cpe:2.3:a:hyper:hyper:*:*:*:*:*:rust:*:* 0.14.0 (incluyendo) 0.14.3 (excluyendo)