
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: