lunes, 14 de abril de 2014

Crash remoto de WhatsApp para iPhone en versiones < a 2.11.7


Como todos sabéis, el los últimos meses, tanto Pablo como yo, hemos estado investigando sobre diferentes clientes de mensajería instantánea para móviles, y poniendo el foco sobre WhatsApp.

Entre los diferentes descubrimientos que hicimos, nos dimos cuenta de las inseguridad que presentaba el uso de RC4 en el cifrado de mensajes, la posibilidad de poder modificar el remitente de forma transparente, y mucho más, así que nos planteamos diseñar un programa, que bautizamos como WhatsApp Privacy Guard, que fuera capaz de añadir diferentes capas de seguridad a la aplicación, usando cifrado más seguro, opciones de anonimato o servidores propios de mensajería XMPP.

Mientras estábamos haciendo las diferentes pruebas con el cifrado adicional, además, nos dimos cuenta de que el podíamos generar un crash en la aplicación si el destinatario final de los mensajes con cifrado no estaba conectado al sistema.

Dentro de nuestra presentación WhatsApp: mentiras y cintas de vídeo, del congreso RootedCON, mostramos una prueba de concepto del funcionamiento del programa, en el que podemos observar el intercambio de mensajes a través de nuestra plataforma.

Nuestro programa detecta el envío de un texto en claro en WhatsApp, y utilizando la clave de sesión de RC4, descifrará el mensaje y extraerá el texto. Una vez tenemos este texto, lo cifraremos de nuevo utilizando el algoritmo que hayamos implementado, y lo vuelve a encapsular en el formalo de WhatsApp, utilizando RC4 y su clave correspondiente. Para ello también recalcularemos el HMAC del mensaje:

El proceso en la parte del receptor será el inverso del que acabamos de explicar, para que pueda visualizar el mensaje original. Veámoslo en una demostración real:



El resultado de la recepción de estos mensajes cifrados por parte de un cliente que no esté conectado al sistema, y que por tanto no es capaz de descifrar el contenido del mensaje, inicialmente nos devolvía algo así:

Pero un día nos dimos cuenta que WhatsApp nos es capaz de representar por pantalla la codificación de algunos caracteres no imprimibles, por lo que el cliente sencillamente tendrá un crash cuando abramos alguno de estos mensajes. Esto implica que cuando el receptor intente abrir la conversación donde existe un mensaje de este tipo, el programa automática se cerrará, impidiéndole ver la conversación, por lo que finalmente tendrá que borrarla para recibir mensajes que sea capaz de procesar la aplicación (quizá has puesto un mensaje anteriormente del que te arrepientes y no quieres que finalmente vea :P).

Una muestra de lo que os estoy explicando la podéis ver en el siguiente mensaje:



He publicado el código necesario para enviar este tipo de mensajes en mi repositorio de GitHub, y en la sección de Proyectos de la página.

Necesitaréis tener instalado yowsup, una interfaz de línea de comandos que permite enviar y recibir mensajes de WhatsApp como un cliente de móvil, configurado con una cuenta válida, para poder enviar los mensajes.

Que os divirtáis }:)