¿ Qué es ZombieLoad, la nueva vulnerabilidad de los procesadores Intel ?

Las cuatro nuevas vulnerabilidades de los procesadores Intel, denominadas ZombieLoad solamente se pueden mitigar desactivando HyperThreading.

Ayer mismo se revelaron cuatro nuevas vulnerabilidades en los procesadores Intel. Estas nuevas vulnerabilidades en su conjunto han sido denominadas ZombieLoad. Dicho sistema es un novedoso ataque tipo Meltdown para los procesadores Intel que permite explotar las unidades lógicas de la memoria de relleno. El análisis de los investigadores muestra que cargando instrucciones fallidas se puede derivar en una transmisión de datos a destinos no autorizados previamente introducidos en el buffer o la unidad lógica del procesador.

Han comprobado que ZombieLoad en una gran cantidad de procesadores, de sistemas operaciones, de procesos de virtualización y enclaves SGX. Los investigadores han planteado diferentes formas de mitigar esta vulnerabilidad. Han llegado a la conclusión que solo se puede corregir mediante la desactivación de HyperThreading. Este es el único mecanismo para prevenir un ataque extremadamente fuerte en los procesadores actuales

¿Qué nos aporta la documentación publicada?

El documento presentado por los investigadores detalla:

Presentación de ZombieLoad, un potente ataque de muestreo de datos filtrando datos que se pueden acceder en el mismo o en el HyperThreading

Combinación del muestreo de datos incidenciales dentro de un dominio transitorio para construir un flujo de información especifico similar a los ataques regulares de fusión

Demostración de ZombieLoad en varios escenarios del mundo real: cross-process, cross-VM, user-to-kernel y SGX

Demostración de que ZombieLoad puede romper las garantías de seguridad proporcionado por Intel SGX

Pos-procesamiento de los datos filtrados dentro del dominio transitorio

Los investigadores además en la documentación destacan que:

El 28 de marzo de 2018 se le da a Intel una Prueba de Concepto de la memoria de tipo no almacenable de un HyperThread.

El 30 de mayo de 2018 se aclara a Intel la atribución de la fuga a LFB. Los experimentos realizados demuestran que funciona igual que Foreshadow (Meltdown-P) socavando la integridad de las mitigaciones para la caché L1. Intel lo reconoce y se certifica como CVE-2019-11091

Reportado a Intel el 12 de abril de 2019 la prueba de un potencial ataque, reconocido y verificado por Intel. Queda catalogado como CVE-2018-12130

El 14 de mayo de 2019 termina el embargo

Precedente de Meltdown

La vulnerabilidad Meltdown presente en los procesadores Intel fue descubierta en 2017 y presentada en 2018. Este es el primer ataque que consiguió romper la seguridad a nivel de microarquitectura. Dicha brecha de seguridad permite la fuga de datos entre el usuarios y el kernel.

Se consiguió corregir Meltdown mediante un aislamiento más fuerte entre el usuario y el kernel. El resultado subyacente de este aumento de aislamiento fue la posibilidad de toda clase de ataques de ejecución transitoria.

Durante el último año los investigadores han demostrado que los ataques tipo Meltdown no solo filtran los datos del kernel a un espacio de usuario. Este tipo de ataques también ofrece fuga de datos a través de los procesos de usuario, virtual y enlaces.

No se accede únicamente a los datos de caché L1, filtrando estos datos. Se puede acceder también a otros elementos arquitectónicos como el archivo de registro, el buffer de llenado de línea y los procesos de trabajo recurrente como puede ser el buffer de almacenamiento.

Flujo de instrucciones en los procesadores modernos

Actualmente los procesadores pueden alterar el flujo de las instrucciones manteniendo la equivalencia arquitectónica. Esto genera una ilusión de que la maquina conserva un orden. Se detectan también las instrucciones que previamente han sido ejecutadas en el procesador, así plantea una excepción para evitar a ejecutar la instrucción.

