Facebook soluciona una vulnerabilidad que permitía tomar el control de cualquier cuenta

De nuevo estamos ante un fallo de seguridad en Facebook que podría hacer que un atacante tomase el control de cualquier cuenta. Hace unos meses vimos cómo, aprovechándonos de un error en el procedimiento de restablecimiento de contraseñas, se podía cambiar la contraseña de cualquier usuario de Facebook sin conocer la anterior, lo que en la práctica llevaría  a acceder a cualquier cuenta.

En esta ocasión, el procedimiento para acceder a cualquier cuenta de esta red social era un poco más elaborado, pero igualmente exitoso. Antes que nada hay que resaltarque esta vulnerabilidad ya se encuentra solucionada gracias a que el investigador Nir Goldshlager, quien la descubrió, avisó a los desarrolladores de Facebook para que tomaran las medidas pertinentes, algo que le honra.

Con respecto al fallo en sí, este se resume en la obtención de los tokens de acceso de los usuarios cuando estos acceden a una web (usando cualquier navegador), sin necesidad de que las víctimas tengan instalada ninguna aplicación en concreto. Al conseguir estos tokens, el atacante podría acceder sin restricciones a las cuentas comprometidas hasta que la víctima cambie su contraseña.

Según ha publicado este investigador en su web, OAuth se usa en Facebook para realizar comunicaciones entre las aplicaciones y los usuarios. Normalmente, los usuarios deben permitir/aceptar la petición de la aplicación para acceder a su cuenta antes de que esta comunicación se realice. Hemos de tener en cuenta que cada aplicación de Facebook puede pedir permisos diferentes.

De esta forma podemos encontrar aplicaciones como Diamond Dash o Texas Hold’em Poker, que solo tienen permisos para acceder a nuestra información básica o publicar en nuestro muro. Este investigador encontró una forma de obtener permisos completos (leer nuestros mensajes, gestionar nuestras páginas, añadir fotos privadas, vídeos, etc.) en la cuenta de la víctima sin que este tenga ninguna aplicación instalada.

nadia oauth diamond dash

Si analizamos una dirección URL de una comunicación OAuth vemos que tiene este aspecto.

https://www.facebook.com/dialog/oauth/?app_id=YOUR_APP_ID&next=YOUR_REDIRECT_URL&state=YOUR_STATE_VALUE &scope=COMMA_SEPARATED_LIST_OF_PERMISSION_NAMES

Observamos varios campos en los que se ha de incluir un valor. El campo APP_ID representa el identificador de la aplicación, siendo este un identificador único para cada una de ellas. Por ejemplo, para la aplicación Diamond Dash el app_id=2 y para Texas Hold’em Poker sería el app_id=3.

El siguiente parámetro NEXT=REDIRECT_URL solo acepta el dominio del propietario de la aplicación. De esta forma, para la aplicación Texas Hold’em Poker solo valdría el dominio zynga.com como válido (p.ej. next=http://zynga.com). Si el dominio no se corresponde en ese parámetro, Facebook bloqueará esa acción tal y como vemos a continuación.

facebookblockzynga

Facebook realiza una comprobación entre el parámetro app_id y el parámetro next, enviando también un token de acceso usando una petición GET al propietario de la aplicación una vez que el usuario ya le ha concedido permiso.

A partir de esta información, el investigador se dedicó a intentar cambiar el parámetro que se había de incluir en el parámetro next a un dominio de su elección sin que Facebook bloqueara esta acción. De esta manera averiguó que, usando un subdominio como xxx.facebook.com, la acción se le aceptaba como válida.

No obstante, si se intenta acceder a alguna carpeta o fichero en este tipo de subdominio x.facebook.com (x.facebook.com/xx/x.php), Facebook lo bloqueaba. Fue entonces cuando se dio cuenta de que facebook.com usa una almohadilla (#) y un símbolo de exclamación en su dirección URL de la siguiente forma: x.facebook.com/#!/xxxx.

Tras varias pruebas, el investigador comprobó cómo Facebook no consideraba como válido esta dirección dentro del parámetro next (next=x.facebook.com/%23!/). No obstante, si introducía algo entre la almohadilla y el símbolo de exclamación (%23x!), Facebook no lo bloqueaba.

A pesar de esto, si introducimos una dirección del tipo https://beta.facebook.com/#xxx!/messages/ esta acción no se trata de la misma forma que si incluimos los símbolos #! y no nos redirigirá a la pantalla de mensajes. A partir de aquí el investigador empezó a probar diferentes combinaciones de caracteres hasta que descubrió un par que funcionaba en todos los navegadores:
%23~!

%23%09!

Este truco servía para subdominios de Facebook como pudieran ser touch.facebook.com/#%09!/,m.facebook.com/#~!/ o cualquier otro dominio de Facebook mobile o Touch). De esta forma se podría redirigir a un usuario a  cualquier archivo o directorio existente en un subdominio de Facebook. En este punto, el investigador creó una aplicación de Facebook que redirigiera a un usuario a una web externa, acción que le permitiría obtener el token de acceso del usuario.

De esta forma se puede redirigir al usuario a una aplicación maliciosa que, a su vez, redirige a un enlace externo donde se captura y se almacena el token de acceso de la víctima. Por defecto, las aplicaciones solo cuentan con una serie de permisos básicos pero se pueden cambiar y añadir que soliciten nuevos permisos, aunque este método tiene sus limitaciones, ya que se requiere que el usuario acepte todos los permisos.

allowthisaction

Esto no parecía lo suficientemente poderoso para este investigador, por lo que intentó conseguir permisos totales (lectura de los mensajes, envío de mensajes, gestión de páginas, acceso a fotos y vídeos privados, etc.) en la cuenta de la víctima sin tener que instalar ninguna aplicación.

De ahí surgió la idea de utilizar un identificador de aplicación diferente al que viene asociado por defecto, por ejemplo el de Facebook Messenger. La pregunta es, ¿necesita un usuario aceptar como aplicación permitida a Facebook Messenger en su cuenta de Facebook? La respuesta es que no.

Esto es debido a que existen aplicaciones incluidas en Facebook que no requieren de los permisos de los usuarios, contando estas aplicaciones con un control total de nuestra cuenta.

expiresscopes

Gracias al análisis de este investigador y al haber informado a los responsables de la seguridad de Facebook, este fallo ya se encuentra solucionado. Es importante destacar la labor desinteresada buscando vulnerabilidades que realizan muchos investigadores y agradecer su esfuerzo en hacer de nuestros sistemas e Internet un lugar más seguro.

Josep Albors

Nuevo ESET Endpoint Security para dispositivos Android en entornos corporativos