Español | English
rss facebook linkedin Twitter

WhatsApp Account Hijacking

Hace un par de meses tuvimos la oportunidad de dar una charla en la Universidad Europea de Madrid sobre auditorías de aplicaciones móviles. En esa charla, además de comentar de qué manera podríamos auditar una aplicación para teléfonos móviles (con todas las peculiaridades que conlleva), hicimos una demostración sobre una conocida aplicación, que no publicamos en su momento para realizar un "Responsable Disclosure" e informar en primer lugar a la empresa desarrolladora. La vulnerabilidad permitía hacer un Account Hijacking de las cuentas de WhatsApp, y de esta manera poder suplantar a cualquier usuario. Las pruebas fueron realizadas sobre la versión en Android, aunque son perfectamente validas de forma análoga para otras plataformas.

S21sec notificó dicha vulnerabilidad en su momento al equipo de desarrollo de WhatsApp y, según nos confirmaron, ha sido corregida en la versión actual. No obstante, no se ha realizado una auditoría profunda de la aplicación más allá de la prueba de concepto que se realizó como demostración de la charla, por lo que es posible que otras vulnerabilidades similares, o de otro tipo, puedan existir.

La vulnerabilidad detectada tiene que ver con la manera en la que WhatsApp realiza la autenticación inicial para el registro. Cuando instalamos WhatsApp por primera vez en nuestro terminal éste nos solicita que le introduzcamos nuestro número de teléfono y, de alguna forma, él comprueba que el número es correcto y pasa a registrarnos como ese número. A partir de ese momento ya podemos hablar con nuestros contactos.

¿Cómo comprueba WhatsApp que somos realmente el número que decimos ser? Aquí viene el problema, ya que utiliza únicamente mecanismos en el propio terminal, los cuales podrían ser manipulados, como veremos a continuación.



En este video podemos ver en qué consistía el proceso de validación de WhatsApp antes de la corrección de la vulnerabilidad. Para comprobar si el número introducido es correcto, la aplicación de WhatsApp genera un token alfanumérico y construye un SMS de la forma "WhatsApp [Código] WhatsApp internal use - safe to discard" y lo envía al número que el usuario le ha introducido. Si efectivamente es el propio número, el SMS irá hasta el centro de mensajes del operador correspondiente y este volverá al terminal.

En ese momento la aplicación de WhatsApp recibe el SMS y comprueba que el Token recibido es el mismo que el enviado. Si esto es así, eso quiere decir que el número introducido por el usuario es el correcto, y por lo tanto, envía una conexión a WhatsApp registrando el usuario, asignándole una contraseña.

Ahora viene la pregunta: Dado que todo este proceso se realiza en el software instalado en nuestro terminal móvil, y como dueños de este tenemos total control sobre el software que instalamos... ¿podríamos modificar el software de WhatsApp para que simplemente aceptara cualquier número que le introduzcamos como válido?

La respuesta (al menos antes de la corrección de la vulnerabilidad) es SI.

Bucear por el código de WhatsApp resulta un poco complicado, ya que todo ha sido ofuscado para intentar evitar técnicas de Ingeniería Inversa, pero aún así, podemos encontrar ciertos puntos claves en el código, como las llamadas a ciertas APIs, por ejemplo la de envío de SMS.



Si observamos las llamadas que hay en el código a los objetos SmsMessage y SmsManager, veremos un par de zonas del código en las que se contruye un SMS con el número de origen que hemos introducido por teclado y otra donde se lee el número de origen del SMS recibido. Teniendo localizadas estas zonas del código ahora solo nos quedaria cambiar el código de tal forma que, pongamos el teléfono que pongamos al arrancar la aplicación, el SMS sea siempre enviado a nuestro número real, y que cuando este se compruebe, la aplicación crea que el origen es el correcto.



Como podemos ver en la captura anterior, hemos mirado en la definición de la función sendDataMessage() en que parámetro está el número de destino y hemos visto que es el primer parámetro. En este tipo de definiciones, a la que vemos que se le pasa un vector de parámetros (v0 .. v6), el v0 es el puntero al propio objeto (self) y el v1 es el primer parámetro, es decir, el que buscamos, así que si buscamos hacia arriba donde se asigna el valor de la variable v1 vemos que sale de una variable del objeto VerifySms. Como nosotros queremos que envíe el SMS a nuestro propio teléfono independientemente del teléfono que introduzcamos en la aplicación, simplemente comentamos esta linea e introducimos una asignación estática de la variable v1 a nuestro número de teléfono real (marcado con XXXXX en la imagen).

