Meltdown/espectro

Descripción general

El 3 de enero, Project Zero reveló vulnerabilidades en las CPU modernas que un proceso puede usar para leer (en el peor de los casos) memoria arbitraria, incluida la memoria que no pertenece a ese proceso. Estas vulnerabilidades se llamaron Spectre y Meltdown. ¿Qué hace Chrome para ayudar a mantener la Web segura y qué deben hacer los desarrolladores web por sus propios sitios?

Resumen

Como usuario que navega en la Web, debes asegurarte de mantener actualizados el sistema operativo y el navegador. Además, los usuarios de Chrome pueden habilitar el aislamiento de sitios.

Si eres desarrollador web, el equipo de Chrome recomienda lo siguiente:

  • Cuando sea posible, evita que las cookies ingresen a la memoria del proceso del procesador usando los atributos de cookies SameSite y HTTPOnly, y evitando la lectura desde document.cookie.
  • Asegúrate de que los tipos de MIME sean correctos y especifica un encabezado X-Content-Type-Options: nosniff para las URLs con contenido sensible o específico para el usuario a fin de aprovechar al máximo el bloqueo de lectura entre dominios para los usuarios que tienen habilitado el aislamiento de sitios.
  • Habilita el aislamiento de sitios e informa al equipo de Chrome si esto genera problemas en tu sitio.

Si te preguntas por qué estos pasos son útiles, sigue leyendo.

El riesgo

Ha habido una gran variedad de explicaciones de estas vulnerabilidades, por lo que no voy a agregar una más. Si te interesa saber cómo se pueden aprovechar estas vulnerabilidades, te recomiendo consultar la entrada de blog de mis colegas del equipo de Google Cloud.

Tanto Meltdown como Spectre podrían permitir que un proceso lea la memoria que no debería poder hacerlo. A veces, varios documentos de diferentes sitios pueden terminar compartiendo un proceso en Chrome. Esto puede ocurrir cuando uno abre el otro con window.open, <a href="..." target="_blank"> o iframes. Si un sitio web contiene datos específicos del usuario, existe la posibilidad de que otro sitio utilice estas vulnerabilidades nuevas para leer los datos del usuario.

Mitigaciones

El equipo de ingeniería de Chrome y V8 está implementando varias iniciativas para mitigar esta amenaza.

Aislamiento de sitios

El impacto de aprovecharse correctamente Spectre se puede reducir considerablemente si se evita que los datos sensibles compartan un proceso con código controlado por el atacante. El equipo de Chrome ha estado trabajando en una función para lograrlo, llamada "Aislamiento de sitios":

El aislamiento de sitios aún no se habilitó de forma predeterminada porque existen algunos problemas conocidos y al equipo de Chrome le gustaría realizar tantas pruebas de campo como sea posible. Si eres desarrollador web, debes habilitar el aislamiento de sitios y verificar si sigue funcionando. Si quieres habilitarlo ahora, habilita chrome://flags#enable-site-per-process. Si encuentras un sitio que no funciona, ayúdanos informando un error y menciona que tienes habilitado el aislamiento de sitios.

Bloqueo de documentos entre sitios

Incluso cuando todas las páginas de varios sitios se colocan en procesos separados, las páginas pueden solicitar de forma legítima algunos subrecursos entre sitios, como imágenes y JavaScript. Para evitar que la información sensible filtre esta información, el aislamiento de sitios incluye una función de “bloqueo de documentos entre sitios” que limita las respuestas de red que se entregan al proceso del procesador.

Un sitio web puede solicitar dos tipos de datos de un servidor: “documentos” y “recursos”. Estos son archivos HTML, XML, JSON y archivos de texto. Un sitio web puede recibir documentos de su propio dominio o de otros dominios con encabezados de CORS permisivos. Los recursos incluyen imágenes, JavaScript, CSS y fuentes. Los recursos se pueden incluir desde cualquier sitio.

La política de bloqueo de documentos entre sitios impide que un proceso reciba “documentos” de otros orígenes en los siguientes casos:

  1. Tienen un tipo de MIME HTML, XML, JSON o de texto o sin formato.
  2. Tienen un encabezado de respuesta HTTP X-Content-Type-Options: nosniff o un análisis de contenido rápido (“analizar”) confirma que el tipo es correcto.
  3. CORS no permite explícitamente el acceso al documento

Los documentos bloqueados por esta política se presentan en el proceso como vacíos, aunque la solicitud aún ocurre en segundo plano.

