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 seguridad de la Web y qué deben hacer los desarrolladores web por sus propios sitios?
Resumen
Como usuario que explora la Web, debes asegurarte de mantener actualizado 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 renderizador con los atributos de cookies
SameSite
yHTTPOnly
, y evita leer desdedocument.cookie
. - Asegúrate de que tus tipos de MIME sean correctos y especifica un encabezado
X-Content-Type-Options: nosniff
para las URLs con contenido sensible o específico del usuario para aprovechar al máximo el bloqueo de lectura entre orígenes para los usuarios que tienen habilitado el aislamiento de sitios. - Habilita el aislamiento de sitios y avísale al equipo de Chrome si causa problemas en tu sitio.
Si te preguntas por qué estos pasos son útiles, sigue leyendo.
El riesgo
Hay una amplia variedad de explicaciones sobre estas vulnerabilidades, por lo que no voy a agregar otra. Si te interesa saber cómo se pueden aprovechar estas vulnerabilidades, te recomiendo que leas la entrada de blog de mis colegas del equipo de Google Cloud.
Tanto Meltdown como Spectre permiten que un proceso lea memoria que no debería poder leer. A veces, varios documentos de diferentes sitios pueden compartir 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, es posible que otro sitio use estas nuevas vulnerabilidades para leer esos datos.
Mitigaciones
El equipo de ingeniería de Chrome y V8 está implementando varios esfuerzos para mitigar esta amenaza.
Aislamiento de sitios
El impacto de aprovechar Spectre de forma exitosa se puede reducir en gran medida si se evita que los datos sensibles compartan un proceso con código controlado por atacantes. El equipo de Chrome trabajó en una función para lograr esto 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 desea realizar tantas pruebas de campo como sea posible. Si eres desarrollador web, debes habilitar el aislamiento de sitios y verificar si tu sitio sigue funcionando. Si quieres habilitar esta opción ahora, habilita chrome://flags#enable-site-per-process
. Si encuentras un sitio que no funciona, informa un error 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 aún pueden solicitar, de forma legítima, 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 red que se entregan al proceso del renderizador.
Un sitio web puede solicitar dos tipos de datos a 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 impide que un proceso reciba “documentos” de otros orígenes en los siguientes casos:
- Tienen un tipo MIME HTML, XML, JSON o texto sin formato.
- Tienen un encabezado de respuesta HTTP
X-Content-Type-Options: nosniff
o un análisis de contenido rápido ("recolección de información") que confirma que el tipo es correcto. - CORS no permite de forma explícita el acceso al documento.
Los documentos que bloquea esta política se presentan al proceso como vacíos, aunque la solicitud 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 cuyo momento el renderizador nota que no es un formato de imagen válido y no renderiza una imagen. Sin embargo, con Spectre, ahora hay una manera de leer ese fragmento de memoria. El bloqueo de documentos entre sitios impediría que el contenido de este archivo ingrese a la memoria del proceso en el que se ejecuta el renderizador, ya que el tipo MIME está bloqueado por el bloqueo de documentos entre sitios.
Según las métricas de los usuarios, hay muchos archivos JavaScript y CSS que se entregan con tipos de MIME text/html
o text/plain
. Para evitar bloquear recursos que se marcaron accidentalmente como documentos, Chrome intenta detectar la respuesta para asegurarse de que el tipo de MIME sea correcto. Este espionaje es imperfecto, por lo que, si tienes la certeza de que estás configurando 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 le permite acceder automáticamente al usuario. Por lo general, las cookies se envían para todas las solicitudes al sitio web que las configura, 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 debe adjuntarse a una solicitud que se origina en el mismo sitio, de ahí el nombre. Lamentablemente, en el momento de escribir este artículo, solo Chrome y Firefox 58 y versiones posteriores admiten este atributo.
HTTPOnly
y document.cookie
Si las cookies de tu sitio solo se usan en el servidor, y no por el cliente JavaScript, existen formas de evitar que los datos de la cookie ingresen al proceso del renderizador. Puedes configurar el atributo de cookie HTTPOnly
, que evita de forma explícita 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 los datos de carga de cookies al proceso renderizado si no lees document.cookie
, a menos que sea absolutamente necesario.
Cómo abrir vínculos externos con rel="noopener"
Cuando vinculas a otra página con target="_blank"
, la página abierta tiene acceso a tu objeto window
, puede navegar a una URL diferente y, sin el aislamiento de sitios, 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"
.
Cronómetros de alta resolución
Para aprovechar Meltdown o Spectre, un atacante debe medir cuánto tiempo tarda en leer un valor determinado 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 dificultar el montaje de los ataques.
Otra forma de obtener un temporizador de alta resolución es usar un SharedArrayBuffer. Un trabajador dedicado usa el búfer para incrementar 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 aprovechar Spectre, se necesita una secuencia de instrucciones de la CPU creada específicamente. El equipo de V8 implementó mitigaciones para 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 tener una penalización de rendimiento.
Mantén la Web segura
Hubo mucha incertidumbre en torno al descubrimiento de Spectre y Meltdown y sus implicaciones. Espero que este artículo arroje algo de luz sobre lo que hacen los equipos de Chrome y V8 para mantener la seguridad de la plataforma web y cómo los desarrolladores web pueden ayudar con las funciones de seguridad existentes. Si tienes alguna pregunta, no dudes en comunicarte conmigo por Twitter.