Para la recepción del SMS hacemos el proceso análogo, pero esta vez con la función getDisplayOriginatingAddress() del objeto SmsMessage, en la que cada vez que es llamada, nosotros asignamos estáticamente el valor que queremos a continuación.



Una vez hecho esto, volvemos a empaquetar la aplicación, la instalamos en el móvil y probamos a ver si somos capaces de suplantar la identidad de una persona en WhatsApp:



SI! Parece que esto funciona (o mejor dicho, funcionaba). Esta vulnerabilidad nos ha permitido el robo de cuentas de usuario de WhatsApp. Por suerte, el usuario cuya cuenta es robada vería un mensaje en su pantalla diciendo algo así como "no utilices WhatsApp en más de un teléfono móvil", con lo cual puede darse cuenta que alguien ha conseguido robarle la cuenta, pero aún así se trataba de una vulnerabilidad importante que debía ser corregida.

Para evitar este tipo de incidencias, es recomendable no dar por supuesta la seguridad en ningún tipo de software, aunque este sea un software ampliamente usado y conocido, y en el caso de que se pretenda utilizar un software para manejar información crítica o en un sistema que almacena o procesa este tipo de información, este debería ser auditado por personal debidamente cualificado. El que sea un software ampliamente usado no es en ningún caso una garantía de seguridad.

Jose Selvi
Dept. Auditoría S21sec
Twitter / Blog

7 comentarios:

Anónimo dijo...

Hola,leyendo tu blog en especial el apunete sobre "WhatsApp Account Hijacking" y como poder vulnerar la confirmacion de la cuenta con otro numero, te digo que es posible, algo que probe y funciono, por lo menos en mi Iphone 3gs es poner un chip cualquiera, registrar el whatsapp, cambiar el chip, y sorpresivamente, mis contactos reciben los msj con el anterior numero, es decir que hoy 8/11/2011 no lo corrijieron.

Jose Selvi dijo...

Hola @Anónimo, lo que nos comentas es por otro tema.
Una vez que el número se autentica, se crea una contraseña que se almacenada en el teléfono, con lo que aunque cambies la SIM, la sesión está autenticada entre terminal y servidores de WhatsApp, por lo que da igual la SIM que le metas.

Sin embargo, para hacer esto tienes que poseer la SIM a la que quieres suplantar, o hacer una suplantación de SIM de cara al operador, en cuyo caso poder vulnerar WhatsApp sería el menor de nuestros problemas.

La gracia de la vulnerabilidad es que se puede suplantar un número sin poseer la tarjeta SIM, incluso números que no existen como el 010101010.

deredes.net dijo...

Cuando más usado es un App, más probable es que se detecten vulnerabilidades, estos muy a menudo son lanzados sin previas auditorias, en las cuales detectar anomalías. Muchas gracias por el artículo.

Jose Selvi dijo...

@deredes.net: Totalmente de acuerdo. Muchas de estas aplicaciones se lanzan sin saber el éxito que van a tener, y no se invierte en seguridad en su salida.

Luego cuando ya están en el mercado, se dan cuenta de que el producto tiene graves carencias de seguridad, y ya resulta mucho más complicado de solucionar.

La seguridad y auditoría siempre debería aplicarse desde las fases tempranas del desarrollo, sería mucho más eficiente (y por tanto barato).

Mathy dijo...

Hey, do you know if WhatsApp has fixed this vulnerability? I have checked and it's still sending the same message using sendDataMessage(). Unfortunately I can't easily verify this in the Android emulator.

Jose Selvi dijo...

@Mathy: Officially it's fixed, but we haven't check it out.

Anyway, we found some other weaknesses, so perhaps you could find a new account hijacking vulnerability.

Maybe we will publish it in the future.

sohbet dijo...

están en el mercado, se dan cuenta de que el producto tiene graves carencias de seguridad, y ya resulta mucho más complicado


(+34 902 222 521)


24 horas / 7 días a la semana



© Copyright S21sec 2013 - Todos los derechos reservados


login