martes, 2 de febrero de 2016

Los sitios web que no amaban a las contraseñas

Todos los días abrimos y cerramos la puerta de nuestra casa sin cuestionarnos el funcionamiento de la cerradura. Lo mismo ocurre cuando nos autenticamos en algún servicio online, introducimos nuestra contraseña sin preguntarnos qué procesos ocurren para que el sistema nos deje acceder. Las contraseñas son las llaves del mundo digital, pero... ¿son seguras las cerraduras digitales?

Lamentablemente cada vez son más frecuentes las noticias de fugas de información, ataques a servicios en Internet, y en muchos casos comprobamos como millones de contraseñas terminan expuestas de forma pública. Las buenas prácticas y un poco de lógica nos dice que todos los servicios deberían almacenar las contraseñas de sus usuarios de forma segura, pero... ¿se cumple realmente esta regla en todos los casos?

Todos los usuarios nos enfrentamos diariamente con diferentes formularios de autenticación. Incluso de vez en cuando nos registramos en un sitio nuevo y debemos proceder con un nuevo proceso de alta. Ya sabemos, nombre, correo, algunos otros datos en función del tipo que servicio, y por supuesto la ya clásica contraseña.

A los usuarios se nos recomienda (y hasta se nos obliga) que la contraseña que creemos sea segura, de una determinada longitud, con caracteres en mayúscula y minúscula, con números, etc. Además, se nos recuerda que no debemos dejar la contraseña apuntada en un sitio que la pueda ver todo el mundo (evitar el clásico post-it con la clave apuntada). ¿Pero estamos seguros que tras introducir esa compleja contraseña el servicio la trata y mantiene con el mismo cuidado con el que se nos insta a nosotros? Ya que ideal y técnicamente no deberían guardar la contraseña, sino una imagen (en sentido funcional) irreversible.

Está claro que nuestra clave, de una forma u otra, pasa a formar parte de una base de datos. Queremos pensar que siempre se almacena de una forma segura. Pero... ¿es siempre cierto? ¿Todos los programadores piensan en la seguridad cuando desarrollan?

No es menos frecuente que tras el proceso de alta recibamos un correo indicando que el alta en el servicio se ha llevado a cabo de forma correcta. Pero llama la atención cuando en ese mismo mensaje se nos indica en texto claro la contraseña que hemos introducido. Desde luego esto no es una buena práctica. Es un pecado mortal de consecuencias catastróficas y un indicativo directo de la postura en materia de seguridad de la organización. En pocas palabras, un correo con una contraseña en texto claro podría indicar una compañía con una cultura de seguridad potencialmente baja.

Por otra parte, esto nos puede hacer sospechar que nuestra contraseña se ha guardado en texto plano. Es cierto que el mensaje puede construirse y enviarse antes de almacenarla de forma segura en la base de datos, pero desde luego no es un buen síntoma. La contraseña en texto claro no debería aparecer en ningún sitio, ni mucho menos enviarse en un correo electrónico.

Las buenas prácticas de gestión de contraseñas dictaminan que una contraseña nunca, repetimos, nunca debe ser almacenada en texto plano.

Cada vez que recibo un mail con una contraseña en claro un escalofrío recorre mi cuerpo. ¿Se habrá guardado esa contraseña de forma correcta?

¿Cómo se deben almacenar las contraseñas de forma segura?

El proyecto OWASP (Open Web Application Security Project) tiene como objetivo ofrecer una metodología, de libre acceso y utilización, que pueda ser utilizada como material de referencia por parte de los arquitectos de software, desarrolladores, fabricantes y profesionales de la seguridad involucrados en el diseño, desarrollo, despliegue y verificación de la seguridad de las aplicaciones y servicios web.

En este sentido la OWASP es muy clara, y ofrece claros consejos a seguir sobre el almacenamiento de contraseñas:

La primera recomendación pasa por no limitar ni el conjunto de caracteres ni la longitud máxima de la contraseña.

Por otra parte, la forma más recomendable para almacenar una contraseña es mediante el uso de funciones hash. Hay que aclarar que una función hash no cifra el texto, sino que crea un resumen o "firma" del mismo. De forma que al introducir posteriormente la contraseña, se puede comprobar si ese resumen coincide con el de la contraseña introducida.

