01 julio 2014

Cazador de mitos: La privacidad en Internet

Existen varias formas de controlar la actividad de un usuario en Internet. Como por ejemplo, saber que páginas has visitado, desde qué búsqueda ha llegado a nuestra web, por qué zona has movido el ratón o qué teclas has pulsado en nuestra página web. ¡¡Ehhh! ¿Perdón? ¿Qué teclas he pulsado en vuestra web? Sí, y además da igual que elimines las cookies. Las cookies son del pasado.

Para el curso de la UIMP de Protección de datos y nuevas tecnologías he hecho un análisis de los sistemas que existen actualmente para monitorizar el uso de la web y los resultados son bastante sorprendes. En este artículo os resumo la parte técnica y os muestro unos ejemplos reales.

En este estudio he querido diferenciar los métodos tradicionales y normalmente conocidos de aquellos más agresivos que incluso en algún caso ha desencadenado la multa de 2.4 millones de dolares. Como cuando pillaron a las compañías Quancast y Clearspring en 2009 recreando la cookie aprovechándose del almacén de plugin de Flash.

No nos adelantemos y empecemos desde el principio.

Los métodos establecidos para gestionar cookies, a las que voy a empezar a llamar sesiones, ya que realmente es como se las conoce, son los siguientes:
  • Cookie y Cookie2: definidas en los RFC de HTTP, son las que todas las aplicaciones web deberían usar y las que históricamente se han utilizado. 
  • Session, Local, IndexedDB y WebSQL: nacen con HTML5 y solventan un problema de sus predecesoras: permiten almacenar mucha más cantidad de información de forma estructurada (SQL) o no estructurada (NoSQL). 
  • Flash, Silverlight y Google Gears: mediante esta tecnología se utilizan propiedades de los plugins para guardar información en el disco duro. En su momento causaron mucho ruido ya que los navegadores no podían gestionar este almacenamiento directamente. Desde 2011 tanto flash como los navegadores se han actualizado y ahora son eliminadas cuando el usuario ordena borrar la información del navegador. 
Todas estas están controladas por el navegador y si se observan las opciones de, por ejemplo, Chrome, en la parte de "gestión de cookies y datos almacenados" se podrán borrar de forma masiva o  individualmente.

Pero ¿qué pasa cuando borra el usuario las cookies? ¿los sistemas de monitorización pierden nuestro rastro tal y como se espera? La respuesta es sencilla: no. Por desgracia han encontrado métodos alternativos y los están usando.

1.- IE userData behaviors: es una característica única de Internet Explorer que ha quedado obsoleta con la versión 10 de este navegador. Mediante este mecanismo es posible persistir información en las versiones anteriores a la mencionada. Es ampliamente usada ya que las versiones antiguas de IE no disponen de los almacenamientos propios de HTML5. Hay que destacar que es peligrosa porque los datos no se eliminan cuando el usuario trata de borrar las cookies del navegador. Además, tiene otras implicaciones de seguridad que deben tenerse en cuenta, como que el dato no se almacena cifrado

Un ejemplo de un proyecto importante que utiliza este sistema es Persist-JS, en el que se implementan varios métodos como son cookies en flash, cookies en google gears, localstore, globalstore, cookies tradicionales y el mencionado  IE userData behaviors.


2.- window.name: es una propiedad de Javascript no persistente (salvo el javascript se almacene en la caché), que es utilizada para pasar información entre las distintas páginas web del sitio. También tiene inconvenientes de seguridad y no debería ser usada nunca para almacenar una sesión.

3.- Fingerprint del navegador: una opción muy interesante y problemática es la creación de una huella digital única basada en información del navegador. Los datos habitualmente consultados para crearla son, entre otros: fuentes instaladas, plugins del navegador, resolución de la pantalla, huso horario, zona geográfica o versión del navegador. La polémica ocurre porque, pese a que identifica al usuario de forma inequívoca, cuando conecta con el servidor con un 95% de acierto no es necesario almacenar datos en el sistema del cliente, ya que la huella es recalculada en cada conexión. Esto implica que no queda sometida a la actual legislación de cookies.

También existen herramientas que facilitan la implementación del fingerprint a los desarrolladores, como por ejemplo FingerprintJS o jquery-browser-fingerprint. Todos ellas basadas en el trabajo de la EFF :Panopticlick

El fingerprint es un problema actual y quedó demostrado en el estudio: FPDetective: Dusting the Web for Fingerprinters en el que se evidenciaba una gran cantidad de compañías que utilizaban está técnica.

Imagen del estudio FPDetective Dusting the Web for Fingerprinters

A estas páginas, yo añado un par de ejemplos más, como "iam.js", de la compañía InfoOnline, que he detectado en decenas de sitios alemanes y holandeses como www.spiegel.de o www.pcgames.de. También he visto un pequeño fingerprint en ShareThis, el ¿widget? para compartir noticias y su javascript "buttons.js". En el siguiente video un ejemplo en la web de la NASA: space.com



4.- HTTP Etags: en esta ocasión se utiliza la cabecera "If-None-Match" y "Etag" en sustitución de "Set-Cookie" y "Cookie". Explico esto más detenidamente.

