Spook.js: una historia de terror

Cómo funciona Spook.js, el primer ataque basado en Spectre.

Un ataque de phishing tiene sentido: haces clic en un enlace, llegas a una página maliciosa, introduces información y un atacante la roba. Pero imagínate que con tan solo hacer clic en un enlace, un atacante pudiera robar tus datos. . Pues está pasando, hoy te hablamos de las páginas maliciosas que explotan una función fundamental de  la CPU para robar datos sin que la víctima siquiera los introduzca. Además, esta vulnerabilidad en cuestión es muy difícil, si no imposible, de solucionar.

En el 2018, un grupo de investigadores demostraron que esta situación era teóricamente posible y revelaron las dos primeras variantes de la vulnerabilidad Spectre. Tres años después, en septiembre del 2021, se vio el primer ataque en la vida real usando Spectre v1. Conocido como Spook.js, el concepto de ataque es complicado, pero intentaremos desarmarlo.

Antecedentes de Spectre v1

La noticia de los dos primeros ataques de esta familia, Spectre y Meltdown, surgieron en el 2018.  Los ataques explotaron el mecanismo de predicción de rama, que está diseñado para acelerar la ejecución de los comandos y que se encuentra en todas las CPU modernas.

Logotipo de la vulnerabilidades Spectre

Cuando un usuario introduce una contraseña para iniciar sesión en un sitio web, si la contraseña es correcta, se ejecuta un conjunto de instrucciones. Si no es así, se ejecuta otro conjunto. Sin embargo, y aquí es donde entra en juego la predicción de la rama, antes de recibir la respuesta, la CPU comienza a ejecutar el conjunto de instrucciones que cree que probablemente necesitará.

En nuestro ejemplo, si la contraseña ya se ingresó correctamente cien veces, la CPU asumirá que está vez no será diferente. Si la adivina correctamente, el usuario obtiene un aumento de rendimiento. De lo contrario, la CPU descarta las instrucciones ejecutadas especulativamente y ejecuta el otro conjunto.

En un ataque de vulnerabilidad de Spectre, se intenta leer un área de datos a la que el programa no tiene acceso. En la primera etapa del ataque, se realizan múltiples llamadas a áreas de datos de acceso abierto, por lo que el sistema de predicción de sucursales está “entrenado” para realizar también la operación de lectura prohibida. Al usar la predicción de la rama, la CPU realiza la operación por adelantado porque está acostumbrada a que el programa solicite leer datos que en realidad se le permite leer. Pero una comprobación revela que el programa tiene prohibido acceder a los datos, por lo que los cálculos ejecutados especulativamente se descartan. Hasta ahora todo va bien, pero los datos leídos por la CPU se almacenan durante cierto tiempo en el caché, la propia memoria de la CPU.

Ahora viene la parte más interesante: incapaz de leer los datos confidenciales de la memoria caché de la CPU directamente, el proceso malicioso implementa un llamado ataque de canal lateral para robarlos. Eso implica medir la velocidad de acceso a cierta información. Si es relativamente lenta, significa que los datos se encuentran en el caché.  Si el rápida, se carga desde la RAM regular. Una secuencia determinada de intentos de lectura da como resultado una filtración de la información secreta.

El resultado es un error fundamental de la CPU cuya única solución es deshabilitar la predicción de ramas por completo, lo que afecta seriamente el rendimiento. Habiendo dicho esto, los ataques de Spectre presentan muchas limitaciones:

  • El atacante debe ser capaz de ejecutar el código del programa en la computadora o dispositivo móvil objetivo.
  • El ataque requiere un programa objetivo específico codificado para crear las condiciones para un ataque exitoso.
  • Aunque el atacante tuviera éxito, la extracción de datos es extremadamente lenta (decenas o cientos de bytes por segundo) y los errores de lectura son muy posibles.
  • En general, el robo de datos secretos intencionado, como contraseñas, claves de cifrado, etc., requiere una combinación de condiciones.

Spook.js: el uso en la vida real de Spectre v1

Podríamos concluir que Spectre no es tan peligroso. Después de todo, si un atacante puede ejecutar código en una computadora objetivo, explotar una de las muchas vulnerabilidades en el sistema operativo o los programas instalados para escalar privilegios y robar datos sería mucho más sencillo.

Esto es cierto, pero las páginas web actuales también contienen grandes cantidades de código de programa que se ejecuta en la computadora del usuario, en el navegador. Así es como los ataques Spook.js aprovechan la vulnerabilidad Spectre v1: se carga una página infectada, el navegador ejecuta el código y el cibercriminal roba datos confidenciales.

Los autores del informe demostraron algunos ataques prácticos. Primero, robaron una contraseña de usuario de Tumblr. Después, robaron datos de Lastpass. Y en tercer lugar, interceptaron una imagen subida por un usuario desde un almacenamiento privado en un servidor de Google.

Una característica del navegador Google Chrome hizo que todo fuera posible. Desde la publicación de información sobre Spectre, los desarrolladores de Chrome han tomado medidas para evitar posibles ataques al obligar a los sitios web a cargarse de forma aislada. Debido a que cada sitio web crea su propio proceso, el código malicioso de una página no se puede utilizar para robar datos de otro recurso. Pero hay una excepción: varias páginas del mismo sitio o dominio se agrupan en un proceso de navegador común. Si el código malicioso (escrito en JavaScript, de ahí el .js en el nombre del ataque) se ejecuta en uno de ellos, se pueden robar datos de otras páginas.