Un hash es una función criptográfica que produce una salida de longitud fija a partir de una entrada arbitrariamente larga. Un buen "hash" debe cumplir las siguientes propiedades:

a) El resultado final no debe dejar traslucir ninguna información sobre los datos originales.

b) Dado un resultado determinado, no hay otro sistema aparte de la fuerza bruta que genere datos de entrada capaces de producir dicho resultado.

c) Dados unos datos de entrada y su "hash", no debe haber un atajo (aparte de la fuerza bruta) para generar otros datos de entrada distintos y con el mismo "hash".

Una característica fundamental de las funciones hash, es que teniendo el hash no es posible conseguir la contraseña original. Pero sí se puede intentar probar diferentes contraseñas hasta que alguna coincida con el hash dado. Pura fuerza bruta.

Existen muchos algoritmos de "hash", pero lo más recomendable en la actualidad pasa por usar la familia SHA2 como mínimo. La OWASP recomienda el uso de las funciones PDKDF2 o scrypt.

Lo que sí que existen son las conocidas tablas arcoíris ("rainbow tables") para diferentes funciones, básicamente son listas de millones de hashes y sus correspondientes contraseñas. De esta forma basta realizar una búsqueda en un archivo para obtener la contraseña. Podemos encontrar una amplia lista de tablas arcoíris en:

Para complicar los ataques por diccionario, surge la necesidad de emplear hash con sal o "salt". Que no es sino una cadena aleatoria que se añade al principio o final de la contraseña antes de crear el hash. Para cada contraseña se debe usar un salt diferente. Así se consigue eliminar la posibilidad de que el resultado pueda buscarse en alguna tabla rainbow.

Resumiendo, se deben usar funciones irreversibles (tipo PDKDF2 o scrypt) y aplicar una sal de gran tamaño (64bits) en la fórmula de generación de la "imagen" (de nuevo, en sentido matemático).

[dato protegido] = [salt] + proteger ([function hash], [salt] + [credencial]);

¡Oh, no! ¡He olvidado mi contraseña!

Tratando con contraseñas, no podemos olvidar a la madre de todos los problemas: el método de regeneración de contraseñas. Según nuestra experiencia en la realización de auditorías es en este punto en el que suelen fallar muchas de las aplicaciones y sistemas que auditamos. Una debilidad en este aspecto puede permitir a un atacante acceder a la cuenta de cualquier usuario. De ahí la importancia de que este proceso se realice correctamente.

Es una funcionalidad que no se puede evitar, todos los sistemas tienen que tener un método para cuando hayamos olvidado nuestra contraseña. Y es que con la gran cantidad de contraseñas que mantenemos actualmente, esto suele ocurrir con frecuencia.

Existen diferentes estrategias para llevar esto a cabo. Pero siempre se debe generar una contraseña nueva. Como dijimos anteriormente las contraseñas nunca deben ser almacenadas en texto plano. Por lo que el servicio no puede tener capacidad para saber nuestra contraseña anterior. En caso de que al tratar de recuperar el acceso al servicio tras haber olvidado la contraseña se nos envíe la que habíamos introducido originalmente deben saltar todas las alarmas. Ningún sistema correctamente desarrollado puede acceder a la contraseña original en texto plano. Por desgracia ocurre más veces de lo que quisiéramos.

Otro punto débil, todavía empleado en algunos sitios, es el de las preguntas de seguridad. Las preguntas secretas siempre han resultado un método polémico para la recuperación de contraseñas en caso de olvido de la contraseña empleada habitualmente. Las clásicas preguntas del nombre de tu mascota, la fecha de nacimiento, o el nombre de la pareja nunca han parecido un método muy seguro para proteger una contraseña. ¿Dejarías entrar en tu casa a cualquiera que sepa en qué colegio estudiaste?

En muchos sitios aún se recurre a las preguntas de seguridad
Son muchos los casos de famosos (París Hilton, Sarah Palin o Scarlett Johansson entre otros) que han visto sus datos y hasta fotos personales al descubierto porque alguien obtuvo su contraseña a través de este mecanismo. Por fortuna cada vez se encuentran menos sitios que recurren a este método para confirmar que quien recupera la contraseña es quien dice ser.

