Generalmente puedo hablar con CSRF, pero no con el framework Spring (que no he usado). Como no puedo verificar sus reclamaciones con Spring, voy a tomar sus reclamaciones a su valor nominal. A saber:
- Puede obtener un token CSRF haciendo una llamada válida usando cualquier sesión de su elección
- Si obliga a cualquier otro usuario a realizar una solicitud con su token CSRF, Spring lo aceptará como un token válido
Suponiendo que sus hallazgos son precisos (una vez más, no estoy dudando de usted, simplemente no puedo verificarlo), estos son mis pensamientos inmediatos:
- No se debe permitir que los tokens CSRF crucen sesiones como esta.
- Ciertamente consideraría esto como una vulnerabilidad de seguridad.
- Detalles adicionales sobre cómo Spring valida los tokens CSRF son necesarios para decidir si hay un vector de ataque realista aquí.
En detalle, los tokens CSRF definitivamente no deberían poder cruzar sesiones. Cada token CSRF debe estar asociado con la sesión que lo generó, y no debe ser un token válido para ninguna otra sesión. Como señala, al permitir que los tokens para cruzar las sesiones, es posible que un atacante genere tokens válidos de antemano. Esto definitivamente puede ser un problema. Sin embargo, hay algunas circunstancias que pueden mitigar la amenaza potencial aquí:
Más que solo verificación de token
Los tokens son solo una forma de protegerse contra los ataques CSRF. Personalmente, creo que son la forma más directa y confiable. Sin embargo, no son la única manera. Otra opción es verificar los encabezados REFERRER y ORIGIN . Si Spring también está comprobando los encabezados REFERRER y ORIGIN, es poco probable que esta debilidad en su token CSRF sea explotable. La prueba que hiciste (cambiando manualmente el token CSRF a través de las herramientas del navegador) aún te dejará con los encabezados REFERRER y ORIGIN adecuados, lo que significa que pasarás ambas comprobaciones CSRF. Sin embargo, no sería posible para un atacante reproducir esto. Funciona para usted porque estaba en la página de la aplicación real y editó la página de la aplicación directamente. Un atacante hará que ocurra un ataque CSRF desde algún lugar completamente diferente, y no puede forzar los encabezados de REFERENCIA y ORIGEN. Por lo tanto, si Spring también también verifica los encabezados REFERRER y ORIGIN, entonces está bien.
¿La primavera hace ambas cosas? No lo sé. ¿Por qué Spring haría ambas cosas? No estoy seguro, aunque estaría en línea con el concepto de "Defensa en profundidad", por lo que no sería una locura que hiciera ambas pruebas. Si está haciendo ambas cosas, obviamente, incluso una gran debilidad en el token CSRF no importará. Sin embargo, si hace ambas cosas e ignora una u otra en ciertas circunstancias, entonces podría haber un vector de ataque si puede hacer que ignore las comprobaciones de encabezado y también falsificar el token CSRF.
Caducidad del token CSRF
También puede haber un vencimiento del token que hará que sea difícil convertir esto en un vector de ataque explotable. De hecho, es casi seguro que tiene un vencimiento simbólico. Como atacante, puede generar un token CSRF válido, pero si tiene una caducidad corta, debe colocarlo delante de un objetivo rápidamente. Supongamos que creó un vector de ataque CSRF que elevó efectivamente su cuenta de usuario a administrador cuando un administrador ve una página maliciosa que generó. Esto solo le servirá de nada si puede engañar a un administrador para que vea su página de ataque antes de que caduque su token. Dependiendo de su método de entrega y la duración de la caducidad del token, esto puede ser muy difícil.
Para resumir: ¿es esta la norma para CSRF? No, de hecho es potencialmente peligroso. ¿Es explotable? Eso es más difícil de responder. Como siempre, el diablo está en los detalles. ¿Vale la pena profundizar en más? Yo diría que sí.