GoFetch: Cómo extraer claves RSA con Data Memory-Dependent Prefetch en los Apple Serie-M
Reconozco que cuando leí que había un – Exploit que afecta a un bug de Hardware similar a Meltdown, Spectre, Spectre_v1 y el reciente GhostRace que no era parcheable, miré a mi nuevo y flamante Macbook Book Pro M3 y pensé en si me lo cambiaba o no. Pero la verdad es que al final los bugs y exploits de hardware son algo en lo que estamos aún en la punta del témpano de hielo, como dice mi amigo. A este exploit se le llama GoFetch, y el resultado y la idea es espectacular.
La idea se basa en explotar una funcionalidad que viene en los microprocesadores modernos llamada DMP (Data Memory-Dependent Prefetch), o lo que es lo mismo, cargar en la Cache del Microprocesador las direcciones de memoria que se van a acceder para acelerar la ejecución de los programas, haciendo que el dato esté disponible antes de que se utilice en el caché más rápida del equipo, la que se encuentra en el microprocesador.
Figura 2: Mi flamante MacBook Pro M3 Pro es vulnerable
a GoFetch, y aunque se ha publicado un workaround que ya he
instalado, el fallo es «Unpatchable»
Esta idea de prefecthing es algo que se utiliza en todas las disciplinas, y los vinisteis a la última charla de b, yo os conté como hicimos con Juan Antonio Calles un proyecto en el año 2008 de Prefetching Web Browsing, que visto esto, merece la pena que os cuente en un artículo a parte. En los microprocesadores también hay prefetching, y se llama DMP, pero no se sabe muy bien cómo funciona el algoritmo de predicción que tiene cada uno de los microprocesadores.
En el mes de Mayo de 2022 se publicó el trabajo de «Augury: Using data memory-dependent prefetchers to leak data at rest«, donde explicaba básicamente un ataque bastante sencillo de entender, más difícil de implementar. La idea es tan sencilla como que si existe un módulo llamado DMP que, basado en los datos que acceden los programas, entonces existen direcciones de memoria predictivas almacenadas en la Caché-L1 del microprocesador que no ha sido invocada por nadie.
Para ello, «sólo» hay que introducir un programa que lleve un patrón de accesos, que nos permita inferir qué va a cargar el DMP. Este imagen muestra que si nosotros accedemos a determinadas direcciones en memoria, entonces el DMP va a traer a la Caché-L1 del microprocesador los datos siguientes.
El patrón es bastante sencillo, así que ya sabemos que están en los registros de la Cache-L1 datos concretos, por lo que podríamos extraer esos datos explorando qué hay en la caché. Para eso se hace un ataque de Side-Channel a los registros con un Time-Based, esto es así porque si un dato ha sido guardado en la Caché-L1 su tiempo de respuesta es menor que el resto, así que si un dato está en la Caché-L1 se podría saber qué hay ahí por los tiempos de respuesta, independientemente de que tengamos una respuesta negativa que no nos permita acceder al dato por seguridad.
Visto este trabajo de Augury, los investigadores han seguido esta misma línea, y han publicado el último artículo académico, llamado: «GoFetch: Breaking Constant-Time Cryptographic Implementations Using Data Memory-Dependent Prefetchers» donde han ido más lejos, y se han dedicado a hacer una implementación funcional de cómo sacar claves criptográficas del sistema operativo, accediendo a los datos mediante una manipulación del DPM de los M-Serie de Apple. Y es espectacular.
Si se rompe la criptografía de un sistema operativo, se acabó con todo. Ya es como que no existiera ninguna seguridad de la información, de los datos, de los procesos, de todo. Por eso las claves criptográficas que utiliza el sistema operativo – cualquiera – son las más protegidas del sistema, y con GoFetch acabamos de ver cómo pueden ser extraídas con este ataque.
Figura 7: Libro de Cifrado de las comunicaciones digitales: de la cifra clásica a RSA 2ª Edición de 0xWord |
En el artículo académico, los investigadores han seguido estudiando cómo funciona el DMP de los microprocesadores M-Serie de Apple, que lógicamente no tienen documentación publicada. El trabajo es un poco como el que vimos en la serie de Halt & Catch Fire, donde tenemos a gente jugando con el hardware a bajo nivel para sacar los datos. En este caso los investigadores han descubierto que el DMP se activa no solo con acceso mediante punteros a zonas de memoria, sino con otro montón de tipos de datos sintéticos que pueden ser inyectados artificialmente por un explotit.
A partir de ese momento, se trataba ver de si era posible hacer un exploit funcional que pudiera extraer una clave criptográfica de un equipo Apple con un M-Serie, y el resultado lo tenéis en el siguiente vídeo que han publicado en la web de GoFetch.Fail donde tienes toda la información del proyecto.
Figura 9: Go’s RSA-2048 Key Extraction on Apple m1
El exploit que han utilizado para hacer esta demo, inyectando un patrón que haga que el DMP cargue en los registros de la Caché-L1 del microprocesador las direcciones de la clave RSA lo tenéis en GitHub, para que veáis cómo hacen el patrón previo, y como exploran la caché con un ataque Time-Based.
Figura 10: GoFetch Exploit en GitHub
El ataque es una maravilla, y los bugs de hardware una pesadilla para la seguridad de los sistemas operativos, porque además muchos de estos componentes son autenticas black box para programadores de sistemas operativos (por ejemplo kernels de Linux), así que poco pueden hacer antes de conocer el bug.
Figura 11: Libros para Makers en 0xWord que deberías tener:
Esto es una tendencia que vamos a seguir viendo, y no hace mucho os hablamos de cómo rompieron la seguridad del TPM con un ataque hardware en donde reside la seguridad del sistema BitLocker en Windows, y esto va a seguir. Mi recomendación es que conozcas y juegues mucho con el hardware, y si te mola, comienza jugando con Drones, Arduino o Raspberry Pi, que dan para mucho juego. Esto deseando ver cómo migran este ataque a iPhone e iOS. Clock is Ticking.
¡Saludos Malignos!
Autor: Chema Alonso (Contactar con Chema Alonso)
Powered by WPeMatico