Las instrucciones siguientes a la instrucción de falla (instrucciones transitorias), retroceden. Dicho retroceso asegura que no hay efectos arquitectónicos. Los efectos secundarios podrían permanecer en el estado microarquitectónico. Las fugas de datos de Meltdown explotan agresivamente las optimizaciones de rendimiento respecto a la ejecución fuera de orden.

Inexistencia de investigaciones de seguridad microarquitectónicas

Durante años el estado microarquitectónico se consideraba inevitable para las aplicaciones, existiendo consideraciones de seguridad limitadas al estado arquitectónico. Explicado en otras palabras, no existían investigaciones a nivel de microarquitectura, se centraba todo a nivel de arquitectura. La microarquitectura no tiene capacidad de distinguir entre diferentes aplicaciones o niveles de privilegio.

Los investigadores en la documentación han comprobado en primer lugar que no hay buffers microarquitectónicos inexplorados. En segundo lugar han explotado fallos arquitectónicos y microarquitectónicos.

Los fallos de memoria a nivel microarquitectónico provocan que una petición de memoria pueda ser reeditado internamente sin llegar a ser visible desde el punto de vista arquitectónico. Esto demuestra que los ataques Meltdown puede darse sin problemas sin plantear una excepción arquitectónica como un fallo de página.

Fundamento de ZombieLoad

Han conseguido los investigadores de ZombieLoad, permite realizar un ataque Meltdown dirigido a la lógica del buffer de llenado. ZombieLoad permite explotar instrucciones de carga sin necesidad de una reedición internamente. Primeramente se pueden calcular transitoriamente los valores anticuados que aparecen de operaciones de memoria anteriores, siendo de memoria actual o pasada.

Mediante estas técnicas de ejecución transitoria, los atacantes pueden recuperar estos valores ‘zombie’ establecidos en operaciones de carga. Cabe destacar que a diferencia de todos los ataques de ejecución transitoria conocidos, ZombieLoad revela los datos recientes sin adherirse a ningún selector explicito basado en direcciones.

Se puede considerar que ZombieLoad permite un nuevo ataque de muestreo de datos microarquitectónicos. El muestreo de datos microarquitectónicos de este tipo de ataque son el eslabón perdido entre los métodos de ataque convencionales y los basados en la memoria Schwarz.

Estos ataques correlacionan las direcciones de datos dentro de la ejecución de una víctima y los ataques de ejecución transitoria de tipo Meltdown existentes que pueden recuperar valores directamente de datos que aparecen en una dirección explicita.

Ataques en los procesadores Intel

Se demuestra en la documentación la implicación de este tipo de ataques en una multitud de escenarios de ataques prácticos filtrados mediante procesos, límites de privilegio e incluso mediante los núcleos lógicos del procesador.

Los investigadores han demostrado que se pueden filtrar datos del enclave Intel SGX cargados desde un núcleo lógico hermano. Quieren realicen uno de estos tipos de ataque ZombieLoad, pueden extraer las claves de sellado del enclave de citas arquitectónicas de Intel. Se rompe en última instancia la confidencialidad y certificación remota de SGX.

No se limita solo al código nativo, también funciona más allá de los límites de la virtualización. Esto permite atacar no solo al núcleo que contiene una máquina virtual, sino también las máquinas virtuales que se ejecutan en núcleos hermanos.

Así los investigadores han concluido que desactivar HyperThreading, además de purgar diferentes estados microarquitectónicos durante las interrupciones de contexto, es lo único que se puede hacer para evitar uno de estos potentes ataques.

Versiones de ZombieLoad

ZombieLoad es una carga que dispara un microcódigo de asistencia, lo que resulta en una carga transitoria que contiene datos erróneos. Se refieren a esta como una carga zombie. Las cargas zombie, son cargas de falla arquitectónica o microarquitectónica, y por lo tanto no pueden completarse, requiriendo que se vuelva a emitir la carga más tarde. Se identifican diferentes escenarios para crear cargas zombie para un ataque exitoso. Las variantes tienen en común que abusan de la instrucción ‘clflush’ para crear de forma fiable las condiciones necesarias para la fuga.

Versión 1. Mapeado del Kernel

