29 may. 2017

Posibles vulnerabilidades en Qlink.it (análisis web)

Por Eduardo Malvacio, Ariel Maiorano y Pablo Lázaro
Grupo de Investigación en Criptografía y Seguridad Informática (GICSI), Instituto Universitario del Ejército (IUE); Dirección de Gestión Tecnológica (DGT), Policía de Seguridad Aeroportuaria (PSA) de Argentina

Recientemente se han publicado noticias [1,2] informando acerca dela disponibilidad del código fuente del sistema QLINK.it [3]. QLINK.it es una nueva manera, muy simple y segura, de enviar información confidencial a través de Internet.

Considerando por un lado que el GICSI tiene por objetivo, entre otros, estudiar técnicas y mecanismos para la revisión de código fuente, con foco en los aspectos relacionados a la seguridad informática en general y a la criptografía en particular [4,5]; y por otro lado, que la DGT tiene por incumbencia, entre otras, evaluar periódicamente alternativas para la comunicación segura del personal de la Institución; se realizó conjuntamente una primera revisión general del código fuente de la aplicación web [6].

Al momento (mayo de 2017), los resultados preliminares de la revisión -aunque parcial e incompleta- advertirían posibles o potenciales problemas de seguridad, por lo cual se decide consultar a los desarrolladores del sistema compartiéndolos resultados preliminares mencionados. Aunque se trate de una revisión no abarcativa e inacabada, se solicitó el debido permiso a los autores de QLINK para publicarla, en forma de este artículo, con la intención de invitar a otros revisores a estudiar el sistema para confirmar si su utilización podría considerarse segura.

Aclaraciones

Los autores aclaran que algunos de los posibles problemas descriptos podrían no representar riesgo alguno, sin embargo se incluyen todos los resultados obtenidos para eventuales futuras revisiones por terceros y para a la vez dar cuenta del limitado alcance de la presente revisión.

Además, se remarca que antes de esta publicación, se realizó el contacto con los autores de QLINK quienes autorizaron la presente publicación. Por eso, esta publicación es parcial hasta que los problemas sean completamente solucionados por los desarrolladores.

Información provista por los desarrolladores

De acuerdo a lo indicado en el material de documentación del proyecto de referencia [3,6], específicamente en su sección de preguntas frecuentes, "QLINK.it es una nueva manera, muy simple y segura, de enviar información confidencial a través de Internet".

Modo de funcionamiento

De forma resumida y, de acuerdo a lo informado también desde el sitio Web QLINK.it, en su sección de preguntas frecuentes avanzadas, el funcionamiento del sistema está descripto de la siguiente manera (del original):
  • Cifrado en el cliente: Tu mensaje es cifrado con un código que no es enviado a nuestros servidores. Alguien con acceso a éstos no puede leer tu mensaje.
  • Privacidad: Si recibes un mensaje a través de un QLINK, entonces sabes que el mensaje no ha sido leído por nadie.
  • Auto-destrucción: Una vez utilizado el QLINK para leer su contenido, no puede ser vuelto a utilizar. Alguien con acceso a tu cuenta de correo o chat no puede leer el contenido del link.
  • Volatilidad: Cuando envías un mensaje, éste se guarda en la memoria del servidor y nunca es escrito en el disco duro. Esto agrega una capa más de protección en caso de sabotaje.
  • Vencimiento del link: Tu mensaje tiene una fecha de vencimiento, así que será destruido en ese momento aún si nadie lo leyó. 

Los siguientes problemas potenciales han sido detectados en una instancia de prueba instalada y configurada de acuerdo a las indicaciones provistas en [6].

1. Vulnerabilidad Cross-Site-Scripting (XSS)

Aunque se utilizan funciones Javascript para el filtrado de campos de entrada a completar por el usuario al generar un QLINK -filterXSS() y escapeHtmlEntities()-, por ejemplo, para el campo que contiene el mensaje, la entrada parece no filtrarse o verificarse correctamente.
El script de prueba (no disponible aquí), simula lo que realizaría un navegador en cuanto a cómo es enviada la información al web service que responde a estas peticiones en el servidor, especificando como mensaje, luego de un tag de cierre del elemento textarea que presenta el mensaje descifrado, un elemento script conteniendo una invocación a la función alert() para demostrar la vulnerabilidad frente a ataques del tipo XSS.

2. Parámetros de entrada y operaciones criptográficas

Revisado el código en public/js/application.js, app/src/QLINK/Models/Utils/RandomHasher.php y /app/src/QLINK/Controllers/LandingNewController.php, se advierte que la primera parte parte del QLINK, esto es, los primeros 10 caracteres, por ejemplo: http://QLINK/two/XXXXXXXXXX.