Por otra parte, en los sitios que aún emplean este método... ¿se aplica el mismo nivel de cifrado o seguridad a la pregunta de seguridad que a la contraseña? Conocer la respuesta de esa pregunta puede permitir a un atacante acceder a la cuenta del usuario, por lo que sin duda debería seguir las mismas reglas de seguridad que la propia contraseña. Si se puede acceder a la respuesta de seguridad en texto plano, ¿qué sentido tiene almacenar correctamente el hash de la contraseña?

En este punto sería interesante analizar el tratamiento que los diferentes sitios que aún emplean este método realizan sobre las diferencias tipográficas. Por ejemplo, si la pregunta es la calle en la que naciste, se puede escribir C/ Olmos, calle olmos c/olmos... todas serían igualmente correctas. Se consideran correctas esas variaciones a la hora de recuperar la contraseña o no. Evidentemente si se guarda el hash solo se admitiría una respuesta como correcta si se escribe igual que como se introdujo originalmente.

Nuestra experiencia nos dice que, por lo general, cuando desgraciadamente se usa este burdo sistema de restablecimiento se guardan las cadenas en texto plano; y el fallo al poner mayúsculas-minúsculas simplemente se trata a través de un "case-insensitive" aplicado a la función de comparación de cadenas.

Por fortuna cada vez se emplea menos la pregunta de seguridad y se utilizan opciones más seguras. Entre los métodos más habituales para obtener una nueva contraseña, suele estar la generación de una nueva contraseña aleatoria y temporal, que se envía al usuario e instarle a cambiarla tras entrar en el sistema.

Aunque un método más adecuado, es enviar al correo del usuario una URL única, generada específicamente (y no predecible) y con un tiempo de vida útil (tras el cual debe caducar) que le permita introducir una nueva contraseña. El usuario solo debe seguir el enlace que recibe e introducir la nueva contraseña que solo él conoce. Fácil y mucho más seguro que otros métodos.

La doble autenticación

Por otra parte, en los últimos años son múltiples los servicios online que han introducido un doble factor de autenticación. Generalmente se trata de una opción para los usuarios que desean una protección adicional para sus datos.

Proceso de verificación en dos pasos de Google
Tradicionalmente el doble factor de autenticación solía venir a través de un dispositivo generador de claves. Pero en la actualidad el método más empleado se basa en el uso del teléfono móvil. Al configurar esta opción de autenticación el usuario debe introducir su número de móvil; y cuando precisa autenticarse, tras introducir su contraseña habitual, se le envía por SMS una contraseña de uso único y temporal que le permitirá acceder al servicio. Básicamente es añadir un "lo que tengo" al "lo que se" (tengo un móvil, se una credencial).

Google, LinkedIn, Facebook, Twitter o Evernote ya ofrecen esta función que sin duda añade mayor seguridad a la cuenta del usuario. Algunos de estos servicios, prácticamente se vieron obligados a implementar esta medida tras diferentes ataques sufridos contra sus usuarios y que podrían haberse evitado con un doble factor de autenticación implementado.

Se puede consultar una lista de todos los servicios que ofrecen doble autenticación en twofactorauth.org/, incluyendo las opciones que ofrecen y agrupados por categorías.

Pero como siempre no solo basta que el método de obtención de contraseñas sea seguro, también debe estar correctamente implementado y de forma segura. Un error de desarrollo en la implementación, en cualquiera de los puntos (generación de nuevas contraseñas, al guardarlas en la base de datos, en la comprobación del hash, etc.) puede hacer que el resto de medidas de seguridad implementadas queden en nada. Y que cualquier atacante pueda saltarse el sistema y acceder a los datos de cualquier usuario.



Más información:

Password Storage Cheat Sheet

List of Rainbow Tables

El lado humano de las contraseñas

una-al-dia (27/02/2005) La pregunta secreta del caso "Paris Hilton"

una-al-dia (22/09/2008) Ataques "magistrales" de "hackers" mediáticos

una-al-dia (11/03/2006) Teoría y práctica en la seguridad de las contraseñas

una-al-dia (14/10/2011) El culo de Scarlett y el eslabón más débil (I) y (II)

una-al-dia (26/05/2015) Secretos, mentiras y recuperación de cuentas




                                                                                                  
Antonio Ropero
Twitter: @aropero


No hay comentarios:

Publicar un comentario en la entrada