lunes, 22 de agosto de 2011

HTML5 [IV]: Local Storage y las cookies zombis (o supercookies)

Saludos!

Empiezo a escribir este post haciendo tiempo para que empiece Mundo Hacker TV (aunque lo terminaré después del programa), lo recomiendo si no haces nada más interesante a estas horas (quien me diría a mí que alguna vez promocionaría algo emitido por Telecinco).

En otra ocasión, hace apenas unos meses, ya comenté algo sobre las cookies zombis, hablando bastante someramente de qué se trataba y recomiendé la API para JavaScript "Evercookie". Ahora vuelvo a retomar el tema porque recientemente ha saltado la liebre con las cookies de seguimiento zombis que usaban KissMetrics y Hulu (no voy a entrar en detalles, hay cientos de webs hablando del caso). A esto se le suma toda la parafernalia de HTML5 y la seguridad, cosa que me está gustando bastante indagar (gracias a Seth y a @Franjoespejo que me están cebando a publicaciones interesantes).


Entrando ya en materia quizás lo primero que debemos de saber es... ¿Qué diablos es eso de Local Storage que han metido con HTML5? Pues la respuesta es sencilla: almacenar información desde el lado del cliente para agilizar la carga de páginas y similares. Presenta ciertas ventajas sobre las cookies de toda la vida, como pueda ser sus 5 Mb de capacidad de almacenamiento, o el tiempo de permanencia.

El concepto base de las cookies zombis es poder respawnear la cookie, utilizando información almacenada en el cliente. De esta forma, en el caso de las empresas de tracking por ejemplo, pueden asignar un identificador a un usuario (una cookie HTTP) para realizar estudios de comportamiento, y además guardar "copias" de dicho identificador en el ordenador del usuario. Cuando el usuario borre la cookie, ésta volvera a ser creada utilizando como molde las copias escondidas. Creo que se entenderá mejor con una sencilla prueba de concepto:


<----Web_original.html------->

<script>
localStorage.setItem("Foo", "Foo=0verl0ad;expires=Thu, 2 Aug 2020 20:47:11 UTC;");
document.cookie = localStorage.getItem("Foo");
</script>


<----Respawner.html----->

<script>
document.cookie = localStorage.getItem("Foo");
alert(document.cookie);
</script>


Primero entramos en Web_Original.html, vemos en nuestro navegador (el PoC lo he ejecutado en Firefox 6.0, si a alguien no le funca que lo ponga en los comentarios) que la cookie se ha creado, y procedemos a borrarla. Ahora vayamos a Respawner.html y... ¡Tachan! ¡Ha vuelto a la vida!

Nuestro primer archivo HTML hace dos cosas: por un lado crea la cookie, y por otro crea una copia valiéndose de Local Storage. Después, cuando borramos la cookie y vamos a Respawner.html volvemos a crear la cookie con la copia que ya teníamos almacenada. Esto mismo pero almacenando la información en muchos más sitios es lo que hacía evercookie.

Ahora bien, el cómo implementan este concepto las grandes empresas de seguimiento es algo que descozco y que supongo que cada empresa mantendrá esto en secreto. En líneas generales supongo que cada vez que se entre en un sitio controlado por una de estas empresas se comprobará si existe una cookie, de no existir se buscará entre el registro de Local Storage para respawnearla, y si tampoco hay nada allí crearán una de nuevo.


Está claro que Local Storage va a traer más de un quebradero de cabeza al unirse con otras técnicas como puedan ser XSS o SQLi, pero es tema para otro post.

PD: entre unas cosas y otras he terminado a las 5:50 am, probáblemente haya metido la pata en alguna parte, si es así avisadme.
5 0verl0ad Labs: HTML5 [IV]: Local Storage y las cookies zombis (o supercookies) Saludos! Empiezo a escribir este post haciendo tiempo para que empiece Mundo Hacker TV (aunque lo terminaré después del programa), lo r...
< >