El ataque de Spectre.js en Tumblr

Como blog colectivo, Tumblr puede albergar código malicioso, al menos en teoría. De esta forma, con una página maliciosa abierta en una pestaña, si un usuario intenta iniciar sesión en su cuenta en otra pestaña del servicio, el navegador guarda y completa automáticamente el nombre de usuario y la contraseña, que después el código malicioso puede robar.

Al explotar la vulnerabilidad Spectre, un ataque puede interactuar tangencialmente con otra pestaña del mismo sitio y robar datos por medios indirectos. Un ataque exitoso con esta estrategia casi no deja rastros.

El ataque de Spectre.js en LastPass

El ataque en el administrador de contraseñas LastPass fue diferente porque el código para robar datos usando Spectre v1 estaba incrustado en una extensión maliciosa para Google Chrome. La extensión LastPass también se estaba ejecutando en el navegador. En algunos casos, las extensiones también se ejecutan en un proceso de navegador común, lo que hace posible el robo de datos.

El ataque de Specter.js en Google Cloud Storage

Otro ejemplo utiliza ataques al almacenamiento en la nube de Google: una pestaña del navegador contiene una página maliciosa alojada en sites.google.com; otra permite a los usuarios cargar imágenes en su almacenamiento privado en el servicio G Suite. En esta situación, un atacante puede utilizar código malicioso para obtener acceso a las imágenes.

Limitaciones del método

Los investigadores han demostrado cómo se puede llevar a cabo el ataque en diferentes CPU, incluidas varias modernas de Intel e incluso la nueva M1 de Apple basada en ARM. En todos los casos, el ataque se realizó en Google Chrome. En principio, varias características únicas del navegador hacen posible Spook.js. Otros navegadores basados en Chromium, como Microsoft Edge, también son vulnerables a este ataque.

Sin embargo, existen ciertas limitaciones. La primera es la baja velocidad del robo de datos (de 400 a 600 bytes por segundo, dependiendo de la CPU), motivo por el cual el archivo objetivo en la última demostración es muy pequeño. La segunda es la gran cantidad de errores al robar los datos de  la memoria caché de la CPU. Hasta 4% de los datos es incorrecto, de ahí, los artefactos en la copia robada de la imagen.

El ataque no funciona en los procesadores AMD o en Mozilla Firefox, cuyo motor JavaScript funciona de otra manera. Los investigadores no descartan la posibilidad de un ataque exitoso sobre los chips AMD y el navegador Firefox, pero para comprobarlo habrá que profundizar en la materia.

Por último, un ataque requiere cargar código malicioso en una página con el mismo nombre de dominio, como en el caso de blogs o hosting colectivos. Por tanto, es probable que la aplicación de este método no funcione en, por ejemplo, un banco.

No hay motivo para entrar en pánico

El estudio de Spook.js es importante porque los investigadores, por primera vez, han podido demostrar una situación bastante realista para la explotación de una de las vulnerabilidades de Spectre. Sin embargo, las posibilidades de un ataque en el mundo real son bajas. En primer lugar, los desarrolladores de Google Chrome, a raíz de esta investigación, reforzaron el mecanismo para aislar los sitios cargados unos de otros. Y, en segundo lugar, los cibercriminales tienen muchas formas más fáciles de robar datos de los usuarios, desde el malware tradicional hasta la ingeniería social, y esta requiere un conocimiento serio del funcionamiento de bajo nivel de las CPU modernas.

Como un trabajo científico, Spook.js está configurado para alterar el panorama del software mediante la introducción de nuevas recomendaciones para la seguridad del sitio web (por ejemplo, los autores proponen mover las páginas de autorización a un nombre de dominio aislado). Los estudios posteriores pueden encontrar formas de facilitar un poco los ataques, pero lo más probable es que conduzcan a más rondas de mejoras de seguridad. Incluso aunque las vulnerabilidades de tipo Spectre puedan explotarse en masa, los medios de protección serán los mismos que para cualquier malware. Los proveedores de seguridad simplemente agregarán los nuevos tipos de ataques a la lista de los que serán supervisados y bloqueados antes de su ejecución.

También es posible que algún día los investigadores se encuentren con una característica de las vulnerabilidades similares a las de Spectre que requieran una revisión importante de todo el ecosistema informático moderno. Eso, sin embargo, sigue siendo poco probable. No olvidemos que se necesitaron tres años para pasar de una vulnerabilidad teórica al primer ataque práctico (el cual incluso es un ataque con muchas limitaciones).

Spectre también puede usarse para ataques dirigidos en los que el beneficio potencial de los datos robados excede los costes de la operación. Incluso aunque este escenario sea relevante para tu organización, puedes dificultar fácilmente los ataques utilizando diferentes navegadores para diferentes contenidos. Por ejemplo, no abras páginas y servicios web con información confidencial en el mismo navegador donde te entretienes online. La mejor opción es gestionar la información confidencial en un entorno aislado, en una máquina virtual o simplemente en un dispositivo aislado.

Consejos