La primera variante de ZombieLoad no necesita de ninguna característica específica del procesador. Solo se necesita una dirección virtual del kernel, una dirección a la que el usuario puede acceder, pero no está configurado en la entrada de la tabla de paginación.

Para el test se ha realizado una paginación de 2MB de tamaño. Esto no quiere decir que se necesite un documento de paginación de gran tamaño para explotar esta vulnerabilidad, se puede hacer con una paginación de 4kB. Lo que si se requiere es que el usuario tenga acceso de lectura al contenido de la página física mediante una dirección virtual diferente.

La configuración de acceso mediante la dirección virtual accesible por el usuario proporciona una manera arquitectónicamente valida de acceso a los contenidos de la misma. Se accede a la misma mediante una dirección de kernel de la carga zombie similar a Meltdown requiriendo asistencia por microcódigo.

Existen diferentes maneras de construir direcciones accesibles, pero solo lo han conseguido explotar mediante las cargas que se originan a partir del mapeo del kernel.

Versión 2: Paseo por la tabla de paginación asistido por microcódigo

Tenemos la variante que permite activar la visita a una tabla de paginación asistida por microcódigos. Pasear por la tabla de parición requiere de una actualización del acceso o bit sucio en la entrada de la tabla de paginación, para acceder al asistente de microcódigo.

Se requerirá en este caso de una paginación física que tenga dos direcciones virtuales. Puede conseguirse fácilmente usando un segmento de memoria compartida o un archivo de mapa de memoria, que se asigna dos veces en la aplicación.

La primera dirección virtual puede ser usada para acceder al contenido de la página arquitectónicamente. Para la segunda tendremos que borrar el bit de acceso en la entrada de la tabla de paginación. Linux no permite esto en caso de un atacante que no tenga privilegios, por lo tanto este ataque solo podar ser usado por un atacante que asumamos tiene privilegios. Se ha verificado que Windows 10 (1803 build 17134.706) borra periódicamente los bits a lo que se han accedido.

Por parte de los investigadores se ha sabido que es el algoritmo de reemplazo de paginación quien realiza esto. Así se concluye que este ataque a la tabla de paginación de Windows es solo para usuarios no privilegiados.

Cuando se accede a la página mediante una segunda dirección virtual, la opción de bit de acceso a la entrada de la tabla de página debe ser configurado. Esto no puede ser realizado por el gestor de página perdida. Desde el punto de vista microarquitectónico, se produce un fallo de carga y se activa un asistente de microcódigo. Este repite el recorrido de la tabla de paginación y ajusta el bit de acceso.

Si el acceso de la segunda dirección se realiza de forma transitoria, es decir, detrás de una rama mal especulada o después de una excepción, el bit al que se ha accedido no se puede configurar. La fuga así no solo se puede explotar una vez, sino que da acceso ilimitado al lugar.

Procesadores usados para el estudio

Se han evaluado diferentes variantes de ZombieLoad sobre diferentes entornos. Se han probado procesadores Sandy Bridge (lanzamiento en 2012) hasta Cascade Lake (lanzamiento en 2019). Los investigadores han realizado ataques con las dos variantes. La variante 2 de ZombieLoad no ha afectado a procesadores Whiskey Lake, Coffee Lake-Refresh y Cascade Lake-SP.

Nota: Se ha usado un procesador por arquitectura de Intel en litografía de 14nm como representante de toda la familia de procesadores. Whiskey Lake, Coffee Lake Resfresh y Casacade Lake-SP son los procesadores más modernos supuestamente inmunes a Meltdown.

Conclusión

ZombieLoad es un novedoso sistema de ataque tipo Meltdown que apunta a la lógica del buffer del procesador. Permite al atacante filtrar los valores cargados recientemente por los núcleos físicos o los lógicos. Se demuestra que se permite la filtración mediante el espacio de usuario en procesadores, máquinas virtuales y enlaces SGX.

Se puede ver el gran potencia de ataque mediante la monitorización del comportamiento del navegador, extracción de claves AES, el establecimiento de una máquina virtual cruzada o recuperando las llaves de sellado de SGX. Además se concluye que la única posibilidad para mitigar ZombieLoad es desactivar el HyperThreading.