Vulnerabilidad en Instagram (Friendship Vulnerability)

Introducción

[Extraído de la Wikipedia]

Instagram es una aplicación gratuita para compartir fotos con la que los usuarios pueden aplicar efectos fotográficos como filtros, marcos y colores retro y vintage y compartir las fotografías en diferentes redes sociales como Facebook, Twitter,Tumblr y Flickr. Una característica distintiva de la aplicación es que da una forma cuadrada y redondeada en las puntas a las fotografías en honor a la Kodak Instamatic y las cámaras Polaroid.

La aplicación fue diseñada para iPhone y a su vez está disponible para sus hermanos iPad y iPod con el sistema iOS 3.0.2 o superior pudiéndose descargar desde el App Store y desde su página web.

Vulnerabilidad

Se ha detectado una falta de control en la lógica utilizada para procesar el proceso de autorización aplicado a las peticiones de amistad. Permitiendo a un usuario malintencionado perpetrar un ataque de fuerza bruta para añadirse como amigo a cualquier cuenta de la aplicación de Instagram.

Siendo posible acceder a las imagénes tomadas por los usuarios de la aplicación y a la información publicada en su perfil. Así mismo, se ha comprobado que esta vulnerabilidad afecta también a aquellos usuarios cuyo álbum es privado, permitiendo tener acceso a las fotografías almacenadas en él.

Explotación

Cuando se accede al perfil de un usuario, la petición generada por la aplicación al servidor es la siguiente:

GET http://instagram.com/api/v1/users/USER_ID/info/ HTTP/1.1

Donde se pasa como parámetro distintivo el USER_ID y a partir de ahí se van generando las llamadas a la api. En el caso de la vulnerabilidad, para llegar a explotarla se decidió generar una petición de amistad legítima.

El aspecto que presenta la aplicación cuando esto sucede es el siguiente:

La petición para aceptar la petición de amistad es la siguiente:

POST http://instagram.com/api/v1/friendships/approve/USER_ID/ HTTP/1.1

Y además de la cookie con información sobre la sesión del usuario identificado en la aplicación, se envía el siguiente parámetro

signed_body=d3e7a3eda18825318482b0f5866c7bbaba4fe...........%7B%22user_id%22%3A%22USER_ID%22%7D

Dándole un vistazo, parece ser algún tipo de hash generado que otorga validez a la petición de amistad realizada por el usuario cuyo USER_ID también es enviado en la propia petición.

Por otro lado la petición de rechazar amistad, presenta el siguiente aspecto:

POST http://instagram.com/api/v1/friendships/ignore/182383487/ HTTP/1.1
...
signed_body=d3e7a3eda18825318482b0f5866c7bbaba4fe........%7B%22user_id%22%3A%22USER_ID%22%7D

Únicamente cambia la llamada a la API que se realiza, utilizando el método de ignore en lugar de approve.

Teniendo en cuenta esto, la primera prueba que se realizó fue ver si era posible realizar enumeración de usuarios y obtener aquellos datos publicados en su perfil.

Permitió obtener la siguiente información:

  • Un campo status, supongo que con información relevante hacia el estado de la cuenta.
  • Un array de nombre user, que a su vez posee los siguientes campos: {username – media_count – following_count – profile_pic_url – biography – full_name – follower_count – pk -is_private – external_url} (todos bastante descriptivos por su nombre).

Sabiendo la posibilidad de realizar esta enumeración de usuarios (que resulta ser una feature de la API) el siguiente paso fue hacer la prueba de si el hash generado para la petición de amistad legítima, podría ser utilizada para engañar al servidor y obligar a que todos los usuarios de la aplicación, automáticamente sin su conocimiento, fueran agregados como seguidores de nuestro perfil.

El resultado generado fue el siguiente:

Donde se puede apreciar que nuestro vector de ataque ha tenido éxito, y la petición devuelta por el servidor está compuesta por los siguientes parámetros:

  • Un campo status, supongo que con información relevante hacia el estado de la amistad.
  • Un array de nombre friendship_status, que a su vez posee los siguientes campos: {incoming_request – followed_by – outgoing_request – following – blocking – is_private} (todos bastante descriptivos por su nombre).

El resultado antes y después de hacer las pruebas:

 

¿Cuál puede ser el alcance de este fallo? Basta con darnos un paseo por el twitter de celebridades de Hollywood, famosos, presidentes del gobierno, etc. Acceder a su perfil de Instagram, obtener su ID de usuario y automáticamente explotar esta vulnerabilidad.

Independientemente de que su perfil sea privado, obtendremos acceso a sus fotos. Un ejemplo de esto:

Y como somos buenas personas y estamos de buen rollo. Vamos a felicitarle por la nueva adquisición.