4 ago. 2018

Debilidades en el nuevo servicio Telegram passport

El 26 de julio, Telegram anunció el lanzamiento de Telegram Passport, diseñado para encriptar la información de identificación personal de los usuarios y permitirles compartir sus datos de identificación con terceros, tales como ofertas iniciales de monedas ICOs, cripto monederos y cualquier persona que cumpla con conozca a su cliente (KYC).

Los datos de los usuarios se guardan en la nube de Telegram mediante encriptación de extremo a extremo (E2E), y posteriormente se trasladan a una nube descentralizada, que no puede descifrar los datos personales ya que se considera "ruido aleatorio". Sin embargo, en su investigación reciente Virgil Security planteó preocupaciones sobre la protección de contraseñas en el servicio.

Como de costumbre usa los servidores de su nube para guardar los datos privados de los usuarios 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.

La recientemente lanzada herramienta de autorización de identificación personal Telegram Passport de la aplicación de mensajería Telegram es vulnerable a los ataques de fuerza bruta, según un informe del 1 de agosto del desarrollador de software y servicios criptográficos Virgil Security, Inc.
Como comenta el usuario Scratch en otro post en la web Habr (en ruso), puede que la implementación que ha hecho Telegram de esta tecnología sea 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:
  • Se cifran localmente (En el movil, PC, etc del usuario) los datos personales y los metadatos en formato JSON.
  • Se suben los datos cifrados a la nube de Telegram.
Obtención de los datos
  • El cliente baja los datos de la nube.
  • Se descifran los datos a través de una contraseña.
  • Se recifran los datos con la llave publica RSA de 2048 bits del servicio que solicita los datos.
  • 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. En 2018 se pueden romper 1.5 billiones de hashes SHA-512 por segundo.

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.

Utilizar el ataque Padding Oracle contra Telegram Passport

Este blog inglés, explica cómo aprovechar el Padding customizado de Telegram Passport junto con AES-CBC para vulnerar servicios de terceros. No explica una vulnerabilidad directa contra los servicios de Telegram.

En el momento en el que el cliente comparte su información con un servicio de un tercero, es cuando se emplea este método.

La especificación envuelve 3 entidades:
  • Usuarios finales.
  • El servidor de Telegram Password donde se guarden los documentos.
  • El servicio que reciba los datos.
La atención recae sobre la tercera entidad, además del mecanismo de descifrado implementado por el tercero. Esta interacción se ve definida dentro del post dónde se explica en detalle cómo funciona.

El documento con las credenciales del usuario está cifrado con AES256-CBC, haciendo que sea en cierto modo maleable. Durante el cifrado, el cambio de un solo bit al texto cifrado puede causar una corrupción total del bloque correspondiente de texto plano, invirtiendo el bit en el siguiente bloque de texto plano mientras el resto permanecen intactos.

Lo mencionado anteriormente, hace que el modo de implementación de CBC sea vulnerable a los ataques Padding Oracle. En caso de que puedas dar textos cifrados y saber si son descifrados a algo válido, puedes descifrar cualquiera de ellos.

El Padding costumizado de Telegram hace un padding de los datos eligiendo números aleatorios entre 32 y 255 para hacer el payload un múltiplo de 16. El primer número del Padding contiene la cantidad de bytes que se han usado para realizarlo, incluyéndose a sí mismo.

Antes de continuar con la explicación, es importante recordar que Telegram manda a desarrolladores a comprobar si el hash de SHA-256 de los datos paddeados concuerdan con los del hash proporcionado por el payload del JSON EncryptedCredential. Esto hace el ataque ineficaz, aunque si los desarrolladores de otros servicios no comprueban esto el ataque es perfectamente posible.

En el siguiente escenario, el servicio de un tercero recibirá este objeto JSON cifrado y realizará los siguientes pasos:
  1. Descifrar el secret-payload con su clave privada.
  2. Calcular la clave y el IV.
  3. Descifrar los datos del payload.
  4. Hacer un unpad del texto plano de los datos.
  5. Leer los datos del JSON y reportar en caso de errores.
Para poder vulnerar el sistema, se necesita hacer un bitflip bit por bit del texto cifrado de izquierda a derecha. Esto sería equivalente a hacer un XOR de 255.

Al realizar esto, corrompemos los datos del JSON haciendo que lance un error al llegar al final. Esta aproximación funciona con falsos positivos, cuando el texto llegue a un error de Padding, se hace otro test con el mismo byte pero cambiando 255 por 127. Si aparece otro error entonces podemos confirmar que hemos encontrado el byte de Padding.

Gracias a esta información, podemos averiguar la longitud del padding y payload, sabiendo por dónde empezar el ataque.

El autor publica el código Python para realizar pruebas.

Fuente: Virgil Security

1 comentario:

  1. Anónimo5/8/18 22:36

    No,esa investigación no la hizo Virgil Security

    Virgil Security copio la investigación sobre Telegram Passport de un medio Ruso llamado Habr. Así que no se molestaron mucho


    https://tecnonucleous.com/2018/08/02/virgil-security-copia-a-la-investigacion-de-habr/

    ResponderEliminar

Gracias por dejar un comentario en Segu-Info
Si vas a dejar una consulta, procura tener habilitado tu perfil en Blogger o deja una forma de contacto.

Gracias por comentar!