Posted On Marzo 8, 2018 In Cyber security With 1064 Views

Spectre

di Riccardo Colombo

Spectre (CVE-2017-5753, CVE-2017-5715) si riferisce ad una vulnerabilità scoperta nel Giugno 2017 dal team di Google Project Zero e altri ricercatori[1], successivamente resa pubblica il 3 Gennaio 2018. La vulnerabilità sfrutta una particolare ottimizzazione tipica dei moderni processori a pipeline, l’esecuzione speculativa (da cui il nome: Spectre). La sicurezza dei sistemi informatici si basa fondamentalmente sull’isolazione della memoria, un processo può accedere soltanto alla memoria che gli è stata riservata se non autorizzato diversamente. Spectre può essere sfruttata per permettere ad un processo arbitrario di accedere a porzioni di memoria riservate ad altri programmi, e a cui normalmente non potrebbe attingere, senza lasciare traccia. Questo espone inevitabilmente i “segreti” presenti in tali porzioni di memoria, tra cui ci possono essere password, email ed immagini, a chi performa un attacco che sfrutta questa vulnerabilità.

Inoltre, non essendo una vulnerabilità specifica di un determinato programma o sistema operativo, bensì dell’architettura stessa del processore, le probabilità che un sistema sia vulnerabile sono elevate. Si tenga presente che il problema non è limitato soltanto ai personal computers ma si estende anche a smartphones, macchine virtuali e architetture cloud, dove la confidenzialità dei dati relativi ad un utente può essere compromessa.

Speculative Execution

I processori moderni utilizzano l’esecuzione speculativa per ottimizzare l’impiego della CPU, cercando di predire come l’esecuzione di un processo evolverà nell’immediato futuro ed eseguendo calcoli ed elaborazioni in anticipo. Per esempio, nel caso in cui l’evoluzione di un processo dipenda da un valore che risiede in memoria, potrebbero essere necessari centinaia di cicli di clock prima che il valore venga recuperato. Anziché “sprecare” questi cicli di clock rimanendo in idle (inutilizzato), il processore cerca di indovinare come evolverà il processo, salva un “backup” dello stato, e procede con l’esecuzione speculativa lungo il cammino ipotizzato. Quando il valore viene recuperato dalla memoria, il processore controlla la correttezza della propria previsione. Nel caso sia sbagliata, ripristina il backup dello stato e scarta i risultati dell’esecuzione speculativa, ottenendo una performance comparabile all’idle. Nel caso la previsione si riveli corretta, invece, i risultati sono confermati ed il processore si trova ad aver già svolto parte del lavoro richiesto dal processo, ottenendo un netto incremento delle prestazioni.

Caching

La memoria cache è una memoria particolarmente veloce e/o velocemente accessibile, solitamente di dimensioni non elevate, che viene usata per salvare i dati e le informazioni che vengono richieste con maggior frequenza, allo scopo di velocizzarne la reperibilità.

Nel nostro caso ci riferiamo alla memoria cache del processore, volta ad accelerare l’accesso della CPU alla memoria. Per prelevare informazioni che risiedono in RAM, dunque fisicamente in un altro chip, è necessario infatti un tempo non trascurabile. Sui processori viene quindi spesso riservata una piccola quantità di memoria, chiamata appunto CPU cache, che risiede fisicamente sul processore stesso e può essere consultata più rapidamente rispetto alla RAM. Questa memoria viene tenuta aggiornata dal processore con i dati di cui avrà bisogno nell’immediato, o che richiede più di frequente, così da poterne disporre in tempi molto brevi. Si noti che spesso anche l’output dell’esecuzione speculativa viene salvato in questa memoria cache, contribuendo all’incremento della performance.

Spectre

Per capire come funziona un attacco che sfrutta la vulnerabilità spectre consideriamo un semplice esempio.

If ( x < “limite” ) then y = “zona di memoria che dipende da x”

Questa riga di codice controlla che il valore di x rispetti certi limiti e, se li rispetta, assegna ad y un valore in memoria la cui posizione dipende da x.

Il primo passo sta nell’”allenare” il processore chiamando questa porzione di codice parecchie volte con un valore di x valido, così che la CPU si aspetti un valore di x valido anche per la prossima iterazione.

Completata questa fase, viene chiamato ancora una volta il codice, assicurandosi che il valore di “limite” non risieda nella memoria cache e con un valore maligno di x. A questo punto il processore, mentre attende che il valore di “limite” venga recuperato dalla memoria centrale, procederà con l’esecuzione speculativa della riga di codice (aspettandosi un valore lecito di x), utilizzando invece il valore maligno di x!

Il valore di y verrà quindi calcolato e salvato nella cache, in attesa che il valore di “limite” venga prelevato dalla memoria centrale. Quando il processore riceverà il valore di “limite” e si accorgerà di aver sbagliato predizione, ripristinerà lo stato iniziale e continuerà con la corretta esecuzione del codice, cioè non garantendo l’assegnazione di y.

Chi performa l’attacco potrà però recuperare (tramite covert channel[2] precedentemente predisposto) il valore che è stato scritto nella cache e conseguentemente leggerne il valore. Ripetendo più volte il procedimento, con valori di x diversi, si può giungere a leggere una porzione della memoria della vittima, apprendendone i “segreti”.

Hardware e Patches

Non essendo una vulnerabilità legata ad un particolare software o sistema operativo, soluzioni definitive richiedono aggiornamenti delle architetture dell’instruction set e di aggiustamenti sul design del processore stesso. Ciononostante diverse patch per Linux, Windows e OSX sono state rilasciate, patch che però vanno inevitabilmente a deteriorare in maniera decisa le prestazioni dei processori.

Spectre è stato dimostrato sfruttabile su processori Intel e AMD (sia sotto Windows che sotto Linux) e su processori ARM. Questo significa che non soltanto personal computers, ma anche dispositivi come smartphone, tablet e smart tv (che spesso utilizzano processori ARM) possono essere vulnerabili. Il gruppo di ricercatori che ha scoperto la vulnerabilità è inoltre stato in grado di scrivere un codice Javascript in grado di violare il sandboxing[3] del browser sfruttando Spectre, dimostrando come un attacco così potente sia anche estremamente portabile.

Riccardo Colombo.


[1]  Kocher, Paul e Genkin, Daniel e Gruss, Daniel e Haas, Werner e Hamburg, Mike e Lipp, Moritz e Mangard, Stefan e Prescher, Thomas e Schwarz, Michael e Yarom, Yuval

[2]  Attacco che allestisce un canale di trasmissione di dati e informazioni tra processi che non dovrebbero essere autorizzati a comunicare.

[3]  Meccanismo di sicurezza atto a confinare i programmi in esecuzione in uno spazio limitato. Viene spesso impiegato quando viene eseguito del software non testato o non proveniente da una fonte di fiducia.

Tags : , , ,

About