22 septiembre 2010

Twitter y las galletas caducadas

Ayer fue un día de gran revuelo en el mundo de Internet. Más o menos a la hora de comer en España, se destapaba uno de los mayores fallos conocidos en la red social Twitter. Un fallo en la propia página web de Twitter permitía que, mediante una vulnerabilidad XSS en la gestión del evento "onmouseover", se ejecutara código javascript y, entre otras cosas, permitía hacerse con la cookie de un usuario conectado vía web que pasara el ratón por encima de un tweet especialmente construido que apareciese en su "timeline".

Incluso se llegó a fraguar un nuevo gusano, bautizado como Rainbow (porque mostraba los colores del arco iris, ¿inofensivo verdad?), y se propagaba desde tu propio timeline según pasabas por encima con el ratón.

En multitud de blogs de  seguridad, así como en casi todos los medios de comunicación, se hacían referencias a esta noticia, e incluso nuestro compañero @Yago era consultado por RTVE para dar una opinión como experto en seguridad. Sin embargo, lo que quiero contaros no es lo que otros blogs ya han detallado estupendamente sino algo que ocurrió a posteriori. Y es que resulta que para evitar el posible mal que haya podido hacer el gusano Rainbow o alguna URL un poquito malpensada capturando cookies válidas, se recomendaba cerrar la sesión anterior de Twitter vía web y crear una nueva, invalidando la cookie antigua.

Sin embargo, vía Twitter, varios colegas del mundo de la seguridad (como @Grifo y @K4rliky) indicaban que era posible, incluso habiendo cerrado la sesión en la web de Twitter, reutilizar la cookie antigua y hacer login sin ningún problema. Horas antes, @Yolandaruiz de Panda apuntaba algo similar según el comportamiento de su navegador.

Quise comprobar si efectivamente lo que decían era correcto, así que Firefox + TamperData en mano, capturé mi cookie después de acceder vía web. Después, hice logout, incluso cerré el navegador, a fin de evitar malas pasadas por la caché del mismo, y cargué la página principal: http://www.twitter.com. Me aparecía una página sin usuario activo. Arranqué la extensión Tamper Data y forcé la modificación de las peticiones HTTP. Hice un recargar en la página de Twitter inyectando con Tamper Data la cookie anterior. Pulsé aceptar y voilá! vuelvo a estar dentro con una cookie que se supone que debía estar caducada y por supuesto ser inválida.

¿Por qué este comportamiento?

Bueno, pues aquí entran diferentes teorías.. desgraciadamente no he podido comprobar ninguna a ciencia cierta cuál es la causa pero se me ocurren algunas y, comentando la jugada con más colegas, aparece alguna más.

Inicialmente, un imperio como es el de Twitter, se nos antoja que debe contar una infraestructura de sistemas descomunal para poder dar de comer y beber a la megalómana cantidad de usuarios conectados permanentemente.

Además, Twitter hace uso de las redes Akamai y el servicio S3 de Amazon para cachear y guardar ciertos contenidos estáticos respectivamente, pero por detrás, la gestión de cookies la llevan a cabo una legión de servidores de Twitter. 

  1. El fallo de la cookie válida/inválida podría estar en un problema de sincronización entre nodos de Twitter, de manera que una primera autenticación pasa a través de un nodo y la siguiente es capturada por otro, que,... por algún problema de sincronización no funciona como debe y permite usar una cookie antigua.
  2. Otra idea, es la validez de los contenidos (y de las cookies) en caché de los servidores. En este caso, hay una cola de cookies inválidas a ser vaciada. Al efectuar "en seguida" el intento de acceder con una cookie antigua, puede que el contenido de cookies inválidas de esa cola no se haya llegado a volcar/procesar en un sitio suficientemente centralizado y no de tiempo a invalidarse al volverse a usar (gracias @revskills).
  3. La otra teoría es que el tiempo de cacheo de ese elemento (la cookie) en memoria por parte  del servidor sea demasiado largo y, por algún motivo que desconozco, no se invalide hasta que lo así lo dictamine el time-out predefinido.
Sea como sea, lo que está claro es que durante un rato después a haber cerrado la sesión en Twitter (si se ha accedido vía web) la cookie antigua sigue siendo válida. Lo he comprobado por mí mismo y se puede decir que el sentirse "tranquilo" simplemente cerrando la sesión no es del todo seguro. De hecho, se recomendaba utilizar como alternativa más segura, aplicaciones de terceros (como Tweetdeck o Seesmic) para conectarse, evitando el contacto vía web.

No es la primera, ni la última que Twitter tiene un fallo suficientemente gordo como para que sea noticia, sin embargo, es la primera vez que tiene tal repercusión mediática... y supongo que no será la última.

4 comments :

Grifo dijo...

Me preguntaba por qué tenía nuevos followers... ahora sé la respuesta :P

Dando algo más de información... el tiempo que tarda en invalidar la cookie va desde... medio día al infinito. Un amigo me confió su cookie y cerró su sesión de twitter anoche, hoy su cookie sigue permitiéndome acceder a su cuenta sin ningún problema...

Steal the cookie... steal the world!

Grifo dijo...

Mierda, me olvidaba de lo otro que iba a decir...

Anoche comentándolo en el #linux, me comentaron que alguien había hablado de eso (o algo parecido) hace tiempo, buscando un poco encontré esto:

http://domdingelom.blogspot.com/2008/12/all-your-twitter-are-belong-to-us.html

En el que explica que la cookie es infinita. Creo que ahora al cambiar la contraseña cambia la cookie, hice una prueba y dejé de entrar, pero no me fijé en que cookies cambiaban...

globalillo dijo...

Algo que comprobamos ayer en el IRC es que la famosa cookie, auth_token, al menos en condiciones normales, solo es enviada/aceptada bajo httpS, lo que elimina muchas posibilidades.

Saludos.

Víctor Pimentel dijo...

Al menos no usan cookies "imborrables"... http://samy.pl/evercookie/