domingo, 23 de enero de 2011

Adivinando Nombres de Usuario

Muchos seguramente hemos visto la pelicula: el criminal informático intenta con mucha paciencia millones de combinaciones tratando de adivinar la contraseña de nuestra cuenta de correo/banca en linea/Manejador de Contenido/etc. A, B, C, ... , AA, AB, AC, ... SEU, SEV, SEW, ... Por supuesto, esto puede tomar muchísimo tiempo. Para acelerar el proceso, el criminal informático puede intentar contraseñas de una forma más inteligente, con palabras de diccionario, fechas de cumpleaños, etc. Aún así, esta técnica requiere una buena dosis de suerte y paciencia para ser exitosa.

Sin embargo, el criminal informático siempre encuentra nuevas vías de ataque, incluso en los detalles menos sospechados. De hecho, en muchos casos, el criminal no necesita intentar adivinar nuestra contraseña sino mas bien nuestro nombre de usuario/login/nombre de miembro/etc. Yo me atrevería a decir que esta técnica es incluso más efectiva que la anterior. La razón es simple. Si me pidieran encontrar en un grupo de personas alguien que tenga la misma fecha de cumpleaños que yo, no sería algo facil. Sin embargo, si me piden que encuentre cualquier par de personas con el mismo cumpleaños, mis posibilidades de exito aumentan grandemente. Este resultado sorprendente y contraintuitivo se conoce como la paradoja del cumpleaños.

Exactamente el mismo principio se encuentra detrás de la técnica de adivinar nombres de usuario. En lugar de intentar adivinar la contraseña de un usuario específico, el criminal selecciona cualquier password "frecuente", e intenta todos los posibles nombres de usuario del sistema. Supongamos que en el sistema hay registrados 1 millon de usuarios, ¿cuantos usuarios habrán seleccionado como password la fecha de nacimiento de su hijo 4885? por ejemplo. ¿Que tal si intentamos todos los días del mes más popular de un año? En una poblacion de 1 millon de personas, muy probablemente muchas compartan el cumpleaños. Las posibilidades de éxito del atacante usando un password que se considera debil (fecha de cumpleaños) aumentan considerablemente.

Sólo queda un pequeño detalle por especificar. ¿De dónde saca el atacante los nombres de usuario? Esta tarea puede ser casi tan difícil como adivinar las contraseñas de la técnica de la escuela vieja. Sin embargo, nuestro atacante corre con muchisima suerte en aquellos sistemas que usan nombres de usuarios predecibles. Este tipo de sistemas son lamenteblamente demasiado frecuentes en sistemas de banca en linea como explicamos en nuestro articulo "Inseguridad Bancaria Online, parte I". Si adicionalmente la contraseña es de sólo 4 dígitos, la tentación para el usuario de utilizar su fecha de cumpleaños es demasiado grande, y el atacante obtiene aún más información para seleccionar sus contraseñas fijas. En consecuencia, las posibilidades de conseguir al menos un par de credenciales correctas se incrementan de manera muy considerable.

Pero, ¿Qué puede hacer un criminal informático con tan sólo un par de credenciales de acceso a la banca en linea? La respuesta a esta pregunta será el tema de proximos articulos.

1 comentario:

  1. Excelente, podemos entonces extrapolar la paradoja del cumpleaños para un sistema que solo pida 4 digitos como contraseña, que seria el equivalente a 9999 dias. Lo primero que viene a la mente es que con 9999 contraseñas deberiamos tener una probabilidad del 100% de conseguir una colision. Pero si aplicamos la paradoja del cumpleaños tenemos que con solo 302 cuentas ya alcanzamos un 99% de probabilidad.

    Basta con ver los algoritmos que muestan en la wikipedia y modificarle el numero de dias, usando este codigo en python nos da:

    print 'Num. probabilidad'
    p = 1.0
    for i in xrange(1, 310):
    p = p * (9999 - i) / 9999
    print '%3d : %10.6f' % (i, 1-p)


    .
    .
    .
    295 : 0.987846
    296 : 0.988206
    297 : 0.988556
    298 : 0.988897
    299 : 0.989229
    300 : 0.989552
    301 : 0.989867
    302 : 0.990173
    303 : 0.990471
    304 : 0.990760
    305 : 0.991042
    306 : 0.991316
    307 : 0.991583
    308 : 0.991842
    309 : 0.992094

    ResponderEliminar