Esecuzione fuori ordine & side channel attack.

Esecuzione fuori ordine & side channel attack.

La sicurezza dei sistemi informatici si basa su un modello di isolamento della memoria, esempio, gli indirizzi di memoria sono impostati come non accessibili e sono protetti dall’accesso dell’utente. L’isolamento della memoria è un set di differenti tecnologie hardware e software che puntano a proteggere ogni processo da altri processi del sistema operativo. In sintesi previene la scrittura del processo A nel processo B.

Meltdown è un esempio di falla che sfrutta gli effetti collaterali delle esecuzioni fuori ordine dei moderni processori per leggere indirizzi di memoria arbitraria nel kernel, incluso i dati personali e le passwords. L’esecuzione fuori ordine è la capacità delle moderne CPU di eseguire più istruzioni in contemporanea senza rispettare un ordine prestabilito, così da migliorare la prestazione dei moderni processori. L’attacco è indipendente dal sistema operativo in uso e non si basa su un qualche tipo di vulnerabilità di un software. Meltdown spezza tutte le garanzie di sicurezza fornite dallo spazio di isolamento della memoria, anche per gli ambienti virtualizzati (esempio le VPS). Su un sistema infetto, Meltdown mette a disposizione di un malintenzionato la lettura della memoria dei processi, o di macchine virtuali nel cloud, pur non avendo privilegi o permessi.

In inglese, Out of order execution è una tecnica di ottimizzazione che permette di massimizzare l’utilizzo delle unità di ogni core della CPU. Invece di elaborare le istruzioni nell’ordine sequenziale del programma, la CPU le esegue non appena sono disponibili tutte le risorse necessarie, senza rispettare necessariamente l’ordine imposto dal programmatore. Se l’esecuzione dell’operazione corrente rende occupata un unità, altre unità possono eseguire altre operazioni, quindi le istruzioni possono essere eseguite in parallelo, seguendo questa architettura. Le CPU di solito non seguono un flusso di istruzioni lineari, hanno delle unità di predizione che generano ipotesi su quale istruzione deve essere eseguita successivamente. Il branch prediction cerca di determinare quale è la direzione del percorso che un’istruzione deve prendere prima che la sua condizione venga effettivamente valutata. Le istruzioni che si trovano su quel percorso, e non hanno nessun tipo di dipendenza, possono essere eseguite in anticipo ed il risultato può essere subito utilizzato se la predizione fosse corretta. Se la previsione è errata il buffer di riordino consente di ripristinare lo stato normale (rollback). Tali operazioni, però, hanno spesso effetti indesiderati (side effects), tipo differenze di temporizzazione possono far trapelare informazioni.

Isolamento dei processi

Per isolare i processi l’uno dall’altro, la CPU adotta una metodologia chiamata virtual address space, ovvero l’insieme di intervalli di indirizzi virtuali che un sistema operativo mette a disposizione di un processo, e dove gli indirizzi virtuali sono tradotti come indirizzi fisici. La tabella di traduzione è contenuta in uno speciale registro della CPU. Quando un’applicazione su un sistema a 32bit è eseguita, il processo ha 4GB di virtual address space; ogni indirizzo di memoria (da 0 a 2^32-1) in quello spazio può avere un singolo byte come valore.
Mentre lo spazio degli indirizzi degli utenti è accessibile dall’ applicazione in esecuzione, nello spazio indirizzo del kernel ci si può accedere solo se la CPU è in esecuzione con i privilegi (root). Per accelerare gli accessi alla memoria e la traduzione degli indirizzi, la CPU contiene piccoli buffer di memoria, chiamati cache, che memorizzano i dati utilizzati di frequente. Anche le tabelle di traduzione del virtual address space vengono memorizzate nelle cache.