# Meltdown (vulnerabilità di sicurezza)

Meltdown è una vulnerabilità hardware che colpisce microprocessori Intel e ARM, che permette a programmi e potenziali attaccanti di accedere ad aree protette di memoria di un computer. Le è stato assegnato l'ID CVE CVE-2017-5754.
I microprocessori AMD non sembrano colpiti.

## Storia

Meltdown è stato scoperto in modo indipendente dai ricercatori di Project Zero di Google, Cyberus Technology, e Università tecnica di Graz ed è stata resa pubblica congiuntamente a Spectre il 3 gennaio 2018, diversi giorni in anticipo rispetto alla data prevista del 9 gennaio 2018, a causa di notizie premature e speculazione diffusa. Di conseguenza, quando le vulnerabilità sono state divulgate, le patch non sono uscite in tempo in alcune piattaforme, come Ubuntu.
Successivamente continuando ad analizzare il problema sono venute alla luce altre vulnerabilità strettamente legate a Meltdown, quali Meltdown Prime e Total Meltdown.

## Impatto

Secondo gli scopritori della vulnerabilità, ne è potenzialmente affetto ogni processore Intel che implementi l'esecuzione fuori ordine, il che corrisponde sostanzialmente a ogni processore Intel in commercio sin dal 1995 (ad eccezione di Intel Itanium e Intel Atom precedenti al 2013), successivamente viene confermato come la vulnerabilità colpisca i vari processori Intel Core i3-i5-i7-i7 extreme-i9 (Nehalem a 45-32 nm e successivi), Intel Xeon in svariate sue declinazioni, Intel Atom (serie A, C, E, X3, Z), Intel Celeron (serie J, N), Intel Pentium (serie J, N).
Ci si aspetta che il bug abbia ripercussioni sui maggiori fornitori di cloud computing, come Amazon Web Services e Google Cloud Platform. I fornitori di cloud computing, infatti, eseguono diverse macchine virtuali sullo stesso server fisico, e, per impedire a programmi eseguiti di accedere a memoria in uso da altri programmi in esecuzione, fanno affidamento proprio sulle protezioni che Meltdown aggira.

## Funzionamento

Meltdown sfrutta una corsa critica delle CPU tra l'esecuzione delle istruzioni che accedono alla memoria e la verifica dei privilegi di accesso alla memoria. L'attacco è descritto basandosi su processori Intel e sistemi operativi Microsoft Windows, macOS e Linux dato che l'articolo utilizza questi sistemi nelle sue analisi, ma l'attacco può agire anche su altri sistemi operativi e processori.

### Premesse - architettura delle moderne CPU

Le moderne CPU utilizzano una varietà di tecniche di ottimizzazioni al fine di ottenere prestazioni elevate, alcune di queste tecniche vengono utilizzate da Meltdown:
* Memoria virtuale, i moderni sistemi operativi consentono a più programmi di essere eseguiti in contemporanea nello stesso spazio di memoria, a tal fine per questione di efficienza e sicurezza ogni programma ha l'illusione di avere accesso a tutta la memoria indirizzabile dal processore anche se in realtà ne può utilizzare solo le aree che gli sono state assegnate. Quando il programma cerca di accedere a una locazione di memoria il processore traduce l'indirizzo "virtuale" (quello noto al programma) con l'indirizzo fisico (la locazione reale di memoria) e utilizza questo per recuperare i dati da elaborare.
* Domini di accesso, una delle tecniche che utilizza il processore per definire quando un processo è abilitato a utilizzare una certa locazione di memoria virtuale. L'utilizzo della memoria virtuale e degli indirizzi virtuali permettono ai programmi di mappare aree di memoria molto più ampie di quelle realmente in uso e permettono al processore di organizzare la memoria di ogni processo in modo efficiente. Molti sistemi operativi mappano per ogni processo tutta la memoria disponibile al sistema, questo di solito è considerato sicuro dato che i domini di accesso impediscono la lettura di zone di memoria non di competenza del processo in esecuzione. L'accesso del programma a una zona di memoria valida avviene in modo istantaneo mentre l'accesso a una locazione non di proprietà comporta la generazione di un'eccezione e nessun dato sulla locazione di memoria viene resa nota al processo. L'utilizzo dell'indirizzamento virtuale consente di mappare dati condivisi tra programmi come locazioni di memoria accessibili al processo, in questo modo per esempio si ha un metodo semplice e veloce per permettere l'accesso a informazioni del sistema operativo da parte del processo.
* Pipeline dati e esecuzione speculativa, sono tecniche utilizzate dal processore per eseguire in modo efficiente le istruzioni. Sono utilizzate per parallelizzare l'esecuzione delle istruzioni (al fine di migliorare i tempi di elaborazione) e se necessario modificare l'ordine di esecuzione delle istruzioni, purché il risultato finale rimanga corretto. I moderni processori sono dotati di molte unità di elaborazione che possono lavorare in parallelo e di uno scheduler (componente che decide come utilizzare le unità di elaborazione) sviluppato per massimizzare l'utilizzo delle unità di elaborazione. Lo scheduler analizza le istruzioni da elaborare e decide se alcune istruzioni possono essere eseguite in parallelo (assegnando ogni istruzione a uno specifico unità di elaborazione) e se necessario per questioni di efficienza può alterare anche l'ordine di esecuzione delle istruzioni pur mantenendo il risultato finale corretto. Nel caso lo scheduler si trovi a dover gestire un'istruzione di diramazione (se C è 0 esegui l'istruzione A altrimenti l'istruzione B) lo scheduler può decidere di eseguire entrambe le istruzioni (A e B) e di mantenere le istruzioni in sospeso fino a quando non sarà noto il valore di C. Quando C sarà noto, l'istruzione corretta verrà mantenuta, mentre quella eseguita per errore verrà annullata. Questa strada usualmente è più rapida dell'aspettare di conoscere il reale valore di C (vedi anche predizione delle diramazioni).
* CPU cache, una modesta quantità di memoria molto veloce utilizzata dal processore per memorizzare i dati utilizzati di frequente. Dal punto di vista della CPU la memoria del computer è molto lenta e l'analisi dell'esecuzione dei programmi ha mostrato che per la maggior parte del tempo la CPU elabora sempre le stesse zone di memoria. Queste considerazioni hanno portato alla realizzazione della cache, una piccola zona di memoria molto veloce all'interno del processore dove salvare copie dei dati utilizzati di frequente, in modo da eliminare la maggior parte degli accessi alla lenta memoria del sistema. Quando il processore legge un dato dalla memoria una sua copia viene salvata nella cache al fine di averne una copia pronta per eventuali successivi accessi.