Son generados (no exclusivamente) en base a un timestamp al milisegundo -resultado de la función Javascript Date().getTime()- que el navegador envía al servidor, y por lo tanto, que podría manipularse. Aunque el servidor registrará ese valor para usarlo en el próximo QLINK, usando para la petición en curso el valor inmediato anterior, registrado previamente de la misma forma, el valor luego es sumado al timestamp del servidor, a la cantidad de microsegundos multiplicada por cien mil, y usado como semilla -mediante la función mt_srand()- para luego obtener valores a partir de la función mt_rand().
Estas últimas funciones, basadas en el generador conocido como Mersenne Twister, no son aptas para utilizarse cuando existe la necesidad de números aleatorios para operaciones criptográficas, precaución explicitada también en su documentación oficial [7].

En el mismo sentido que lo anterior, ahora hablando del código que se ejecutará en el navegador del Cliente mediante Javascript, aunque indirectamente, a través de la librería CryptoJS y su función CryptoJS.lib.WordArray.random(), la obtención de números aleatorios termina invocando a la función Javascript Math.random(), que es implementada por los navegadores en base a variantes del generador Xorshift128+, que tampoco es considerada segura o recomendable para la implementación de criptografía [8,9,10,11].

Posibles soluciones

Los ejemplos del punto 2 pueden no representar un problema de seguridad, pero debe destacarse la importancia de que parámetros utilizados como parte de semillas pueden manipularse. Al margen de que el sistema tiene protección contra fuerza bruta limitando las peticiones a una por segundo por dirección IP, debería confirmarse si podría estimase la fecha y hora del servidor a la manera en que está descripto por ejemplo en [12], y así, entre otras posibilidades, generar un mismo QLINK repetidamente.

Para los problemas descriptos en el apartado anterior, se proponen en lo que sigue, soluciones posibles para remediarlos o reducir el riesgo para los casos en que la amenaza fuera potencial. Adviértase de que de ningún modo deben considerarse a estas soluciones como correctas, completas o pertinentes. Se intenta únicamente comentar resumidamente acerca de mecanismos de seguridad para sistemas, de manera general y en lo relativo a implementación de criptografía. Se sugiere a la vez la consulta de la referencia obligada en la materia, The Open Web Application Security Project (OWASP) [13].

1. El físico argentino que creó un sistema de seguridad para e-mails, NOTICIAS, http://noticias.perfil.com/2017/04/09/el-fisico-argentino-que-creo-un-sistema-deseguridad-para-e-mails/, accedido por últ. vez en mayo de 2017.
2. El acceso a mensajes encriptados por agentes de inteligencia vuelve al foco de debate, TÉLAM, http://www.telam.com.ar/notas/201703/183809-el-acceso-a-mensajesencriptados-por-agentes-de-inteligencia-vuelve-al-foco-de-debate.html, accedido por últ. vez en mayo de 2017.
3. Repositorio de QLINK.it en Github, https://github.com/QLINKit, accedido por últ. vez en mayo de 2017.
4. Automated Analysis of Source Code Patches using Machine Learning Algorithms, http://sedici.unlp.edu.ar/bitstream/handle/10915/5058/Documento_completo.pdfPDFA.pdf?sequence=1, accedido por últ. vez en mayo de 2017.
5. Proyecto AAP, Repositorio de GICSI en Github, https://github.com/gicsi/aap, accedido por últ. vez en mayo de 2017.
6. Proyecto webapp, Repositorio de QLINK.it en Github, https://github.com/QLINKit/webapp, accedido por últ. vez en mayo de 2017.
7. Función mt_rand, Manual de PHP, http://php.net/manual/es/function.mt-rand.php, accedido por últ. vez en mayo de 2017.
8. Referencia de Math.Random() en Mozilla Developer Neywork,
https://developer.mozilla.org/enUS/docs/Web/Javascript/Reference/Global_Objects/Math/random, accedido por últ. vez en mayo de 2017.
9. Implementación de Random() en CryptoJS, https://github.com/jakubzapletal/cryptojs/blob/master/src/core.js, accedido por últ. vez en mayo de 2017.
10. Implementación del generador XorShift128+ en Mercurial de Mozilla, https://hg.mozilla.org/mozilla-central/file/tip/mfbt/XorShift128PlusRNG.h, accedido por últ. vez en mayo de 2017.
11. Implementación del generador XorShift128+ utilizada en Chrome, Repositorio en Github, https://github.com/v8/v8/blob/master/src/base/utils/random-number-generator.h, accedido por últ. vez en mayo de 2017.
12. Argyros, G., Kiayias, A.: I Forgot Your Password: Randomness Attacks Against PHP Applications. En 21st USENIX Security Symposium. https://www.usenix.org/conference/usenixsecurity12/technicalsessions/presentation/argyros, accedido por últ. vez en mayo de 2017.
13. The Open Web Application Security Project (OWASP), https://www.owasp.org/, accedido por últ. vez en mayo de 2017.

Gracias a los autores de QLINK por recibir de tan buena manera este informe y por el compromiso por mejorar.

Ariel Maiorano para Segu-Info

0 comentarios:

Publicar un comentario

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!