Telegram Passaport podría ser inseguro

Scratch informa sobre inseguridades en el cifrado punto a punto de este servicio.

Telegram Passaport podría ser inseguro

Telegram passport es un nuevo servicio lanzado por telegram, como de
costumbre usa los servidores de su nube para guardar los datos(privativos) y luego existen unos cuantos SDKs libres para usar este servicio. Aunque, como este servicio es para subir datos personales (DNI, pasaporte, domicilio ...), Telegram ha hecho que este servicio use tecnología E2E, es decir, que los datos guardados en la nube están totalmente cifrados y solo el usuario con su contraseña puede acceder a ellos.

Pero como comenta Scratch en un post en la web Habr,
puede que la implementación que ha hecho Telegram de esta tecnología sea bastante insegura. Como de costumbre telegram ha usado sus propias herramientas en vez de usar estandares como HMAC, pero parece que esta vez si ha metido la pata.

¿Como funciona el E2E de Telegram Passport?

Subida de datos:

  1. Se cifran localmente (En el movil, PC, etc del usuario) los datos personales y los metadatos en formato JSON.
  2. Se suben los datos cifrados a la nube de Telegram.

Obtención de los datos

  1. El cliente baja los datos de la nube.
  2. Se descifran los datos a través de una contraseña.
  3. Se recifran los datos con la llave publica RSA de 2048 bits del servicio que solicita los datos.
  4. Se envían los datos cifrados al servicio.

Algoritmo de cifrado

Lo primero que realiza es añadirle un salt delante y detrás de la contraseña para luego generar un hash SHA-512 de esta. Aquí encontramos el primer problema, ya que a día de hoy, a estos hash ya se le pueden realizar ataques de fuerza bruta viables, de hecho si suponemos que la contraseña es de 8 caracteres, con 100 GPUs se tardaría más o menos una semana. Parece difícil tener 100 GPUs, aun hay que destacar que las granjas de estas son más comunes gracias a las criptomonedas.

Luego se genera una clave casi aleatoria, ya el algorimo se asegura que el modulo de la llave por su suma de bits, equivalga a 239. Este diseño permite calcular la cantidad de bits, pero con muchos falsos positivos, en un ataque de fuerza bruta. Por otro lado, usan una función para generar la clave, que es pseudoaleatoria. Finalmente cifran esta clave con el hash de la contraseña antes obtenido.

A continuación, se mezcla los datos no cifrados con un paddin de entre 32 a 255 Bits. Para despues generar un hash Sha256 de estos datos, concatenarlo a la clave casi aleatoria y generar asi la llave de cifrado.

Finamente, se cifran los datos con AES, para así trasmitir a la nube lo siguiente: Hash de los datos personales mezclados con bits aleatorios, las clave semialeatoria cifrada, el salt y los datos cifrados.

Algoritmo de comprobación

Para comprobar que la clave de descifrado es correcta, se comprueba el primer bit de alineación, debido a que sera siempre la misma porque está en formato JSON. Esto acelera un ataque por fuerza bruta.

El ataque de fuerza bruta

Scratch plantea:

Generar un hash de la contraseña y salt; intentar descifrar la clave, filtrando las contraseñas invalidas por la cantidad de bits; Generar la llave de cifrado; y por último, comprobar si es correcta.