Por ejemplo, imagina que un atacante crea una etiqueta <img> que incluye un archivo JSON con datos sensibles, como <img src="https://yourbank.com/balance.json">. Sin el aislamiento de sitios, el contenido del archivo JSON llegaría a la memoria del proceso del renderizador, momento en el cual el procesador nota que no es un formato de imagen válido y no renderiza una imagen. Sin embargo, con Spectre, ahora existe una manera de leer ese bloque de memoria. El bloqueo de documentos entre sitios evitaría que el contenido de este archivo ingrese a la memoria del proceso en el que se ejecuta el renderizador porque el tipo de MIME está bloqueado por el bloqueo de documentos entre sitios.

Según las métricas del usuario, hay muchos archivos JavaScript y CSS que se entregan con tipos de MIME text/html o text/plain. Para evitar bloquear recursos que se marcan accidentalmente como documentos, Chrome intenta detectar la respuesta a fin de asegurarse de que el tipo de MIME sea correcto. Este sniffing es imperfecto, por lo que, si estás seguro de configurar los encabezados Content-Type correctos en tu sitio web, el equipo de Chrome recomienda agregar el encabezado X-Content-Type-Options: nosniff a todas tus respuestas.

Si quieres probar el bloqueo de documentos entre sitios, habilita el aislamiento de sitios como se describió anteriormente.

SameSite cookies

Volvamos al ejemplo anterior: <img src="https://yourbank.com/balance.json">. Esto solo funciona si tubanco.com almacenó una cookie que registra automáticamente al usuario. Por lo general, las cookies se envían para todas las solicitudes al sitio web que las establece, incluso si un tercero hace la solicitud con una etiqueta <img>. Las cookies de SameSite son un atributo nuevo que especifica que una cookie solo se debe adjuntar a una solicitud que se origina en el mismo sitio, de ahí su nombre. Lamentablemente, en el momento de la redacción, solo Chrome y Firefox 58 y versiones posteriores son compatibles con este atributo.

HTTPOnly y document.cookie

Si las cookies de tu sitio solo se usan en el servidor, no por el JavaScript del cliente, existen maneras de evitar que los datos de la cookie ingresen al proceso del procesador. Puedes establecer el atributo de cookie HTTPOnly, que evita explícitamente que se acceda a la cookie a través de la secuencia de comandos del cliente en navegadores compatibles, como Chrome. Si no es posible configurar HTTPOnly, puedes ayudar a limitar la exposición de la carga de datos de cookies al proceso procesado si no lees document.cookie, a menos que sea absolutamente necesario.

Cuando vinculas a otra página con target="_blank", la página abierta tiene acceso a tu objeto window y puede navegar por tu página a una URL diferente. Sin el aislamiento de sitios, el proceso será el mismo que tu página. Para proteger mejor tu página, los vínculos a páginas externas que se abren en una ventana nueva siempre deben especificar rel="noopener".

Cronómetros de alta resolución

Para aprovecharse de Meltdown o Spectre, un atacante necesita medir cuánto tiempo lleva leer un determinado valor de la memoria. Para ello, se necesita un temporizador confiable y preciso.

Una API que ofrece la plataforma web es performance.now(), que tiene una precisión de 5 microsegundos. Como mitigación, todos los navegadores principales disminuyeron la resolución de performance.now() para que sea más difícil activar los ataques.

Otra forma de obtener un temporizador de alta resolución es usar un SharedArrayBuffer. Un trabajador dedicado usa el búfer para aumentar un contador. El subproceso principal lee este contador y lo usa como temporizador. Por el momento, los navegadores decidieron inhabilitar SharedArrayBuffer hasta que se implementen otras mitigaciones.

V8

Para aprovecharse de Spectre, se necesita una secuencia de instrucciones de CPU creada específicamente. El equipo de V8 implementó mitigaciones para las pruebas de concepto de ataques conocidas y está trabajando en cambios en TurboFan, su compilador de optimización, que hacen que su código generado sea seguro incluso cuando se activan estos ataques. Sin embargo, estos cambios en la generación de código pueden afectar el rendimiento.

Preservación de la seguridad de la Web

Ha habido mucha incertidumbre en torno al descubrimiento de Spectre y Meltdown, y sus implicaciones. Espero que este artículo arroje algo de información sobre lo que los equipos de Chrome y V8 están haciendo para mantener segura la plataforma web y cómo los desarrolladores web pueden ayudar con las funciones de seguridad existentes. Si tienes alguna pregunta, comunícate conmigo en Twitter.