Ventajas de múltiples tokens CSRF válidos

5

Según tengo entendido, hay dos enfoques para realizar la protección CSRF:

1) Token CSRF por sesión: el token se genera una vez por sesión. Esta es la forma más fácil;

2) token CSRF por solicitud: el nuevo token se genera en cada solicitud y el anterior se vuelve inválido. Esto es más seguro, pero la aplicación web puede romperse al presionar y hacer clic en el botón "atrás" en el navegador .

Hace unos días comencé a analizar cómo el marco de Node.js Connect implementa la protección CSRF y noté que utiliza el tercer enfoque:

Se genera un nuevo token CSRF en cada solicitud, pero el anterior no se vuelve válido . Así que hay varios tokens CSRF válidos para el usuario a la vez.

Mi pregunta es : ¿cuáles son las ventajas de los múltiples válidos tokens CSRF?

Muchas gracias.

P.S. No soy muy fuerte en inglés, así que explícalo de la manera más sencilla posible. Gracias de nuevo

EDITAR (reformulando mi pregunta):

El principal beneficio de generar un nuevo token en cada solicitud (y hacer que un antiguo sea inválido) es que el token se convierte en corto plazo e incluso si el atacante roba el token, caducará muy rápido. Pero con Connect un token antiguo no caduca, lo que hace que este enfoque sea el mismo que usar un solo token por sesión.

Entonces, ¿por qué los desarrolladores de Connect decidieron generar un token nuevo en cada solicitud? ¿Me estoy perdiendo algo?

    
pregunta Oleg 09.02.2014 - 08:33
fuente

3 respuestas

4
  

Mi pregunta es: ¿Cuáles son las ventajas de varios tokens CSRF válidos?

En general, no hay una ventaja de seguridad particular ... el bit importante acerca de un token es cuándo y cómo se vuelve inválido (como en la discusión anterior acerca de si un token se vuelve inválido después de una sola solicitud o no). Cuando y cuantos tokens se generan es más un detalle de implementación:

Si implementa tokens CSRF como valores aleatorios almacenados de forma persistente (el patrón del 'token sincronizador'), realmente no desea almacenar más de un token por sesión, ya que tomará más y más ancho de banda de la base de datos para hacerlo. Por lo tanto, es natural en este modelo tener un solo token almacenado como un atributo en la sesión.

Si implementa tokens CSRF como una firma (generalmente: HMAC) sobre la aserción de sesión, entonces está validando ese token al verificar la firma con la clave secreta de su aplicación, por lo que no necesita almacenar el token en el servidor. lado en absoluto En este modelo, es barato generar / firmar un token nuevo cada vez, y como los tokens suelen incluir una marca de tiempo y una sal aleatoria, serán diferentes cada vez.

La ventaja habitual del método de firma es que no necesita almacenamiento, por lo que potencialmente puede ser parte de un esquema de control de acceso sin sesión. La desventaja es que necesita administrar la clave secreta de manera segura. (Pero a menudo ya tienes esa carga de todos modos).

Sin embargo ...

  

Entonces, ¿por qué los desarrolladores de Connect decidieron generar un nuevo token en cada solicitud

No está claro. A juzgar por el código en la página vinculada, Connect tiene un valor aleatorio almacenado en la sesión, pero luego los tokens que emite son firmas sobre este valor aleatorio y otro valor aleatorio por token.

Esto no parece tener ninguna ventaja sobre el token de sincronizador simple: aún tiene que almacenar los atributos de la sesión, y los tokens emitidos no están limitados por ninguna otra restricción firmada (por ejemplo, marca de tiempo de caducidad o revocación). Por lo tanto, el conocimiento del token emitido otorga el mismo acceso que el conocimiento del valor aleatorio almacenado. Son totalmente equivalentes, por lo que no hay ningún punto obvio en el hecho de tener los tokens emitidos que varían, puedes simplemente emitir el valor aleatorio almacenado sin ningún inconveniente de seguridad.     

respondido por el bobince 10.02.2014 - 00:52
fuente
1

Casi todos los sitios web, incluida la banca en línea, deben usar tokens por sesión. Si tu aplicación lanza armas nucleares, entonces tal vez querrías tokens por solicitud, pero dudo que utilices una aplicación web para ese propósito.

En las guías de seguridad se ve mucho énfasis en los tokens por solicitud, pero no hay una buena razón para ello. Si un atacante puede robar un token CSRF, entonces tiene más de qué preocuparse que CSRF. Es probable que también puedan robar la cookie de sesión, y hacer que su token CSRF por solicitud no ayude con eso.

No hay ningún beneficio de seguridad para el enfoque que Node Connect ha adoptado. Supongo que acaban de leer algunas de estas guías de desarrollo seguro que se basan en tokens por solicitud, encontraron el problema del botón de retroceso y terminaron con una tontería.

    
respondido por el paj28 09.02.2014 - 19:47
fuente

Lea otras preguntas en las etiquetas