Hace unos días se hizo público un fallo en varias aplicaciones que utilizan el framework Qt por el que se podría modificar la información que es mostrada al usuario sobre el certificado SSL ofrecido por la página visitada.
El fallo radica en la utilización de objetos QLabel, que soportan ser formateados mediante la clase QStyleSheet. Para aplicar el formato, QStyleSheet permite utilizar etiquetas HTML. Las aplicaciones vulnerables, al no estar preparadas para este tipo de entrada de texto, no la interpretan de forma correcta y producen una salida no esperada, mostrando solamente el texto que queda a la izquierda de la etiqueta HTML. Para poder aprovechar por completo esta vulnerabilidad habría que conseguir que una entidad certificadora firmase el certificado, intentando levantar las mínimas sospechas posibles con el Common Name (CNAME) especialmente preparado. Pero esto lo veremos luego.
Las aplicaciones que han resultado ser vulnerables al utilizar QLabel para mostrar la información de los certificados son KSSL (CVE-2011-3365), los navegadores Rekonq (CVE-2011-3366) y Arora (CVE-2011-3367) y el programa de mensajería instantánea Psi IM (Sin CVE por ahora).
Ya ha sido publicado un parche para subsanar el problema, y tan solo hace falta que sea integrado en cada una de las aplicaciones afectadas:
http://lists.opensuse.org/opensuse-commit/2011-10/msg00874.html
Si se observa la solución, recuerda bastante al principio de un filtro para evitar ataques XSS, sustituyendo en este caso los símbolos <, >, & y " por sus equivalentes en código html.
En el laboratorio de Hispasec, a modo didáctico, hemos querido mostrar lo sencillo que sería explotar esta vulnerabilidad.
Utilizaremos la herramienta 'openssl' para crear un certificado "especialmente manipulado" y lighttpd como servidor. Apache supondría un "problema" porque comprueba que el Common Name (CN) sea idéntico al dominio en el que se está ofreciendo el certificado, no funcionando en caso de ser diferente. Para la prueba, también es necesaria la imagen de una página web que suplantar. Descargamos el contenido de Hispasec.com con WebHttrack.
Se genera una clave con la que firmar el certificado:
openssl genrsa -des3 -out hispasec-uad.key 1024
Y con ella creamos el certificado (firmado por nosotros mismos):
openssl req -new -x509 -key hispasec-uad.key -out hispasec-uad-cert.pem -days 2
Aquí nos irá pidiendo varios datos sobre la empresa para la que se va a crear el certificado. Los rellenamos hasta llegar a "Common Name". El formato de este campo será el siguiente: el texto que queremos que muestre la aplicación de la que nos vamos a aprovechar, una etiqueta HTML, y un texto que no será mostrado. El texto que quedará oculto sería el utilizado para no levantar tantas sospechas en el hipotético caso de intentar que una entidad certificadora firmase nuestro certificado.

Como puede apreciarse en la imagen, después de crear el certificado para el servidor, se ha ejecutado un último comando con el objetivo de comprobar su funcionamiento. La orden simplemente lanza un mini servidor escuchado en el puerto 8080, cuya única función es la de ofrecer el certificado para comprobar que el se ha creado correctamente:
openssl s_server -www -cert cerdificado.pem -key calve.key -accept 8080
El siguiente paso, será montar el servidor que ofrezca el certificado fraudulento. Tras instalar el servidor 'lighttpd', tendremos que configurarlo para ofrecer la conexión a través de SSL. Modificaremos el archivo '/etc/lighttpd/lighttpd.conf', añadiendo las siguientes líneas:

En ellas indicamos que se active el soporte para SSL, la ruta donde se encuentra el certificado, y la carpeta donde se servirán los archivos que serán pedidos mediante el protocolo https.
Hay que señalar que el formato que espera lighttpd de certificado es ligeramente diferente al generado en un principio. Solamente cambia la línea de comandos para su creación, el resto del proceso es exactamente el mismo que el descrito antes:
openssl req -new -x509 -keyout certificado.pem -out certificado.pem
- -days 2 –nodes
Por último, procederemos a copiar el sitio web descargado con httrack al servidor.
Tras unos pequeños retoques para que todos los pasos anteriores encajen a la perfección, podremos acceder finalmente a nuestro servidor con el certificado especialmente manipulado.
Para comprobar el funcionamiento de esta vulnerabilidad, hemos probado el navegador web Arora. Aunque en el advisory sólo se hacía referencia a la versión 0.11 como vulnerable, hemos podido comprobar que la 0.10.2 también lo es.

La advertencia que se observa en la imagen, corresponde a que el certificado de prueba que acabamos de generar no está firmado por una autoridad certificadora. Pero se observa que el CNAME mostrado por el navegador, corresponde a la parte izquierda del que se utilizó para generarlo (hispasec.com<tr>jrascon).
Si nos fijamos en la barra de dirección podéis ver que estoy accediendo a https://hispasec.com. No, no estoy haciendo las pruebas con el servidor de la empresa, simplemente he utilizado la técnica a la que recurren muchos troyanos (entre otros tipos de malware), de
modificar el archivo hosts. Sólo ha sido necesario añadir la siguiente línea:
127.0.0.1 hispasec.com
Tras realizar la petición, Arora nos muestra el certificado para que lo examinemos, ya que no está firmado por ninguna entidad certificadora de confianza, y, como podemos ver, donde debería verse todo el campo Common Name, sólo se ve el principio de la cadena introducida hasta la etiqueta <tr>. Realizando la misma petición desde Firefox vemos que el campo CN se muestra tal y como se introdujo al
crear el certificado.

Y como resultado, tras aceptar nuestro certificado fraudulento, podremos navegar con "toda la seguridad del mundo" a través de la página, ya que estamos utilizando el certificado de hispasec.com. Arora detecta las páginas seguras mostrando en amarillo la barra de direcciones.

Como se puede ver, la dificultad técnica de todo el proceso es casi nula y no hacen falta profundos conocimientos sobre cada uno de los pasos seguidos para entenderlos.
Más información:
* Advisory original
http://www.nth-dimension.org.uk/pub/NDSA20111003.txt.asc
* Documentación QStyleSheet
http://www.kde.gr.jp/~ichi/qt/qstylesheet.html