Para acelerar la carga de archivos en Internet se hace uso de la caché de los navegadores. Estos, con la ayuda del servidor, permiten almacenar archivos temporalmente en el ordenador para no descargarlos continuamente. El sistema de caché mediante Etags es muy sencillo:
  • Cuando el navegador solicita una imagen que jamás ha visitado anteriormente, el servidor se la devuelve y la identifica con un valor "Etag".
  • En la próxima conexión a esa misma imagen el navegador preguntará si el identificador ha cambiado con la cabecera "If-None-Match" y el valor que le devolvió el Etag, es decir, si la imagen almacenada en el  pc sigue siendo válida o necesita descargarla nuevamente. Si el servidor responde con un "304" significará que la imagen es correcta y que puede ser usada sin descargarla. Si devuelve un código "200" significará que debe volver a bajarla.
La trampa consiste en hacer abuso de esta funcionalidad:
  • El navegador solicita la imagen y el servidor le devuelve una imagen con un Etag único y exclusivo para ese usuario.
  • En la próxima conexión, el navegador del usuario solicita la imagen usando el valor que le facilitaron con el Etag.
  • El servidor observará la petición con un Etag y lo usará para establecer la cookie. Además, devolverá un 304 para indicar que no hay cambios en la imagen.
De esta forma es capaz de crear imágenes y etags de igual manera que lo haría si fueran sesiones. El autor de cookieless, una herramienta que me implementa este método, lo explica con el siguiente gráfico:

Como funciona cookieless
Como no me quería quedar en resumir el método o contar la noticia de cuando pillaron a la compañía Kissmetrics usando esta técnica, decidí pegarle un vistazo al Top10.000 de Alexa a ver si encontraba algún caso más. Y alguno más apareció.

En el siguiente vídeo se ven algunos de ellos, aunque más abajo los enumero.



5.- WebCache "If-Modified-Since": al igual que con ETags, se pueden usar las cabeceras "Last-Modified" y "If-Modified-Since" para identificar una imagen. La única diferencia es que, en vez de una cadena de caracteres única por usuario, se utiliza una fecha única por usuario.

6.- Javascript con código único: tal vez lo más eficaz y complejo de detectar es, simplemente, crear un javascript único para cada usuario, con un identificador en una variable. Este javascript se cachea y siempre será usado. Una sencilla prueba de concepto en la página web: http://cookieless-user-tracking.herokuapp.com/

7, 8, 9 y N: existen muchos otros métodos que no voy a detallar, como son, por ejemplo, el almacenar la cookie en el historial de navegación para luego consultarla mediante CSS; el uso de un PNG en caché, que posteriormente es leído mediante canvas; el abuso de la autenticación simple de HTTP, o el uso de Java. Los dejaré para futuras entradas que iré publicando poco a poco.

Lo que si me gustaría es mostrar cómo funciona la herramienta "evercookie", que implementa de forma sencilla y amigable todos estos métodos y está siendo usada en bastantes páginas web.




Para finalizar y para todo aquel que tenga interés, os dejo la presentación completa del evento, en la que podréis encontrar las recomendaciones en la última página.


Referencias:

13 comments :

Óscar García Amor dijo...

He probado el método 6 (Javascript con código único) y a mi personalmente no me ha funcionado ¿Sera que en la 36 de Chrome lo detectan?

supcul dijo...

Genial artículo y genial la presentación, una pena no haber podido asistir al curso!

fasu dijo...

¿a alguien le ha dejado de funcionar el día 1?
A mi me falla en dos maquinas en las que funcionaba, parece que coge mal la fecha:
Date template hits:
|- [# of hits] date format
| [4] Day/Month/Year Hour:Minute:Second
`-

Debería empezar por el mes

Ignacio Agulló dijo...

Muy bueno, Alejandro.

Alejandro Ramos dijo...

Hola, debe de funcionar, lo mejor es que abras la barra de desarrollador y mires como se está comportando el navegador. Un saludo!

Román Ramírez dijo...

¿Has probado cosillas con las técnicas de jugar con los a:visited?

SaludosI dijo...

Great post as usual! Eso si, tremendamente desalentador…En fin no se puede tener todo...

silverhack dijo...

Gran post y una presentación muy buena Alex

newlog dijo...

Muy buena entrada! Algunos métodos son muy interesantes... Lo último que escuché fue el tema de fingerprinting de navegadores, pero al final, veo que hay decenas de métodos de lo más básicos. Lo del custom javascript es muy bueno y puede ser muy sutil.

Lo dicho, buen curro!

erm3nda dijo...

Este tio no ha leído nada :) preguntando por el formato de la fecha. Si os pararais a leer 2 minutos ahorraríais horas después. Muy interesante combinación de herramientas.

ricky dijo...

Interesante el curso que ofrecieron , tienen planeado uno para el 2015?

Lorenzo Martínez dijo...

Hola Ricky, estamos elaborando ya la agenda de cursos para 2015. Te recomendamos estar atento al twitter de @securizame

rickygm dijo...

Ok , los agregare a mi tw , gracias Lorenzo