30 mayo 2013

La memoria cache de Firefox: fallo o característica.

Todo aquel que haya administrado un sitio web importante sabrá que gestionar el manejo de la caché de los navegadores para optimizar el rendimiento es un dolor de cabeza. Exactamente igual que ocurre con cualquier otra cosa en la que hay que pegarse con los navegadores más populares y las implantaciones que hace cada uno de ellos de un estándar. ¡Qué se yo! me viene a la cabeza el CSS o el javascript.

Pero hoy nos vamos a centrar en la caché, esas directrices mandadas desde el servidor, que muy concienzudamente un equipo de expertos arquitectos en calidad y rendimiento o simplemente administradores y desarrolladores con dos dedos de frente han decidido poner para aliviar la carga de recursos de la red.

Breve y resumidamente, existes dos tipos de cabeceras que un servidor web puede mandar: las que indican cuando expira un elemento y las que indican que método usar para comprobar la validez de ese elemento cacheado.

Históricamente cada familia de navegadores se ha comportado de forma distinta con las zonas grises del estándar (rfc2616), por ejemplo, Firefox no cacheaba ningún contenido que se sirviese por SSL salvo se indicase con una cabecera específica de que era contenido público (Cache-Control: public), incluso indicando con otras cabeceras que se debía guardar. En cambio, Internet Explorer o Chrome, salvo se dijese lo contrario con una correcta configuración, cacheaban o no bajo su criterio.

El ejemplo anterior podría ser una buena noticia si todos los navegadores hiciesen lo mismo: no almacenar el contenido servido por SSL si no tiene configuración de caché. Esto supondría que la web cargaría algo más lenta y que los servidores tendrían que servir repetidas veces contenidos estáticos. Algo poco realista con los números y cargas que manejan las webs de hoy en día.

Me pierdo, volviendo al tema de las cabeceras. Para indicar cuando el contenido se ha de renovar se usan dos cabeceras Cache-Control: max-age o Expires (en ocasiones se ven ambas, pero son redundantes y solo debería ser una de ellas), y el tiempo en segundos en el que caduca el contenido o la fecha en la que se debe renovar. Para saber si un elemento cacheado sigue siendo válido, se usan otras dos cabeceras más, también redundantes entre ellas: Last-Modified o ETag y al igual que en el caso anterior, solo se debe usar una de ellas. En el primero de los casos, con la fecha de la última vez que se modificó el elemento y en el segundo, con un identificador único del contenido.

Cuando hablamos de caché todo el mundo sobreentiende que nos referimos a la caché de disco, en memoria no volátil, pero esto no tiene por qué ser así. Todos los navegadores también usan caches en memoria para las páginas que se visitan en ese momento.

En las últimas versiones del navegador Firefox es posible ver que elementos están cacheados tanto en disco, como en memoria, tan solo escribiendo en la dirección about:cache, esto creará una página con enlaces a los contenidos guardados.

about:cache en Firefox
Está característica es muy útil, junto a las herramientas de desarrollo, firebug, proxies, etcétera, para ver que elementos se han almacenado y en caso de que esté mal configurada, reportarlo como hallazgo en una auditaría web y esas cosas. Pero no es ahí donde quería llegar.

¿Qué se guarda en la caché de memoria? de hecho, ¿qué narices es la caché de memoria? ¿cómo se comporta ante las cabeceras mandadas por el servidor? La respuesta es simple: guarda todo, incluso aunque se especifique rigurosamente que no se debe almacenar (Cache-Control: no-store) porque son datos sensibles, como por ejemplo, correos electrónicos de un webmail, mensajes de tuenti, o qué se yo. En el fondo, esto tiene sentido, ya que el estándar dice que esas cabeceras solo se deben de usar para memoria no volátil, así que .. ¿ajo y agua?

Entrada en cache de memoria de página HTTPS (con no-cache)

Claro, para que Firefox funcione ha de usar este tipo de caché, ¿cómo no va a usarla? El problema no es que la use, si no lo sencillo que resulta acceder a la información (about:cache) sin volcar la memoria del proceso a un fichero, ni técnicas hackearianas. Además, parece no liberarla cuando corresponde, ya que al cerrar la pestaña sigue permaneciendo allí... olvidada, esperando ser consultada.

Realmente todo esto no es nuevo y los desarrolladores de Firefox tienen constancia de ello. Hace 3 años debatieron sobre si suponía un problema de seguridad o no y llegaron a una conclusión, que bajo mi punto de vista es errónea por los motivos que ya he expuesto.

Pues nada, tan solo tened en cuenta que si usáis Firefox en un PC que no es el vuestro, no vale con darle a "cerrar sesión" y cerrar la pestaña, si no se cierra por completo el navegador, que el siguiente usuario vea tus secretos, es cuestión de segundos.



9 comments :

Rupia dijo...

No tenía ni idea de que esto pasaba, me parece de risa que lo evaluasen y lo dejasen pasar como si nada.

Xavier Mendez dijo...

Pero, a ver, ¿cómo puede una página externa acceder a la caché en memoria sin explotar un fallo?

Alejandro Ramos dijo...

No, no has entendido lo que he tratado de explicar. Tal vez no haya sido claro.

El problema no es que una página externa acceda. El problema son los equipos compartidos por varios usuarios.

Manu dijo...

se puede poner a "true" el parámetro browser.cache.memory.enable en about:config

Para la cache de disco, la extension Secure Sanitizer hace borrados DoD:

http://lifehacker.com/5687850/speed-up-firefox-by-moving-your-cache-to-ram-no-ram-disk-required

https://addons.mozilla.org/en-us/firefox/addon/secure-sanitizer/

A mi lo que me preocupa es la integridad del fichero de passwords de Firefox. Le ruego al autor que un día exprima sus conocimientos y nos regale un post con este tema, porque en la red la información que hay es muy que confusa. Desde que es inseguro a todo lo contrario. Parece que es viable robarlo con vulnerabilidades y luego abrirlo con fuerza bruta, pero quizás son rumores. ¿Como funciona exactamente este sistema en Firefox?

Un saludo y felicidades por el blog, es una lectura siempre imprescindible.

saudos,

Alejandro Ramos dijo...

Esa sería una opción, si yo gestionase por ejemplo un kiosko de Internet basado en Firefox. Otra es simplemente cerrar y abrir el navegador.

Realmente no son soluciones, son workarounds en caso de que yo como administrador quiera solucionarlo.

Manu dijo...

Lo anterior que comentaba de las extensiones y el parametro no era en absoluto para solucionar el problema, solo era informativo. Algo útil para borrar la cache tras visitar páginas sensibles.

Pero lo dicho, se agradeceria mucho ver un dia un post sobre el asunto del fichero del passwords.



gran blog!!

Manu dijo...

si, tienes toda la razón.. Esta muy bien explicado.

Abajo ya respondia pero se ha solapado (que rapidez) :)


Del asunto de los passwrods, eso sería muy interesante.



gracias!

Xavier Mendez dijo...

Ahora lo entiendo.

Alejandro Ramos dijo...

Tienes toda la razón y seguro que más de uno le es útil. Debería haberlo puesto yo directamente en la entrada, pero ahí queda para el que lo quiera leer ya ;-)

Un saludo y gracias!