¿Sigue siendo válida la recomendación de OWASP con respecto al almacenamiento local?

40

Actualmente estoy trabajando en una aplicación que es una aplicación de una sola página creada con Angular. Se sirve a través de HTTPS, utilizando HSTS.

Para la autenticación, estamos usando Auth0. La documentación Auth0 recomienda almacenar el token de acceso en localstorage.

Luego se usa un interceptor para agregar esto al encabezado de cada solicitud HTTP.

Sin embargo, esta respuesta recomienda no almacenar ninguna información confidencial con localstorage.

La respuesta es de 2011, y el autor también coescribió la hoja de trucos de OWASP HTML5, que dice:

  

Preste especial atención a las llamadas "localStorage.getItem" y "setItem" implementadas en la página HTML5. Ayuda a detectar cuándo los desarrolladores crean soluciones que ponen información confidencial en el almacenamiento local, lo que es una mala práctica.

Me pregunto si la situación en 2017/2018 ha cambiado. ¿Estoy de acuerdo con seguir las pautas de Auth0 o debo tomar otro enfoque?

    
pregunta JMK 19.12.2017 - 14:51
fuente

4 respuestas

46

Personalmente no veo ningún problema con el uso del almacenamiento local siempre y cuando esté satisfecho con el hecho de que el usuario no tenga que volver a autenticarse entre sesiones. La respuesta vinculada proporciona el siguiente argumento en contra de esto. Yo diría que es muy débil -

  

El mecanismo de almacenamiento subyacente puede variar de un agente de usuario a otro. En otras palabras, cualquier autenticación que requiera su aplicación puede ser ignorada por un usuario con privilegios locales en la máquina en la que se almacenan los datos. Por lo tanto, se recomienda no almacenar ninguna información confidencial en el almacenamiento local.

Esto se aplica con cualquier tipo de token de autenticación. Alguien local con privilegios de administrador (suponiendo que no esté encriptado con una clave vinculada a las credenciales de los usuarios) puede leerlo en cualquier tipo de almacenamiento, RAM o incluso directamente de la red.

También sugiere -

  

(o defecto XSS en el sitio web)

Nuevamente, esto se aplica a cualquier tipo de token al que pueda acceder JavaScript.

    
respondido por el Hector 19.12.2017 - 15:10
fuente
8

La razón por la que el almacenamiento local se considera inseguro es porque cualquier JavaScript que se ejecute en el contexto de la página puede acceder a este. Esto lo abre para el secuestro de sesiones a través de XSS reflexivo y vulnerabilidades XSS almacenadas, potencialmente revelación de información según el contenido de su token.

Por ejemplo: si un usuario va a una página con contenido compartido entre otros usuarios y hay una vulnerabilidad XSS almacenada, otro usuario puede inyectar un ataque que robará su token del almacenamiento local.

La caducidad corta solo protege su token de los ataques de reproducción, pero si existe una vulnerabilidad XSS con acceso a localstorage, esto no tendrá ningún efecto en las sesiones activas, ya que puede escribir un mecanismo de sondeo para extraer el token de localstorage nuevamente al vencimiento

Le sugiero que utilice una cookie como almacenamiento para su token.

  • Las cookies solo se pueden marcar como HTTP. Esto evitará que JavaScript pueda acceder a la cookie
  • En el servidor haga que su código extraiga el token de la cookie y luego lo valide
  • Marque también como Seguro para HTTPS solo

Lo siento, no hay suficientes puntos para responder, así que deja esto aquí:

Otra consideración, ¿cuál es tu modelo de amenaza? Los atacantes externos en la web: almacenan el token en un proceso de cookies en el servidor Usuarios en la misma máquina (no administrador): tal vez el almacenamiento de sesión no sea persistente Administrador local: nada, son administradores locales, son dueños del sistema

La certificación del cliente no es realmente una pieza de autenticación viable para las aplicaciones web como usuario; los autenticadores de MFA son la mejor alternativa

    
respondido por el McMatty 20.12.2017 - 20:38
fuente
3

Siguiendo los consejos de the auth0 blog you puede contrarrestar los problemas de seguridad manteniendo un valor bajo de caducidad del token y, lo que es más importante, puede cifrar el token.

Un enfoque alternativo sería el uso de JSON Web Tokens en asociación con OAuth2.

    
respondido por el Stefan 19.12.2017 - 22:47
fuente
2

No estoy 100% en seguridad. Leí algo más de esto.

El problema con la "información confidencial del token" es el mismo problema, ya sea una cookie o un almacenamiento local.

Pero puede guardar muchos más datos en el almacenamiento local, lo que podría hacer surgir la idea de que es una buena idea almacenar toda la información bancaria, todas las transferencias, etc. (inserte otra información arriesgada, escuche. médica, judicial, ...) en el almacenamiento local, para que pueda acceder a él sin conexión.

El riesgo de seguridad de una cookie o una sesión se ve mitigado por un tiempo de espera de sesión en el lado del servidor. Pero el almacenamiento local no tiene un tiempo de espera. Entonces, si almacena cualquier cosa en el almacenamiento local, prepárese para que permanezca allí para siempre. Si no quiere que todos los que tienen acceso a la máquina puedan leerla, asegúrese de eliminarla y asegúrese de que su mecanismo funcione bajo "todas las circunstancias" (lo que sea que esto signifique en el contexto de almacenamiento local), esto no es posible. Pero soy un desarrollador php, por favor corríjame.

    
respondido por el Fabian Blechschmidt 20.12.2017 - 10:36
fuente

Lea otras preguntas en las etiquetas