En esta ocasión voy a mostrarles rápidamente un problema bastante preocupante.
Se trata de un método para poder averiguar de manera simple y rápida si ciertas direcciones de e-mail le corresponden a usuarios de Facebook o no.
La red social, al igual que cualquier proveedor de servicios web, posee la opción de recuperar el acceso a nuestra cuenta si nos olvidamos nuestro password.
Al entrar al sector de recuperación, nos aparece el siguiente formulario:

Al introducir nuestra cuenta de e-mail, el sistema confirma nuestra identidad mediante un CAPTCHA y si todo sale bien, el proceso seguirá mediante el reseteo de password.
Qué pasa entonces si introducimos un email que NO esté registrado con Facebook? El sistema nos mostrará un error, de la siguiente forma:

Si quisiéramos seguir intentando recordar con que dirección de e-mail estamos registrados en la red social, el sistema nos permitirá volver a intentar la cantidad de veces que sea necesario.
Esto puede resultar cómodo para el usuario, pero representa una gran falla de seguridad al permitirle a un atacante averiguar si una dirección de e-mail en particular corresponde a un usuario activo de Facebook o no.
Lo único que el atacante debe hacer es intentar una y otra vez con las diferentes direcciones que necesite corroborar, y según el resultado (error o no) sabrá si corresponde o no a un usuario de la red social.
Para una cantidad limitada de cuentas de e-mail esta puede ser una tarea simple, pero cuando se tiene una base de datos de miles de direcciones, se torna imposible.
Cómo se puede simplificar esta tarea?
Simple.
Resulta ser que la tarea del envío de la dirección de e-mail al motor de reseteo de cuentas se puede automatizar.
Mediante el uso de una URL específica, que incluya en su contenido a una variable con la dirección de e-mail, podemos enviarle la información deseada al motor de reseteo de cuentas de manera masiva.
Aquí hay 2 resultados diferentes, uno con error y uno sin error, obtenidos luego del envío de información al motor a través de la URL en cuestión:


Lo único que debemos realizar es armar un simple script que realice las siguientes tareas:
- Tomar las direcciones de e-mail desde una base de datos (o un simple archivo de texto), una por una
- En cada iteración, incluir la dirección de e-mail en la URL y le envíe la petición al servidor web
- Obtener el documento HTML de respuesta del servidor y busque la palabra “Incorrect”
- Si la palabra aparece, marcar la dirección en la base de datos como inexistente (o directamente eliminarla)
- Si la palabra NO aparece (significa que dicha dirección corresponde a un usuario válido), marcar en la base de datos como existente
Luego de que el script finalice, tendremos una segunda base de datos de e-mails, pero esta lista habrá pasado por un “filtro de existencia en Facebook”.
Esta nueva lista se podría usar para realizar ataques de ingeniería social basados en Facebook, como ser e-mails que notifiquen supuestos mensajes enviados por otros usuarios, o invitaciones a eventos, o peor aún… recomendaciones de links.
Es importante aclarar que este mismo problema ocurre en Twitter:

Cómo se puede solucionar este problema?
Simple. Existen 2 métodos válidos:
1) Configurar al motor de reseteo de password para que envíe mensajes genéricos al usuario que desea resetear su password, como es el ejemplo de LinkedIn:

2) Agregar un paso de seguridad extra, al incorporar el uso de CAPTCHAs en el proceso de reseteo, como en Gmail:

Ambos métodos son muy fácilmente implementables, y solucionarían al 100% este tipo de ataque.