martes, 10 de junio de 2014

WhatsApp Authentication: profundizando en WAUTH-1 y WAUTH-2



En esta segunda entrada voy a profundizar en los mecanismos de autenticación de WhatsApp WAUTH-1 y WAUTH-2, ya que el mecanismo de MD5 se dejó de utilizar el 24 de diciembre de 2012.


EN QUÉ CONSISTE WAUTH-1
En WAUTH-1 en el momento de registrar el teléfono en el servicio, cuando recibimos un SMS con un código, se genera un password en los servidores de WhatsApp que será un secreto compartido entre el teléfono y los servidores.

Cuando el teléfono trata de logarse en WhatsApp para recibir o enviar mensajes, los servidores de WhatsApp le envían un challenge de 20 bytes, que junto con el password (secreto compartido) generarán las claves RC4 y HMAC  de la sesión. La forma de autenticarse es que el teléfono cifre con la clave de sesión su número de teléfono concatenado con el challenge enviado por el servidor y concatenado con el timestamp. Los servidores de WhatsApp descifraran el mensaje y verificaran que se compone del numero de telefono, el challenge enviado y un timestamp.

Las claves de sesión RC4 y HMAC son el resultado de usar PKDBF2, con el password (secreto compartido), utilizando el challenge del servidor como salt y SHA1 como función de hash. Se utilizan 16 iteraciones de este algoritmo y los 20 bytes mas significativos del resultado son empleados como clave RC4 (para cifrar la comunicación) y HMAC-SHA1 (para validar la integridad de los mensajes) durante la sesión establecida entre el teléfono y los servidores de WhatsApp.

Al usar la misma password para cifrar los mensajes enviados desde el teléfono hacia los servidores y desde los servidores hacia el teléfono se produce la vulnerabilidad que comentamos en NocOnName 2013, que permitiría revelar las conversaciones de WhatsApp. 

Cuando hicimos nuestra presentación en RootedCON 2014 se empezó a formar un gran revuelo en las redes sociales por que WhatsApp "obligaba" a los usuarios de Android a actualizarse a una nueva versión. En nuestra charla explicamos que es lo que creíamos que se perseguía con esa actualización, que no era otra cosa mas que finalizar el soporte de WAUTH-1 como autenticación y utilizar exclusivamente WAUTH-2 para todas las plataformas.


EN QUE CONSISTE WAUTH-2
WAUTH-2 sigue basándose en un secreto compartido entre el teléfono móvil y los servidores de WhatsApp, el cual se genera en el momento de registrar el teléfono en WhatsApp, pero la forma de generar las claves de sesion de RC4 y de HMAC varía para solventar el problema de usar la misma clave para cifrar las comunicaciones en el cliente y en el servidor. Se sigue utilizando PKBDF2, con el secreto compartido y el challenge enviado por el servidor como salt y también se sigue utilizando como resultado los 20 bytes más significativos. Hasta aquí las partes que continuan igual que el algoritmo anterior.

Lo que cambia es que se utiliza PKBDF2 cuatro veces en lugar de una vez, para generar 4 claves diferentes, se utilizan solo 2 iteraciones del algoritmo en lugar de las 16 anteriores. Cada vez que se llama a PKBDF2 se concatena al final un byte al challenge, la primera vez se concatena el byte 0x01, la segunda 0x02 y así sucesivamente hasta completar las 4 llamadas.

De esta forma se generan cuatro claves diferentes:
  • La primera clave se utiliza para cifrar y descifrar, mediante RC4, las conversaciones desde el teléfono hacia los servidores de WhatsApp.
  • La segunda clave se utiliza para validar la integridad de los mensajes enviados desde el teléfono hacia los servidores de WhatsApp mediante HMAC-SHA1.
  • La tercera clave se utiliza para cifrar y descifrar, mediante RC4, las conversaciones desde los servidores de WhatsApp hacia el teléfono.
  • La cuarta clave se utiliza para validad la integridad de los mensajes enviados desde los servidores de WhatsApp hacia el teléfono mediante HMAC-SHA1.

Otro punto que cambia es que a la hora de calcular el HMAC-SHA1 de los mensajes, se concatenan cuatro bytes al final del mensaje con el número de mensaje. Esto es si el mensaje que vamos a mandar es el tercero que intercambiamos se concatenan los bytes 0x00 0x00 0x00 0x03 al final del mensaje antes de calcular el HMAC-SHA1.

Pablo San Emeterio