¿Es malo enviar contraseñas simples a través de SSL como parte de un proceso de actualización de contraseña?

6

La aplicación web en la que estoy trabajando tiene un 100% de seguridad SSL (o más bien, TLS como se llama hoy ...). La aplicación recientemente ha sido auditada por una empresa de seguridad. En general estoy de acuerdo con sus resultados, pero hubo una cosa que llevó a grandes debates:

Como parte del proceso de cambio de contraseña para los usuarios, el usuario debe proporcionar la contraseña antigua y la nueva dos veces, lo que no es inusual. Además, la nueva contraseña debe cumplir con una política de contraseña (longitud mínima, yadda yadda).

La aplicación se realiza con Vaadin, que utiliza pequeños mensajes AJAX para actualizar la interfaz de usuario. Toda la lógica de la aplicación reside en el servidor. Esto significa que toda la validación de la forma de cambio de contraseña ocurre en el servidor. Para validar el formulario, tanto la contraseña antigua como las dos nuevas (que deben coincidir, por supuesto) deben enviarse al servidor. Si hay algo incorrecto (la contraseña anterior es incorrecta, las nuevas contraseñas no coinciden, la nueva contraseña no se ajusta a la política de contraseñas), el usuario recibe un error. Desafortunadamente, como parte del proceso de sincronización, Vaadin envía nuevamente todos los datos del formulario al cliente, incluidas las contraseñas antiguas y nuevas.

Dado que todo esto sucede sobre SSL, nunca lo pensé dos veces, pero la empresa de seguridad lo vio como un riesgo de seguridad de la más alta gravedad. Tenga en cuenta que el problema a los ojos de la empresa de seguridad no fue que los datos se envían al servidor, sino que el servidor incluyó los datos en su respuesta en caso de que la validación fallara . Así que nuestra solución actual es vaciar todos los campos si falla la validación. Esto lleva a una experiencia de usuario deficiente, ya que el usuario debe completar tres campos de texto una y otra vez si, por ejemplo, las contraseñas no coinciden repetidamente con la política de contraseñas.

¿Estoy siendo ingenuo al pensar que esto está muy por encima? Quiero decir, si un atacante rompe el cifrado, tienen acceso a todo el tráfico de todos modos.

editar : con respecto a la navegación por los hombros, quiero dejar claro que ninguna contraseña se devolverá al usuario . Todos los campos de entrada son campos de contraseña adecuados que solo muestran marcadores de posición pero no caracteres reales.

    
pregunta musiKk 19.06.2014 - 17:49
fuente

5 respuestas

3

En realidad, diría que es mejor la UX para despejar los campos. Suponiendo que los campos de contraseña están llenos de asteriscos, el usuario eliminará todo el campo de todos modos cuando vuelva a escribir su contraseña.

Además, te estás abriendo a un nuevo riesgo de seguridad. Hay posibilidades para XSS, navegación por los hombros y también en cualquier momento en que envíe contraseñas a cualquier lugar donde haya aumentado su riesgo en general.

Nunca he visitado un sitio que haya guardado los campos de contraseña llenos si ingresé algo incorrecto. El campo solo que se completó fue el campo de correo electrónico, y posiblemente la dirección / número de teléfono.

Siempre tienes que asumir lo peor, y si puedes tapar un agujero, hazlo. No creo que el auditor de seguridad esté exagerado, especialmente porque se trata de una solución fácil para un problema de UX realmente inexistente, y si está devolviendo sus contraseñas y mostrándolas sin cambiar cada carácter a un asterisco, entonces usted definitivamente tiene un problema de seguridad. La única vez que alguien debe ver una contraseña que ingresan es si seleccionan una opción que les permita verla temporalmente.

    
respondido por el Eric Lagergren 20.06.2014 - 00:44
fuente
1

Es mejor tener una política de contraseñas que solo se ingresen, nunca se generen. Este es un enfoque práctico y un buen paso en la dirección correcta para la seguridad con poco costo.

