lunes, enero 15, 2007

Como escoger contraseñas seguras

Por Bruce Schneier via Wired

“Desde que analice las 34,000 password de MySpace, las personas me han estado preguntando como escoger passwords que sean seguras.

Aparte de esta pieza, se han escrito una cantidad enorme de artículos con este tópico a través de los años – sin embargo la mayoría han sido escritos a modo de sugerencias adquiridas de anécdotas en vez de evidencia analítica.

El ataque que estoy evaluando es realizado con un analizador de contraseñas de manera offline. Este ataque asume que el atacante posee una copia de tu documento encriptado y puede evaluar diferentes passwords tan rápido como pueda. Hay instancias en que este ataque no tiene sentido. Tarjetas ATM por ejemplo, son seguras aunque solo posean un PIN de 4 dígitos, debido a que no se puede hacer predicción de password de manera offline.

Los password guessers se han vuelto increíblemente rápidos e inteligentes. AccessData vende Password Recovery Toolkits, (le llamaremos de ahora en adelante PRTK). Dependiendo del software que se esté atacando, los PRTK pueden probar cientos de miles de passwords por segundo, y prueba las passwords más comunes antes que las mas extrañas.

Por tanto, la seguridad de tus passwords depende de 2 cosas principalmente: Cualquier detalle del software que pueda ralentizar el proceso de adivinar el password, y en que orden los programas como PRTK, prueban con las diferentes passwords posibles.

Algunos software incluyen rutinas que deliberadamente están diseñados para que el obtener una password por brute forcing, sea más lento. Los buenos programas de encripción no usan tu password como la clave de encripción; existe un proceso que convierte tu password en la clave de encripción. Y el software puede hacer este proceso tan lento como se desee.

Los resultados están por todos lados. Microsoft Office, por ejemplo, funciona con una muy simple conversión del password al key de encripción. De esta forma un PRTK puede probar 350,000 passwords de Microsoft Word por segundo, en una maquina con un Pentium 4 a 3 GHZ. Winzip solía ser peor, alrededor de 1 millon de password por segundo para su versión 7.0. Pero en la nueva version 9.0 fue mejorado y solo se pueden probar con esta configuración unas 900 password por segundo.

Cuando se ataca programas que ralentizan el proceso deliberadamente, es importante que cada posible intento de obtener la contraseña cuente. Un simple ataque de 6 caracteres en minúscula, “aaaaaa” hasta la “zzzzzz”, tiene más de 308 millones de combinaciones. Y generalmente es improductivo por que el programa se pasa la mayoría del tiempo comprobando passwords como “kwmjtv”

De acuerdo con Eric Thompson de AccessData, una password típico consiste en una raíz además de caracteres adicionales o un anexo. La raíz necesariamente no es una palabra del diccionario, pero si algo pronunciable. Los caracteres adicionales, normalmente son un sufijo en el 90% de los casos, o un prefijo en el 10% de los casos.

De esta forma los ataques PRTK están pensados y diseñados para probar un diccionario con las 1,000 passwords más comunes, como por ejemplo “letmein”, “password1”, 123456, etc. Luego prueba cada una de estas con los sufijos mas comunes como: “1”, “4u”, “69”, etc. Y créanlo o no, esto recobra el 24% de las passwords con estas 100,000 posibles combinaciones.

Luego, el PRTK atraviesa una serie de diccionarios de raíz cada vez más complejos, así mismo con los diccionarios de los caracteres adicionales. Estos diccionarios de la raiz incluyen:

  • Palabras del diccionario común: 5,000 entradas
  • Diccionario de nombres: 10,000 entradas
  • Diccionario extenso: 100,000 entradas
  • Diccionario de patrones fonéticos: 1/10,000 de una búsqueda exhaustiva de un carácter.

El diccionario de patrones fonéticos es interesante. No es realmente un diccionario; es una rutina Markov-Chain, que genera palabras pronunciables en ingles de una longitud determinada. Por ejemplo, PRTK puede generar y probar cadenas de caracteres con facilidad de pronunciación de 6 caracteres. O casi impronunciables cadenas de caracteres de 7 caracteres de longitud. Actualmente están trabajando en futuras generaciones de estas rutinas para otros lenguajes.

PRTK también ejecuta una búsqueda exhaustiva de palabras de 4 caracteres. Corre todo el diccionario con minúsculas (la más comunes), mayúscula en la primera letra (segunda más común), todas mayúsculas y final mayúscula. Adicionalmente corre el diccionario con las más comunes sustituciones: $ por s, @ por a, 1 por L, y así sucesivamente.

El diccionario de anexos incluye lo siguiente generalmente:

  • Todas las combinaciones de 2 dígitos
  • Todas las fechas de 1900 al 2006
  • Todas las combinaciones de 3 dígitos
  • Todos los símbolos individuales
  • Todos los 1 dígitos más un símbolo
  • Todas las combinaciones de 2 símbolos.

El secreto de AccessData y de cualquier programa de este tipo es es el orden en que prueba con las diferentes combinaciones raíces y diccionario de anexos. La investigación de la compañía indican que la mayoría de las contraseñas están entre 7 y 9 caracteres, más un anexo, y que es mucho más fácil para alguien escoger una raíz difícil de adivinar que un anexo no muy común.

