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 denominan Spectre y Meltdown. ¿Qué está haciendo Chrome para ayudar a mantener la Web segura y qué deberían hacer los desarrolladores web en sus propios sitios?
TL; DR
Como usuario que navega por la Web, debes asegurarte de mantener el sistema operativo y el navegador actualizados. Además, los usuarios de Chrome pueden considerar 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. Para ello, usa los atributos de cookies
SameSite
yHTTPOnly
, y evita la lectura desdedocument.cookie
. - Asegúrate de que tus tipos de MIME sean correctos y especifica un encabezado
X-Content-Type-Options: nosniff
para todas las URLs con contenido sensible o específico del usuario. Así, podrás aprovechar al máximo el bloqueo de lectura multiorigen para los usuarios que tengan habilitado el aislamiento de sitios. - Habilita el aislamiento de sitios y comunícale al equipo de Chrome si eso causa problemas a tu sitio.
Si te preguntas por qué estos pasos son útiles, sigue leyendo.
El riesgo
Hubo una gran variedad de explicaciones de estas vulnerabilidades, por lo que no agregaré otra. Si te interesa saber cómo se pueden explotar estas vulnerabilidades, te recomiendo que consultes esta entrada de blog de mis colegas del equipo de Google Cloud.
Tanto Meltdown como Spectre pueden permitir que un proceso lea la memoria que no debería poder. A veces, varios documentos de diferentes sitios
pueden terminar compartiendo un proceso en Chrome. Esto puede suceder cuando uno abrió 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 pueda usar estas nuevas vulnerabilidades para leer esos 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 de Spectre se puede reducir considerablemente si se evita que los datos sensibles compartan un proceso con código controlado por el atacante. Para lograrlo, el equipo de Chrome está trabajando en una función llamada "aislamiento de sitios":
El aislamiento de sitios aún no se habilitó de forma predeterminada, ya que hay algunos problemas conocidos, y el equipo de Chrome necesita tantas pruebas de campo como sea posible. Si eres un desarrollador web, deberías habilitar el aislamiento de sitios y verificar si tu sitio sigue funcionando. Si deseas habilitarlo ahora, habilita chrome://flags#enable-site-per-process
. Si encuentras un sitio que no funciona, informa un error para ayudarnos y menciona que tienes habilitado el aislamiento de sitios.
Bloqueo de documentos entre sitios
Incluso cuando todas las páginas entre sitios se colocan en procesos separados, las páginas pueden solicitar legítimamente algunos subrecursos entre sitios, como imágenes y JavaScript. Para evitar que se filtre información sensible, el aislamiento de sitios incluye una función de "bloqueo de documentos entre sitios" que limita las respuestas de la red que se entregan al proceso del procesador.
Un sitio web puede solicitar dos tipos de datos de un servidor: "documentos" y "recursos". Aquí, los documentos son archivos HTML, XML, JSON y de texto. Un sitio web puede recibir documentos de su propio dominio o de otros dominios con encabezados de CORS permisivos. Los recursos incluyen elementos como imágenes, JavaScript, CSS y fuentes. Los recursos se pueden incluir desde cualquier sitio.
La política de bloqueo de documentos entre sitios evita que un proceso reciba “documentos” de otros orígenes en los siguientes casos:
- Tienen un tipo MIME HTML, XML, JSON o de texto o sin formato.
- Tienen un encabezado de respuesta HTTP
X-Content-Type-Options: nosniff
o un análisis de contenido rápido (“sniffing”) confirma que el tipo es correcto. - CORS no permite el acceso al documento de forma explícita
Los documentos que bloquea esta política se presentan en el proceso como vacíos, aunque la solicitud aún se realiza 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. En ese momento, el procesador nota que no es un formato de imagen válido y no procesa una imagen. Sin embargo, con Spectre, ahora existe una manera potencial de leer ese fragmento 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 procesador, ya que el bloqueo de documentos entre sitios bloquea el tipo de MIME.
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 el bloqueo de recursos que se marcaron accidentalmente como documentos, Chrome intenta detectar la respuesta para asegurarse de que el tipo de MIME sea correcto. Este análisis es imperfecto, por lo que, si estás seguro de establecer 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 inicia sesión automáticamente en el usuario. Por lo general, las cookies se envían para todas las solicitudes al sitio web que las establece, incluso si un tercero realiza 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í el nombre). Lamentablemente, al momento de la redacción, solo Chrome y Firefox 58 y versiones posteriores admiten este atributo.
HTTPOnly
y document.cookie
Si las cookies de tu sitio solo se usan del lado del servidor, no del código JavaScript del cliente, existen maneras de evitar que los datos de la cookie ingresen al proceso del renderizador. Puedes establecer el atributo de cookie HTTPOnly
, que evita de manera explícita el acceso a la cookie a través de una 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 renderizado. Para ello, no leas document.cookie
, a menos que sea absolutamente necesario.
Abrir vínculos externos con rel="noopener"
Cuando utilizas target="_blank"
para establecer un vínculo a otra página, la página abierta tiene acceso a tu objeto window
, puede navegar a otra URL y, sin el aislamiento de sitios, el usuario estará en el mismo proceso 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"
.
Temporizadores de alta resolución
Para explotar Meltdown o Spectre, un atacante debe medir cuánto tiempo se tarda en leer un valor determinado de la memoria. Para esto, 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 explotar Spectre, se necesita una secuencia elaborada específicamente de instrucciones para la CPU. El equipo de V8 implementó mitigaciones para pruebas de concepto de ataques conocidas y está trabajando en cambios en TurboFan, su compilador optimizador, que hace que el código generado sea seguro incluso cuando se activan estos ataques. Sin embargo, es posible que se apliquen penalizaciones al rendimiento por estos cambios en la generación de código.
Mantener la seguridad en la Web
Ha habido mucha incertidumbre sobre el descubrimiento de Spectre y Meltdown, y sus implicaciones. Espero que este artículo te ayude a comprender lo que hacen los equipos de Chrome y V8 para proteger la plataforma web y cómo los desarrolladores web pueden ayudar con las funciones de seguridad existentes. Si tienes alguna pregunta, no dudes en contactarme a través de Twitter.