Estoy escribiendo una aplicación web que ya usa conexiones cifradas TLS (HTTPS), cookie de sesión Secure; HttpOnly
, token CSRF HMAC-SHA1, requiere el encabezado Referer
correcto para evitar el inicio de sesión CSRF y cambia la identificación de la sesión durante el inicio de sesión para evitar Ataques básicos de fijación de sesión.
Sin embargo, no puedo usar HSTS porque el mismo dominio debe servir contenido HTTP por razones históricas.
No logro comprender cómo evitar el ataque MitM que realiza la reparación de la sesión en la práctica:
- El atacante navega a
https://example.com/login
y recibe una nueva cookie anónimasession-id
y el HMAC-SHA1csrf-token
incorporado en el formulario de inicio de sesión. - El atacante completa el inicio de sesión y el servidor sobrescribe la cookie
session-id
para la nueva identificación de usuario. - El atacante guarda el valor de
session-id
cookie. - La víctima navega a
example.com
usando HTTP y el atacante inicia un ataque MitM que modifica la respuesta para que tengaSet-Cookie: session-id=<value-from-attacker-session>
yLocation: https://example.com/whatever
. - El navegador de la víctima ahora completa el protocolo de enlace TLS completo con
example.com
y haceGET /whatever
conCookie: session-id=<value-from-attacker-session>
. En la práctica, esto es una finalización del ataque de reparación de la sesión porque la víctima ahora está ejecutando la sesión compartida con el atacante.
Por supuesto, este no es un ataque fácil porque requiere un ataque MitM activo y la víctima necesita usar una conexión HTTP inicial para example.com
. Además, esto solo permite la fijación de sesiones, no el secuestro de sesiones.
- ¿Es HSTS la única forma de evitar este ataque?
- ¿Hay alguna manera de evitar que las cookies configuradas a través de la conexión HTTP sean visibles en la conexión HTTPS y se vean idénticas a las cookies
Secure; HttpOnly
?
Actualización 2014-09-04
Supongo que las siguientes afirmaciones son ciertas:
- La conexión TLS es segura y la UA tiene una lista sensata de CA confiables.
- El usuario final puede evitar
sslstrip
-como los ataques cuando el navegador Chrome contiene una URL incorrecta. -
example.com
no está en la lista HSTS precargada.
La cookie de protección sugerida por Steffen Ullrich solucionaría el problema, excepto por el hecho de que no puede detectar si se realiza un ataque durante la conexión inicial. La implementación de la cookie de protección aún evitaría el ataque al cambiar la sesión sobre la marcha. Actualmente, MitM Attacker podría sobrescribir la cookie original Secure; HttpOnly
llamada session-id
con una cookie HTTP regular en cualquier momento en el futuro, puede obtener la UA para acceder a cualquier URL HTTP para el mismo dominio. (Esto puede ser bastante fácil porque el atacante puede redireccionar cualquier conexión HTTP desde la misma sesión del navegador).
Todavía no consigo ver ninguna manera de solucionar este problema sin la ayuda de UA. Si los UAs solo tuvieran una manera de saber qué cookies se han configurado a través de la conexión TLS en lugar del HTTP simple y sin formato ...
(Como parte, no tengo que decir que todos los sugerencias para detectar sslstrip
-como ataques por parte del servidor como se describe en la respuesta vinculada por Steffern Ullrich porque todas las sugerencias requieren el envío de JavaScript los archivos que detectan y sslstrip
se refieren estrictamente a un atacante MitM capaz de modificar archivos sobre la marcha. Como tal, el atacante puede hacer fácilmente cualquier detección de JavaScript para devolver siempre "ok".)
Enlaces relacionados: 1. Forzado de cookies 2. CSRF de inicio de sesión