Me parece arriesgado. La compresión HTTP está bien para los recursos estáticos, pero para algunos recursos dinámicos servidos sobre SSL, parece que la compresión HTTP puede ser peligrosa. Me parece que la compresión HTTP puede, en algunas circunstancias, permitir ataques tipo CRIME.
Considere una aplicación web que tenga una página dinámica con las siguientes características:
-
Se sirve a través de HTTPS.
-
El servidor admite la compresión HTTP (esta página se enviará al navegador en forma comprimida, si el navegador admite la compresión HTTP).
-
La página tiene un token CSRF en alguna parte. El token CSRF está fijo durante la vida útil de la sesión (por ejemplo). Este es el secreto que el ataque tratará de aprender.
-
La página contiene contenido dinámico que puede especificar el usuario. Para simplificar, supongamos que hay un parámetro de URL que se refleja directamente en la página (quizás con algún escape de HTML aplicado para evitar XSS, pero eso está bien y no detendrá el ataque descrito).
Luego, creo que los ataques de estilo CRIME podrían permitir que un atacante aprenda el token CSRF y monte los ataques CSRF en el sitio web.
Déjame dar un ejemplo. Supongamos que la aplicación web de destino es un sitio web bancario en www.bank.com
, y la página vulnerable es https://www.bank.com/buggypage.html
. Supongamos que el banco se asegura de que solo se pueda acceder a la banca mediante SSL (https). Y, supongamos que si el navegador visita https://www.bank.com/buggypage.html?name=D.W.
, entonces el servidor responderá con un documento HTML con una apariencia vagamente similar a esta:
<html>...<body>
Hi, D.W.! Pleasure to see you again. Some actions you can take:
<a href="/closeacct&csrftoken=29238091">close my account</a>,
<a href="/viewbalance&csrftoken=...">view my balance</a>, ...
</body></html>
Supongamos que está navegando por la web a través de una conexión Wifi abierta, de modo que un atacante pueda escuchar todo el tráfico de su red. Supongamos que actualmente está conectado a su banco, por lo que su navegador tiene una sesión abierta con el sitio web de su banco, pero en realidad no está realizando ninguna actividad bancaria a través de la conexión Wifi abierta. Supongamos, además, que el atacante puede atraerlo para que visite el sitio web del atacante http://www.evil.com/
(por ejemplo, tal vez realizando un ataque de hombre en el medio hacia usted y redirigiéndolo cuando intente visitar otro sitio http).
Luego, cuando su navegador visita http://www.evil.com/
, esa página puede desencadenar solicitudes de dominios cruzados al sitio web de su banco, en un intento de conocer el token CSRF secreto. Tenga en cuenta que Javascript tiene permiso para realizar solicitudes de dominios cruzados. La política del mismo origen no le permite ver la respuesta a una solicitud de varios dominios. No obstante, dado que el atacante puede espiar el tráfico de la red, el atacante puede observar la longitud de todos los paquetes cifrados y así inferir algo sobre la longitud de los recursos que se están descargando a través de la conexión SSL a su banco.
En particular, la página maliciosa http://www.evil.com/
puede desencadenar una solicitud a https://www.bank.com/buggypage.html?name=closeacct&csrftoken=1
y ver qué tan bien se comprime la página HTML resultante (al espiar los paquetes y observar la longitud del paquete SSL del banco). A continuación, puede desencadenar una solicitud a https://www.bank.com/buggypage.html?name=closeacct&csrftoken=2
y ver qué tan bien se comprime la respuesta. Y así sucesivamente, para cada posibilidad para el primer dígito del token CSRF. Uno de ellos debería comprimir un poco mejor que los otros: uno donde el dígito en el parámetro de URL coincide con el token CSRF en la página. Esto le permite al atacante aprender el primer dígito del token CSRF.
De esta manera, parece que el atacante puede aprender cada dígito del token CSRF, recuperándolos dígito a dígito, hasta que el atacante aprenda todo el token CSRF. Luego, una vez que el atacante conoce el token CSRF, puede hacer que su página maliciosa en www.evil.com
desencadene una solicitud de dominio cruzado que contenga el token CSRF apropiado, lo que supera con éxito las protecciones CSRF del banco.
Parece que esto puede permitir a un atacante montar un ataque CSRF exitoso en aplicaciones web, cuando se aplican las condiciones anteriores, si la compresión HTTP está habilitada. El ataque es posible porque estamos combinando secretos con datos controlados por un atacante en la misma carga útil, y luego comprimimos y ciframos esa carga útil.
Si hay otros secretos que se almacenan en HTML dinámico, podría imaginar que ataques similares podrían ser posibles para aprender esos secretos. Este es solo un ejemplo del tipo de ataque en el que estoy pensando. Por lo tanto, me parece que el uso de la compresión HTTP en páginas dinámicas a las que se accede a través de HTTPS es un poco arriesgado. Puede haber buenas razones para deshabilitar la compresión HTTP en todos los recursos servidos a través de HTTPS, a excepción de las páginas / recursos estáticos (por ejemplo, CSS, Javascript).