Cualquier salida de contraseñas también sería visible en texto sin formato si se hace clic en "ver fuente", lo que significa que cualquier persona que practica surf a su alrededor podría ver las contraseñas.

Si se trata simplemente de pedirle al usuario que vuelva a ingresar su contraseña original, una nueva contraseña y la confirmación, entonces este no es un gran defecto de la interfaz de usuario. Si era una página masiva y la validación en otros campos hace que los cuadros de contraseña queden en blanco, entonces puede ser molesto para los usuarios volver a ingresar sus tres contraseñas cada vez, y algunos usuarios pueden simplemente ingresar qwerty o algo así. Si este es el caso, movería los campos de contraseña a otra página para que puedan ingresarse y validarse por separado.

    
respondido por el SilverlightFox 19.06.2014 - 23:13
fuente
0

Haciendo eco de la entrada al cliente, siempre se generan sospechas XSS entre sitios. Pero en su caso, creo que es una reacción exagerada ya que la salida es transitoria y nunca se mostrará a nadie más que a quien ingresó. ¿Has probado <script>alert(document.cookie);</script> como contraseña?

Usted podría jugar con su auditor haciendo un cambio completo de la contraseña y la llamada Ajax, sin borrar el formulario ni cambiar la página. Solo tendría que responder con un código de error para ajustar la IU en consecuencia. Algo así como esto:

  1. Solicite la contraseña actual, nueva y rechazada en un formulario
  2. El usuario hace clic en "Cambiar contraseña", se realiza una solicitud de Ajax al servidor. La forma se mantiene, con algunos gif-in-a-div animados para que el usuario espere
  3. Si el cambio falla, el servidor responde con un código de error (no es lo suficientemente complejo, la nueva y repetición no coinciden, etc.)
  4. Si no coinciden, borre tanto el campo nuevo como el de repetición

Solo tenga en cuenta que la contraseña anterior se está haciendo más antigua con cada intento fallido. La contraseña anterior está ahí para garantizar que el usuario legítimo está realizando el cambio. Cuanto más la "reutiliza", más débil es la certeza. Debería borrar todo después de N intentos fallidos (o después de N segundos).

    
respondido por el ixe013 19.06.2014 - 20:12
fuente
0

Creo que la razón por la que se considera inseguro enviar las contraseñas al cliente es porque el cliente puede almacenar en caché la página, lo que significa que hay una versión de la contraseña en texto plano almacenada en algún lugar del disco local del usuario. Pulsar el botón Atrás o analizar el caché podría revelar la contraseña. Esto es especialmente malo en las máquinas públicas.

Además, hay escenarios válidos en los que es posible que desee hacer lo que sugiere el OP. Por ejemplo, si tiene una pantalla de registro con un captcha en él, hacer que el usuario vuelva a escribir dos contraseñas cada vez que fallan, el captcha puede ser demasiado molesto. Pero si su sitio es lo suficientemente importante como para requerir una auditoría de seguridad, entonces probablemente esté mejor evitando esto, y en su lugar considere facilitar su captcha.

    
respondido por el TTT 19.06.2014 - 22:59
fuente
0

No creo que volver a ingresar las tres contraseñas sea una mala experiencia para el usuario, ¡por favor, prefiera eso y evite enviarlas de vuelta!

Imagina que el usuario dejó la computadora y alguien más hace algo como console.log($('#oldpassword').val()); Eso es malo.

Si bien solo puede ver puntos en los campos de contraseñas, si olvida el último carácter, generalmente borra el campo por completo, por lo que vuelve a ingresar la contraseña completa nuevamente.

Como las comunicaciones SSL son difíciles de descifrar, ¿qué se transfiere entre nodos? Le da una sensación de frío en el cuello, sabiendo que sus datos confidenciales se están ejecutando y nadie los controla.

entonces, si está borrando la contraseña en el lado del servidor, ¡entonces siga haciendo eso! no dejes que vaddin gane y en el lado del cliente siempre deseche los datos sensibles.

    
respondido por el Quijote Shin 19.06.2014 - 23:40
fuente

Lea otras preguntas en las etiquetas