Buenas,
(AVISO, TEXTO TOCHO)Hace algún tiempo que es sabido que las imágenes que publicamos en tuenti no sólo pueden ser vistas por nuestros amigos y los amigos de sus amigos, sino que estas imágenes están subidas a una serie de servidores que sirven la imagen sin comprobar si quien la está pidiendo es el sitio tuenti o no.
Así, conociendo de antemano la URI de una imagen, esta puede ser visionada mediante su simple introducción en la barra del navegador.
Esto supone a mi parecer un gran ataque contra la privacidad del usuario, pese a que este último halla cedido en el proceso de registro todos los derechos sobre estas imágenes:
El Usuario cede en exclusiva a TUENTI y para todo el mundo los derechos de reproducción, distribución y comunicación pública sobre los contenidos que suministre a través del Sitio Web, así como el de modificación para adaptarlos a las necesidades editoriales de TUENTI, y garantiza además la legítima titularidad o facultad de disposición sobre dichos derechos.
Así que intrigado por averiguar el grado de facilidad con que un 'malintencionado' podría acceder (y apuesto a que hay quien sabe hacerlo y lo hace) a estas imágenes de un modo automatizado, estuve estudiando el tema y me dispongo a resumirlo brevemente a continuación con la única intención de que los usuarios se conciencien de la situación y que los administradores de la web implanten sistemas eficaces que eviten que esto se pueda dar.
Especificación de la URI de foto para amigoAbrimos una página donde se muestre una foto de un amigo de tuenti y observamos la URI.
http://www.tuenti.com/#m=foto&collection_key=1-69837257-506824627-61338314
Nos centramos en la variable 'collection_key', de formato
a-bbbbbbbb-ccccccccc-ddddddd.
a = 1 dígito decimal. Sólo puede tomar los valores 1 (galería de fotos en las que sales) y 2 (galería de fotos subidas por tí).
b = 8 dígitos decimales. Número de usuario (uid) del cual estás mirando el tuenti.
c = 9 dígitos decimales.Código de serie de la imagen. Llamémosle 'CSI'.
d = 8 dígitos decimales.Número de usuario (uid) de quien subió la foto.
Hasta aquí nada de especial interés, ahora viene la otra cara de la moneda.
Especificación de la URI externaObservamos las URI's reales de las imágenes y las tabulamos para encontrar coincidencias. Hasta ahora he encontrado cuatro tipos distintos abajo listados, aunque predeciblemente deben existir varios más de ellos.
Algo común en todos ellos es el uso de 64 caracteres distintos (que llamaremos '64set'), a saber, del '0' al '9', de la 'a' a la 'z', de 'A' a 'Z' y por último guión (-) y guión bajo (_). Todos elos se muestran abajo como asteriscos.
Tipo 'A' o 'LL'http://im**.ll.tuenti.com/i**/*/*/500/*/*/********************.0.jpg
Donde los dos caracteres después de 'im' solo pueden ser enteros decimales.
Tipo 'A EXTRA'http://imagenes*.tuenti.com/i**/*/*/500/*/*/********************.0.jpg
Donde los dos caracteres después de 'im' y el caracter tras 'imagenes' solo pueden ser enteros decimales.
Tipo 'B' o 'PAN'http://i**.pan.tuenti.com/i/*/500/*/*/*******************.0.jpg
Donde los dos caracteres después de 'i' solo pueden ser enteros decimales.
Tipo 'B EXTRA''http://i**.pan.tuenti.com/i/*/500/*/*/********************.0.jpg
Donde los dos caracteres después de 'i' solo pueden ser enteros decimales.
La diferencia frente al resto es la longitud del nombre de la imagen, que asciende a 20 carcteres en lugar de los 19 del resto.
¿Y cómo encontrar las fotos?Lógicamente, para encontrar las fotos hay que saber sus nombres de archivo. Aquí se plantean varios modos de que esto ocurriese.
Fuerza brutaLo primero que se nos podría ocurrir es un ataque de fuerza bruta, probando todas las combinaciones posibles del '64set' en un string de longitud 19 (20 en el caso de los 'B EXTRA'). Lo mío no es la combinatoria, y no me atrevo a calcular el número exacto, pero adivino que tardaríamos varios millones de años en probar todas estas posibilidades.
Cuando le dije esto a un buen amigo mio no se lo creyó y se lo tuve que demostrar haciendo un script en PHP que probase todas las combinaciones, imprimiéndolas en pantalla e insertando la foto si existía:
//PRIMERO EJECUTAR ESTE SCRIPT, QUE IMPRIME EL SCRIPT DEFINITIVO
for($a=1; $a<20; $a++){
echo"for($var$a = 1; $var$a<65; $var$a++){<br/>";
}
echo"echo\"<br/>\";<br/>";
echo"echo\"<img src=\\"http://i65.pan.tuenti.com/i/2/500/D/B/\";";
echo"<br/>";
for($b=1; $b<20; $b++){
echo"echo\"$digit[$var$b]\";";
}
echo"<br/>";
echo"echo\".0.jpg\\" />\";<br/>";
for($c=1; $c<20; $c++){
echo"}";
}
Con su arreglo '$digit' que asigna a cada caracter del '64set' un número del 0 al 64 para iterar más facilmente:
$digit=array("1" => 1,"2" => 2,"3" => 3,"4" => 4,"5" => 5,"6" => 6,"7" => 7,"8" => 8,"9" => 9,"10" => 0,"11" => "a","12" => "b","13" => "c","14" => "d","15" => "e","16" => "f","17" => "g","18" => "h","19" => "i","20" => "j","21" => "k","22" => "l","23" => "m","24" => "n","25" => "o","26" => "p","27" => "q","28" => "r","29" => "s","30" => "t","31" => "u","32" => "v","33" => "w","34" => "x","35" => "y","36" => "z","37" => "A","38" => "B","39" => "C","40" => "D","41" => "E","42" => "F","43" => "G","44" => "H","45" => "I","46" => "J","47" => "K","48" => "L","49" => "M","50" => "N","51" => "O","52" => "P","53" => "Q","54" => "R","55" => "S","56" => "T","57" => "U","58" => "V","59" => "W","60" => "X","61" => "Y","62" => "Z","63" => "-","64" => "_");
El script se puede ejecutar directamente pulsando
aquí y da una idea de la imposibilidad de aplicar la fuerza bruta. (Escasos de RAM absténganse).
Además, sólo está explorando una carpeta de tantas de un servidor de entre muchos otros, dentro de la cual desconocemos el número de archivos que se encuentran almacenados.
La búsqueda orientadaSi se lograse encontrar la relación entre los 'CSI' y las URI externas o algoritmo que tuenti usa para calcular estas, tan sólo habría que recorrer cada 'CSI' calculando su URI.
Por lo tanto, dicho algoritmo es la piedra filosofal que otorgaría a un hipotético 'descargador automático' la funcionalidad deseada.
Su origen, bastante claro, la aplicación o script que tuenti use para subir las imagenes ('uploader' en adelante). Este script es quien decide a qué carpeta de qué servidor y con que nombre se almacenará el archivo, basándose en parámetros que desconozco (peso, datos internos de la imagen, timestamp, etc.)
Existe una versión de 'uploader' en ActiveX fácilmente descargable (ver línea 52 aprox. del código fuente de tuenti), que supongo no muy dificilmente extraible y explorable. Por otro lado el código dinámico que inserta la imagen en la página también debe saber cuál es la imagen que ha de mostrar y dónde se halla, con tan sólo recibir el 'CSI', lo cual se haría con el mismo script contenido en 'uploader'; eso sí, suponiendo que estas relaciones no estén guardadas en una base de datos, lo que invalidaría el razonamiento de que el script mágico ('SM') que buscamos está en el visor de fotos, pero no que esté en el 'uploader', lo cual es inevitablemente cierto, haciendo de esta hipótesis la fuente más plausible de nuestro 'SM'.
Por aquí me he quedado en mis indagaciones. Muchas gracias por leer el texto y espero que les haya hecho reflexionar un poco sobre el material multimedia compartimos en Internet y la ligereza con que lo hacemos.