Normalmente, PRTK, corre en redes de computadoras. El brute force de contraseñas es trivialmente una tarea distribuible, y puede correr fácilmente en el background. Una gran organización como el servicio secreto, puede fácilmente tener cientos de computadoras tratando de descifrar la contraseña de alguien. Una compañía llamada Tableau esta construyendo un Hardware FPGA especializado para acelerar el proceso en programas como PGP, o winzip: hablan aproximadamente de un incremento de 150-300 veces.

Que tan bueno es todo esto? Erico Thompson estima que de un par de semanas a 1 mes de tiempo, su software puede romper de 55 al 65 % de todas las contraseñas. Estos resultados son buenos, pero no extraordinarios.

Esto es asumiendo que no se tiene ninguna información biográfica de la victima. Cuando se puede, AccessData reúne cualquier información personal del individuo antes de empezar. Si tiene acceso a otras contraseñas, se puede hacer predicciones de que tipo de contraseña el sujeto utiliza. Que tan grande es la raíz? Que tipo de raíz? El anexo lo coloca al inicio, o al final de la contraseña? Usa substituciones?, Zip codes? Etc. Así mismo como direcciones, nombres de una lista de contacto, otras contraseñas, o cualquier tipo de información personal puede ser utilizada. Esta información puede incrementar el porcentaje de éxito de la operación, pero más importante reduce el tiempo de hallar la contraseña de semanas, a días o quizás horas.

Entonces, si deseas que tus contraseñas sean difícil de descifrar, debes escoger una contraseña que no este en la lista de raíz ni anexos. Debes mezclar caracteres en minúsculas y mayúscula en la mitad de la raíz. Debes añadir números y símbolos en la mitad de la raíz, y no como sustituciones comunes. O en dado caso, insertar el anexo en la mitad de la raíz. O mejor aún, utilizar dos raíces unidas con un anexo.

Así mismo, una contraseña formada por las primeras letras de una oración se puede considerar bastante segura, especialmente si se utilizan números y símbolos. Y sí, las contraseñas van a ser difícil de recordar; es por esto que se deberían utilizar programas como Password Safe, que es gratis y open source. (PRTK solo puede probar 900 contraseñas de Password Safe 3.0 por segundo.)

Aún así, nada de esto realmente importa. AccesData vende otro programa, Forensic Toolkit, que entre otras cosas, escanea el disco duro completo en búsqueda de cada una de las cadenas de caracteres imprimibles. Busca en los documentos, el Registry, en los emails, archivos swap, hasta espacios borrados del disco duro... En todos lados. Con toda esta información crea un diccionario y se lo sirve de entrada al PRTK. AccesData asegura que quebranta el 50 por ciento de las contraseñas solo utilizando este diccionario.

Por que es tan efectivo este diccionario?

Lo que ocurre, es que Windows y los manejadores de memoria del propio sistema operativo a medida que van operando, van dejando mucha información asequible. Por ejemplo, si uno escribe una contraseña para acceder un programa, este generalmente es automáticamente almacenado en alguna posición de memoria. Entonces, ocurre lo siguiente: cuando el Windows se queda sin espacio en memoria RAM, utiliza la llamada memoria virtual, que es un espacio alocado en el disco duro, llamado swap file. En este espacio el Windows pasa data que no este siendo utilizada en el momento desde la memoria RAM hacia el disco, para atender a los nuevos requerimientos de espacio en memoria de alguna otra aplicación que la solicite. Luego debido al propio funcionamiento del File System de Windows, que para eliminar una archivo, lo que se realiza es eliminar la entrada del índice FAT o NTFS, dejando realmente el archivo intacto en el disco (Esto es como, si quitáramos una entrada del índice de una guía telefónica, la entrada realmente permanece en la guía, pero las personas no la encontrarían. A menos claro que se esforzaran un poco mas y buscasen en cada una de las paginas, o cuando otra entrada sea apuntada en la posición de la anterior.).

Esto mismo ocurre con nuestro Swap File, y toda la información de los programas que está contenida en memoria, la cual creemos que está segura, esté grabada posiblemente permanentemente en algún lugar remoto de nuestro disco duro, esperando a que alguien se esfuerce un poquito en accesarla. Linux y Mac OS tampoco se escapan de este posible problema.

Debo señalar que esto que hemos estado hablando hasta ahora, no tiene nada que ver con el algoritmo de encripción o el length de la llave. Un débil algoritmo de 40-bit no hace este tipo de ataque más fácil, y uno de 256-bit no lo hace más difícil tampoco. Estos ataques simulan el proceso del usuario entrando la contraseña, es por esto que el tamaño (de la llave :P) realmente no importa.

Por años, he dicho que la manera más fácil de romper un producto criptográfico nunca es en la mayoría de los casos rompiendo el algoritmo, a pesar de que casi invariablemente existe un error de programación que permite pasar de un lado por las matemáticas y romper el producto. Un hecho similar está ocurriendo aquí. La manera más fácil de adivinar una contraseña no es adivinación para nada, sino explotar la inherente inseguridad en el sistema operativo que trabaja debajo.

- -

Bruce Schneier es el CTO BT Counterpane y autor de numerosos libros sobre seguridad


Noticia traducida de la original publicada en ingles en Wired

1 comentario:

Witilongi dijo...

Es bueno saber sobre la seguridad de las contraseñas ya que necesitas una para cada cosa en la que tengas cuenta. Me he apuntado lo del Password Safe a ver qué tal va.