Robando información del historial (sin usar JavaScript!)
Hace un par de días leí algo que me sorprendió, una idea realmente simple (como suelen ser las buenas ideas) que da como resultado algo realmente perturbador.
Brendon Boshell posteó en su web-site una demo de código JavaScript que permite obtener el historial (o al menos una buena parte) de los sitios visitados por el usuario. Esto puede servir para armar un perfil con los gustos del usuario y después generar, por ejemplo, propagandas que se adapten a ellos. Esta grave invasión a la privacidad bien podría clasificarse de Spyware.
Para el que no lo tenga claro, los web-sites "no deberían" poder leer el historial de navegación, pero como lo ha demostrado Brendon en esta ocasión y Jeremiah Grossman en el pasado, claramente lo pueden hacer.
Ahora, si están pensando "HA, yo tengo deshabilitado java script en sites no confiables así que esto no me afecta!"... bueno, piensen de nuevo, porque muchos de los lectores de la página dijeron lo mismo, así que Brendon se tomó la molestia de demostrarles lo contrario. Con un nuevo demo probó que se puede hacer lo mismo, pero utilizando sólo iframes, con lo que no es necesario utilizar Java Script.

En este momento seguro se estarán preguntando, cómo lo hace? (yo me volví loco por saberlo apenas lo vi en funcionamiento). Contrariamente a lo que muchos se imaginarían, éste no es un exploit de algún browser. Las herramientas utilizadas aquí son la cache del historial del browser más CSS (Ja, suena loco hackear con CSS) más una buena lista de direcciones web.

Para el caso de la demo con Java Script, el funcionamiento es el siguiente:
- cuando la página se carga, se descarga una lista con muchas (si muchas) direcciones web (entre las cuales estarán google.com, facebook.com, etc) la cual mantiene oculta en un iframe oculto (osea, el usuario no ve nada de esto).
- En los CSS tiene definido el atributo "a:visited{ font-size: 60px;}" (aunque se podría usar cualquier otro).
- Para cada site listado, a través del código JavaScript verifica si el tamaño del font es 60px. Si el tamaño es éste, quiere decir que la página ha sido visitada en el pasado. Esto lo sabe gracias al atributo CSS a:visited que mencioné arriba, ya que una dirección que no ha sido visitada, no tendrá el font tamaño 60px.

Como ven, es como les advertí, muy pero muy simple. Pueden ver parte del código en http://www.making-the-web.com/2009/04/12/mass-browser-history-sniffing-with-javascript/. Es una pena que Brendon no comparta todo el código, y que la pequeña parte que comparte, lo hace con Copyright...


Ahora veamos el caso que más me gustó, utilizando sólo iframes. Este me llevó bastante tiempo entenderlo porque Brendon no comparte nada del código y la explicación que da es de sólo 4 líneas...
Luego de leer un poco y utilizar bastante la lógica, logré crear un par de scripts en php que hacen el trabajo. Si bien el sistema es básicamente el mismo, éste varía un poco dado que no podemos usar programas del lado del cliente. El sistema que creé yo es un poco distinto al de Brendon, pero hace lo mismo. La cosa va así:
- Tenemos un script principal que cuenta con un iframe que se auto refresca cada 3 segundos (podemos usar alguna función como header("Refresh: 3; url=list.php?id=algun_numero"); en php).
- En el iframe contamos con el atributo CSS "a:visited{ background: url(logger.php?id=algun_numero); }". En éste caso si o sí necesitamos de un atributo que necesite contactar al servidor porque no tenemos nada corriendo del lado del cliente, por eso utilizamos background con la función url() que llama al script que logueará si el link identificado por algun_numero fué visitado o no.
- Este iframe cuenta con un sólo link. Se podría contar con muchos links al mismo tiempo y varios atributos a:visited con clases definidas para distinguir entre links, pero para mantener el ejemplo sencillo, dejé un solo link.
- Cuando el iframe se carga, éste cargará el atributo url(logger.php?id=algun_numero) si y solo sí el link que tenemos dentro del iframe fué visitado. Gracias a esto, del lado del servidor, sabemos que si el script logger.php se ejecuta es porque el link identificado con algun_numero fué visitado.
- En cada recarga automática del iframe testeamos un link distinto y así armamos la base de datos con los sites que el usuario visitó.

Si bien este parece un poco más rebuscado, igual es increíblemente sencillo para los buenos resultados que nos da.


Ambos scripts son simples, pero se pueden optimizar para tener mayor y mejor funcionalidad, como por ejemplo para cada página que detectamos como visitada, buscar las páginas relacionadas y buscar con ellas también.


Cómo nos deshacemos del problema? por una parte podemos deshabilitar java script en los sitios que no confiamos (a veces ni en los sitios confiables se puede estar seguro debido al XSS). Por otra parte, podríamos configurar que el browser no guarde historial. Por último podemos bloquear los iframes.
Para deshabilitar Java Script y los iframes, en firefox, podemos usar el add-on NoScript. Por otra parte, los browsers cuentan en su configuración con la posibilidad de que, si el usuario lo desea, no almacenen historial.


Así que ya saben, si ven propagandas en sitios web que se acercan demasiado a sus gustos personales, empiecen a desconfiar =D

2 comentarios:

JaviZ dijo...

Impresionante data!!! Ya mismo me llevo (parte) para mi blog de seguridad.
BTW: veo que además de este espectacular post agregaste un par de chichipíos a la derecha! :)

Salu2,
Javier Echaiz (tu 1er Follower! :)

d3m4s1@d0v1v0 dijo...

Muchas gracias Javi, me alegra que te gustara. La verdad que es algo muy interesante para lo simple que es, y que podría ser de mucha utilidad para ciertas compañías.
Como me comentaste, agregué el widget de followers, así que bienvenido!

Publicar un comentario