### La vulnerabilità Meltdown

Usualmente le operazioni descritte in seguito sarebbero considerate sicure. Sono le basi dei moderni sistemi operativi e processori. Meltdown sfrutta come queste operazioni interagiscono al fine di superare i sistemi di sicurezza delle CPU ed accedere a zone di memoria riservata. Per comprendere Meltdown va tenuto a mente che i dati sono mappati in uno spazio di indirizzamento virtuale (la maggior parte dello spazio di indirizzamento non dovrebbe essere accessibile al programma dato che non di sua competenza) e analizzando come si comporta la CPU quando si cerca di accedere a una locazione riservata. Il processo in analisi è in esecuzione su una versione di Windows o Linux vulnerabile a Meltdown su un processore a 64 bit vulnerabile all'attacco.
* Come ogni altro processo o lo stesso sistema operativo il processo malevolo ha accesso a uno spazio di indirizzamento virtuale di miliardi di gigabyte. Ignorando i controlli di sicurezza lo spazio di memoria viene organizzato in modo da massimizzare l'efficienza. La maggior parte dello spazio sarà libero e non allocato, alcune aree saranno utilizzate dal processo malevolo per allocare i propri dati e sempre per questione di efficienza nello stesso spazio saranno mappati anche gli altri processi e i dati del sistema operativo. Questo di solito è considerato sicuro dato che i controlli inclusi nel processore impediscono al processo malevolo di accedere ad aree di memoria non di sua competenza. Il tentativo di leggere una zona di memoria riservata provoca la generazione di un'eccezione e il fallimento della lettura dei dati.
* Quando un processo cerca di accedere a una zona di memoria riservata, l'istruzione di lettura dei dati viene schedulata nella pipeline della CPU, come per tutte le istruzioni. L'istruzione viene inviata a una unità di elaborazione e l'indirizzo di memoria da leggere viene inviato al gestore della memoria in modo che il dato sia disponibile quando l'istruzione sarà eseguita. In un certo momento (prima del completamento dell'istruzione) il controllo dei privilegi di accesso fallirà, quindi l'esecuzione dell'istruzione verrà annullata, nessun dato verrà fornito in uscita, verrà generata una eccezione e il processore passerà all'istruzione successiva.
* In teoria se il gestore della memoria, il controllo dei privilegi, lo scheduler e l'unità di esecuzione sono senza errori l'approccio descritto è sempre stato considerato sicuro. I dati dalla memoria riservata sono stati effettivamente letti dal processore, ma l'esecuzione dell'istruzione è stata bloccata prima del suo completamento e nessun dato è stato fornito al processo malevolo. Tuttavia Meltdown ha mostrato che questo approccio non è sicuro come si credeva.
* Nella prima fase di esecuzione dell'istruzione lo scheduler genera due operazioni, il controllo dei privilegi e invio dell'operazione all'unità di calcolo. L'unità di elaborazione mentre attende il controllo dei privilegi provvede anche a richiedere la lettura dei dati dalla memoria in modo da poter eseguire il prima possibile l'istruzione. Nel caso del processo malevolo il controllo dei privilegi fallirà, quindi l'istruzione non verrà eseguita, ma i dati comunque saranno stati letti dalla memoria e memorizzati nella cache del processore. Usualmente questo non è un problema per la sicurezza dato che dati memorizzati nella cache non sono accessibili senza passare dal controllo dei privilegi.Tuttavia, Meltdown interviene in questo punto:
* La cache nella CPU non è direttamente leggibile da processi non autorizzati dato che vive all'interno del processore, ma è suscettibile a un attacco temporizzato (una forma di attacco laterale) che permette a un processo malevolo di determinare se una specifica locazione di memoria è presente nella cache, ma che non consente di leggere il contenuto della stessa. Se dei dati sono salvati nella cache una seconda istruzione che richiede i dati avrà un accesso istantaneo ai dati senza dover attendere che questi siano recuperati dalla memoria. Il processo malevolo può misurare questa differenza nei tempi di accesso e definire se una locazione di memoria è in cache oppure no, questo usualmente non viene considerato un problema di sicurezza, ma Meltdown in congiunzione con alcune peculiarità del set di istruzioni X86 riesce ad avere un pieno accesso a tutta la memoria mappata dal sistema.
* Un'istruzione può richiedere di accedere alla memoria fornendo l'indirizzo in vari modi, uno di questi modi è l'indirizzamento indiretto. L'istruzione può richiedere alla CPU di utilizzare il valore della locazione di memoria X per calcolare un secondo indirizzo Y, leggere il valore Y e ritornare all'istruzione il valore letto. Meltdown utilizza l'indirizzamento indiretto per condurre un attacco laterale per definire il valore di uno specifico indirizzo di memoria. Supponendo di voler leggere il valore dell'indirizzo 2000 (indirizzo vietato al processo malevolo e valore che si ipotizzi sia 4) e di sapere che questo contiene un valore compreso tra 1 e 5 si può eseguire l'attacco nel seguente modo. Si inizia richiedendo la lettura di una locazione di memoria usando un indirizzamento indiretto, per esempio 5000 più il valore della locazione 2000. La lettura fallirà dato che il processo malevolo non può accedere alla locazione 2000 per mancanza di privilegi, ma come detto prima la locazione 5000 più il valore di 2000 (5004 nel nostro esempio) sarà stata letta e memorizzata nella cache del processore dal gestore della memoria. Poi il processo malevolo leggerà i valori delle locazioni di memoria da 5001 a 5005 e noterà che mentre 5001, 5002, 5003 e 5005 hanno un certo tempo di accesso la locazione 5004 verrà letta in un tempo nettamente inferiore (dato che già presente in cache) e quindi desumerà che il valore di 2000 è 4.
* In teoria se 2000 è un indirizzo non valido per il processo malevolo un tentativo di lettura di questa locazione dovrebbe fallire e non fornire nessuna informazione al processo malevolo.
* In pratica l'attacco Meltdown mostra invece che per ottenere alte prestazioni la lettura dei dati in memoria viene avviata quando ancora non sono stati verificati i privilegi di accesso e che quindi i dati vengono letti in memoria e salvati in cache anche senza i corretti privilegi di accesso. Quindi un accesso non valido fornisce comunque delle informazioni al processo malevolo (i dati salvati in cache) e queste informazioni possono essere utilizzate dal processo malevolo per scoprire il contenuto della locazione vietata.
Meltdown può utilizzare questa tecnica per leggere potenzialmente ogni locazione di memoria del computer in tempi rapidi, in questo modo un processo malevolo può leggere dati riservati del sistema operativo, password, dati cifrati o ogni tipo di dato presente in memoria. In pratica dato che l'attacco laterale è relativamente lento, è più veloce estrarre un bit per volta dalle celle di memoria. Leggendo un bit alla volta, la lettura di una locazione di 8 bit (un byte) richiede 2 × 8 = 16 letture della cache mentre cercare di leggere l'intero byte richiederebbe 2 × 256 = 512 letture della cache.

## Patch

Il 6 dicembre 2017 Apple ha pubblicato una patch con la versione 10.13.2 per macOS.
Il 3 gennaio 2018, Microsoft ha pubblicato un aggiornamento di sicurezza d'emergenza per Windows 10, reso disponibile anche per le altre versioni supportate di Windows durante il successivo Patch Tuesday.
Gli sviluppatori del kernel Linux hanno sviluppato una serie di patch, chiamate kernel page-table isolation, per le versioni 4.15 e 4.14.11.
A seconda del modello e dal compito svolto dal processore, i fix richiesti potrebbero rallentare i computer con le CPU affette dal 5% al 30% o non causare perdite di prestazioni significative.
L'8 gennaio 2018 Intel ha pubblicato un aggiornamento del microcodice per alcuni processori, per sistemi operativi Linux.
Sono inoltre state rilasciate patch per DragonflyBSD, OpenBSD, FreeBSD e NetBSD che sta sviluppando SVS (Separate Virtual Space) come contromisura per Meltdown.
OpenIndiana ha mitigato Meltdown grazie a KPTI (Kernel Page Table Isolation).