
Esempio di utilizzo dell'exploit "Spectre" divulgato (CVE-2017-5753 e CVE-2017-5715)
Esempio di utilizzo dell'exploit "Spectre" rivelato il 2 gennaio 2018 (CVE-2017-5753 e CVE-2017-5715)
Spectre rompe l'isolamento tra diverse applicazioni. Consente a un attaccante di indurre programmi privi di errori, che seguono le best practice, a far trapelare i propri segreti. In effetti, i controlli di sicurezza di tali best practice aumentano la superficie d'attacco e possono rendere le applicazioni più vulnerabili a Spectre.
C, usa le librerie:
Mettiamo il testo "Le parole magiche sono Squeamish Ossifrage." in memoria e poi proviamo a leggerlo usando l'exploit. Se il sistema è vulnerabile, vedrai lo stesso testo nell'output, letto dalla memoria.
In questo codice, se le istruzioni compilate in victim_function() venissero eseguite in rigoroso ordine di programma, la funzione leggerebbe solo da array1[0..15] poiché array1 ha dimensione 16. Tuttavia, quando eseguita in modo speculativo, sono possibili letture fuori dai limiti. La funzione readMemoryByte() effettua diverse chiamate di addestramento a victim_function() per far sì che il predittore di salto si aspetti valori validi per x, quindi chiama con una x fuori dai limiti. Il salto condizionale viene previsto in modo errato e l'esecuzione speculativa che ne consegue legge un byte segreto usando la x fuori dai limiti. Il codice speculativo legge quindi da array2[array1[x] * 512], facendo trapelare il valore di array1[x] nello stato della cache. Per completare l'attacco, viene utilizzato un semplice flush+probe per identificare quale linea di cache in array2 è stata caricata, rivelando il contenuto della memoria. L'attacco viene ripetuto più volte, quindi anche se il byte target inizialmente non è in cache, la prima iterazione lo porterà nella cache.
Il codice non ottimizzato legge circa 10KB/secondo su un i7 Surface Pro 3.
gcc -std=c99 Source.c -o spectre.out
oppure
make
Crea un nuovo progetto vuoto e aggiungi Source.c, quindi fai clic su Build.
.\spectre.out senza parametri.
.\spectre.out {address} {length} con parametri: