
Demo proof-of-concept e libreria libkdump che dimostrano l'attacco microarchitetturale Meltdown, con fuga di memoria kernel e fisica su CPU Intel vulnerabili.
Questo repository contiene diverse applicazioni che dimostrano il bug Meltdown. Per informazioni tecniche sul bug, fare riferimento al paper:
Le applicazioni in questo repository sono costruite con libkdump, una libreria che abbiamo sviluppato per il paper. Questa libreria semplifica lo sfruttamento del bug adattandosi automaticamente a determinate proprietà dell'ambiente.
Questo repository contiene diversi video che dimostrano Meltdown
Questo repository contiene cinque demo per dimostrare diversi casi d'uso. Tutte le demo sono testate su Ubuntu 16.04 con un Intel Core i7-6700K, ma dovrebbero funzionare su qualsiasi sistema Linux con qualsiasi CPU Intel moderna dal 2010 in poi.
Per risultati ottimali, raccomandiamo una CPU veloce che supporti Intel TSX (ad es. qualsiasi Intel Core i7-5xxx, i7-6xxx o i7-7xxx). Inoltre, ogni demo dovrebbe essere vincolata a un singolo core della CPU, ad es. con taskset.
Come prerequisito, è necessario installare glibc-static sulla propria macchina.
Per sistemi basati su RPM:
sudo yum install -y glibc-static
test)Questa è la demo più basilare. Usa Meltdown per leggere indirizzi accessibili dal proprio spazio di indirizzamento, senza violare alcun meccanismo di isolamento.
Se questa demo non funziona, molto probabilmente anche le demo rimanenti non funzioneranno. Le ragioni sono molteplici, ad es. la CPU potrebbe essere troppo lenta, non supportare l'esecuzione out-of-order, il timer ad alta risoluzione non è abbastanza preciso (specialmente nelle VM), il sistema operativo non supporta gestori di segnali personalizzati, ecc.
make
taskset 0x1 ./test
Se si vede un output simile a questo
Expect: Welcome to the wonderful world of microarchitectural attacks
Got: Welcome to the wonderful world of microarchitectural attacks
allora la demo di base funziona.
kaslr)A partire dal kernel Linux 4.12, KASLR (Kernel Address Space Layout Randomizaton) è attivo per impostazione predefinita. Ciò significa che la posizione del kernel (e anche la mappa fisica diretta che mappa l'intera memoria fisica) cambia ad ogni riavvio.
Questa demo usa Meltdown per rivelare la randomizzazione (segreta) della mappa fisica diretta. Questa demo richiede privilegi di root per velocizzare il processo. Il paper descrive una variante che non richiede privilegi di root.
make
sudo taskset 0x1 ./kaslr
Dopo alcuni secondi, si dovrebbe vedere qualcosa di simile a questo
[+] Direct physical map offset: 0xffff880000000000
reliability)Questa demo verifica quanto affidabilmente possa essere letta la memoria fisica. Per questa demo, è necessario l'offset della mappa fisica diretta (ad es. dalla demo #2) oppure è necessario disabilitare KASLR specificando nokaslr nella riga di comando del kernel.
Compilare e avviare reliability. Se KASLR è abilitato, il primo parametro è l'offset della mappa fisica diretta. Altrimenti, il programma non richiede alcun parametro.
make
sudo taskset 0x1 ./reliability 0xffff880000000000
Dopo alcuni secondi, si dovrebbe ottenere un output simile a questo:
[-] Success rate: 99.93% (read 1354 values)
physical_reader)Questa demo legge la memoria da un processo diverso leggendo direttamente la memoria fisica. Per questa demo, è necessario l'offset della mappa fisica diretta (ad es. dalla demo #2) oppure è necessario disabilitare KASLR specificando nokaslr nella riga di comando del kernel.
In linea di principio, questo programma può leggere indirizzi fisici arbitrari. Tuttavia, poiché la memoria fisica contiene molti dati non leggibili dall'uomo, forniamo uno strumento di test (secret), che inserisce una stringa leggibile dall'uomo in memoria e fornisce direttamente l'indirizzo fisico di questa stringa.
Per la demo, eseguire prima secret (come root) per ottenere l'indirizzo fisico di una stringa leggibile dall'uomo:
make
sudo ./secret
Dovrebbe produrre un output simile a questo:
[+] 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
Mentre il programma secret è in esecuzione, avviare physical_reader. Il primo parametro è l'indirizzo fisico stampato da secret. Se KASLR non è disabilitato, il secondo parametro è l'offset della mappa fisica diretta.
taskset 0x1 ./physical_reader 0x390fff400 0xffff880000000000
Dopo alcuni secondi, si dovrebbe ottenere un output simile a questo:
[+] Physical address : 0x390fff400
[+] Physical offset : 0xffff880000000000
[+] Reading virtual address: 0xffff880390fff400
If you can read this, this is really bad
memdump)Questa demo esegue il dump del contenuto della memoria. Come le demo #3 e #4, usa la mappa fisica diretta per eseguire il dump del contenuto della memoria fisica in un formato simile a un hexdump.
Ancora una volta, poiché la memoria fisica contiene molti contenuti non leggibili dall'uomo, forniamo uno strumento di test per riempire grandi quantità di memoria fisica con stringhe leggibili dall'uomo.
Per la demo, eseguire prima memory_filler per riempire la memoria con stringhe leggibili dall'uomo. Il primo argomento è la quantità di memoria (in gigabyte) da riempire.
make
./memory_filler 9
Poi, eseguire lo strumento memdump per eseguire il dump del contenuto della memoria. Se si è eseguito memory_filler in precedenza, si dovrebbero vedere alcuni frammenti di stringhe.
Se si ha Firefox o Chrome con più schede aperte, si potrebbero anche vedere parti dei siti web aperti o chiusi di recente.
Il primo parametro è l'indirizzo fisico da cui deve iniziare il dump (lasciare vuoto per iniziare dal primo gigabyte). Il secondo parametro è la quantità di byte che si desidera leggere; per leggere tutto, dare -1. Se KASLR non è disabilitato, il terzo parametro è l'offset della mappa fisica diretta.
taskset 0x1 ./memdump 0x240000000 -1 0xffff880000000000 # start at 9 GB
Si dovrebbe ottenere un hexdump di parti della memoria (potenzialmente contenente anche segreti come password, vedere l'esempio nel paper), ad es.: