HTTP Request Smuggling: Conoce este ataque y por qué es peligroso

Los usuarios cuando navegamos por Internet y realizamos diversas tareas estamos expuestos a recibir ataques. Los ciberdelincuentes buscan las vulnerabilidades y fallos de nuestros sistemas operativos para obtener sus beneficios. Por eso, contar con un sistema operativo actualizado y un buen antivirus siempre es un buen punto de partida sobre los que fundamentar nuestra defensa. No obstante, los internautas no somos el único objetivo de los cibercriminales. También realizan ataques a un servidor web, a un firewall, a un servidor proxy y más. Hoy vamos a hablar de un tipo de ataque que afecta a estos últimos. En este tutorial vamos a hablar de qué es HTTP Request Smuggling y también explicaremos por qué es tan peligroso.

Qué hace este ataque y peligros

Un ataque HTTP Request Smuggling podemos definirlo como aquel que, aprovechando las discrepancias en el análisis, cuando uno o más dispositivos/entidades HTTP se encuentran en el flujo de datos entre el usuario y el servidor web. Nos encontramos con una técnica que interfiere con la forma en que un sitio web procesa las secuencias de solicitudes HTTP que se reciben de uno o más usuarios.

Estas vulnerabilidades son a menudo de naturaleza crítica, lo que permite al ciberdelincuente eludir los controles de seguridad, obtener acceso no autorizado a datos privados e incluso comprometer directamente a otros usuarios de la aplicación. Este tráfico ilegal de solicitudes HTTP va a permitir realizar varios ataques como el envenenamiento de caché, el secuestro de sesión y además, se puede obtener la capacidad de eludir la protección del cortafuegos de las aplicaciones web.

Este ataque HTTP Request Smuggling puede afectar a diferentes equipos y servicios:

  • Servidor web.
  • Firewall.
  • Servidor proxy.

En cuanto al origen, se remonta al año 2005 en el que este ataque fue demostrado por un grupo de investigadores de Watchfire, entre los que están Klein, Ronen Heled, Chaim Linhart y Steve Orrin. No obstante, en los últimos años se han ido realizando una serie de mejoras que expanden la superficie de ataque y que permiten obtener el máximo acceso de privilegio a las API internas y envenenar cachés.

Cómo se produce este ataque

Actualmente las aplicaciones web emplean con frecuencia cadenas de servidores HTTP entre los usuarios y la lógica de aplicación definitiva. De este modo, los usuarios mandan solicitudes a un servidor de aplicaciones para el usuario, y luego éste envía las peticiones a uno o más servidores de servicios de fondo. Hay que señalar que esta arquitectura cada vez es más frecuente y en algunos casos inevitable como en las aplicaciones basadas en la nube.

En el momento en que un servidor de aplicaciones para el usuario reenvía solicitudes HTTP a un servidor de servicios de fondo, habitualmente manda varias peticiones a través de la misma conexión de red de servicios de fondo. Esto se hace así porque es más eficiente y proporciona un mayor rendimiento. La forma de actuación es sencilla, primero las peticiones HTTP se mandan una tras otra. Luego, el servidor receptor analiza los encabezados de cada una de las solicitudes HTTP para precisar dónde acaba una petición y cuándo comienza la siguiente.

Un aspecto muy importante es que los sistemas front-end y back-end deben estar de acuerdo sobre los límites de las solicitudes. Esto es relevante porque, en caso contrario, un ciberdelincuente podría mandar una petición ambigua a los sistemas front-end y back-end y que lo pudieran entender de manera distinta.

Aquí, el atacante hace que parte de su solicitud de front-end sea interpretada por el servidor de back-end como el inicio de la siguiente solicitud. Lo que sucede entonces, es que se antepone a la siguiente petición, lo cual provoca una interferencia con la manera en que la aplicación procesa esa solicitud. Nos encontraríamos un ataque de HTTP Request Smuggling y puede tener resultados desastrosos para el propietario de ese servidor.

Por qué se producen estos ataques

Una gran parte de las vulnerabilidades HTTP Request Smuggling se producen porque la especificación HTTP proporciona dos formas diferentes de especificar dónde termina una solicitud. Un encabezado es simple, especifica la longitud del cuerpo del mensaje en bytes. Éste se puede utilizar para indicar que el cuerpo del mensaje usa codificación fragmentada. Esto quiere decir que el cuerpo de ese mensaje contiene uno o más fragmentos de datos. Algunos administradores de seguridad desconocen que la codificación fragmentada se puede utilizar en solicitudes HTTP y esto supone un problema.

Por si no lo sabéis, HTTP proporciona dos métodos diferentes para determinar la longitud de los mensajes HTTP. También hay que señalar que es posible que un solo mensaje utilice ambos métodos a la vez, en cuyo caso entrarían en conflicto entre sí. El protocolo HTTP intenta solventar este problema indicando que si ambos encabezados Content-Length y Transfer-Encoding están presentes, entonces el encabezado Content-Length es el que no debe utilizarse. Esta fórmula puede ser suficiente para evitar la ambigüedad cuando solo tenemos un servidor activo, pero no cuando tenemos dos o más servidores encadenados.

Por lo tanto, si los servidores front-end y back-end se comportan de manera diferente en relación con un encabezado del tipo Transfer-Encoding que esté posiblemente ofuscado, entonces pueden estar en desacuerdo sobre los límites entre las solicitudes sucesivas. Esto nos llevaría a que se pudieran producir vulnerabilidades y un ataque HTTP Request Smuggling.

Cómo prevenir este peligroso ataque

Los ataques HTTP Request Smuggling implican colocar tanto el encabezado Content-Length como el encabezado Transfer-Encoding en la misma petición HTTP, y después manipularlos para que los servidores front-end y back-end procesen la solicitud de manera diferente.

Klein, al que ya hemos mencionado antes, pide la normalización de las solicitudes HTTP salientes de los servidores proxy y destaca la necesidad de una solución de firewall de aplicación web robusta y de código abierto que sea capaz de manejar este tipo de ataques. Para solucionar este problema, Klein ha publicado un proyecto basado en C++ que nos va a garantizar que todas las solicitudes HTTP entrantes sean completamente válidas, compatibles y sin ambigüedades. Este trabajo está publicado en GitHub y podéis consultarlo aquí.

Por otra parte, algunas otras cosas que podríamos hacer para evitar un ataque de HTTP Request Smuggling serían estas:

  • Deshabilitar la reutilización de las conexiones de back-end, de modo que cada solicitud de back-end se mande a través de una conexión de red separada.
  • Utilizar HTTP/2 para las conexiones de back-end, ya que este protocolo evita la ambigüedad en los límites entre las peticiones.
  • Hay que usar el mismo software de servidor web exacto e idéntico para los servidores front-end y back-end. Así se garantiza que estén de acuerdo en los límites entre las solicitudes.

Tal y como habéis visto, el ataque HTTP Request Smuggling es muy importante debido a su gravedad, es bastante peligroso, sin embargo, tenemos diferentes maneras de prevenir este ataque y mitigarlo correctamente.

¡Sé el primero en comentar!