# Spectre (vulnerabilità di sicurezza)

Spectre è una vulnerabilità hardware nell'implementazione della predizione delle diramazioni nei moderni microprocessori con esecuzione speculativa, che consente ai processi dannosi di accedere al contenuto della memoria mappata di altri programmi. Sono stati pubblicati due ID CVE relativi a Spectre: CVE-2017-5753 e CVE-2017-5715.

## Storia

Spectre è stato scoperto indipendentemente dai ricercatori di Project Zero di Google e da altri ricercatori che hanno collaborato con Paul Kocher. È stato reso pubblico insieme a un'altra vulnerabilità, Meltdown, il 3 gennaio 2018.
Successivamente continuando ad analizzare il problema sono venute alla luce altre vulnerabilità strettamente legate a Spectre, quali SpectreNG, SpectreRSB e Spectre Prime.
Pur a distanza di anni, si continua a scoprire nuove versioni di tale falla, basate sulla cache micro-op, che continua a colpire tutti i principali produttori ed architetture, l'ultima variante è stata scoperta nel 2024

## Impatto

Nel 2018, quasi tutti i computer sono colpiti da Spectre, inclusi desktop, laptop e dispositivi mobili. Spectre è presente, infatti, sia in processori Intel che AMD e ARM. Intel ha risposto alle segnalazioni delle vulnerabilità con un comunicato ufficiale. Secondo un comunicato di AMD, la vulnerabilità di una variante di Spectre non affligge i processori AMD e porrebbe un rischio quasi nullo a causa delle differenze architetturali dei suoi processori.
Sebbene più difficile da sfruttare di Meltdown, Spectre potrebbe essere più difficile da correggere. L'analisi originale ipotizza che potrebbero essere richieste modifiche significative nell'architettura dei processori per risolvere il problema in maniera definitiva.
Inoltre, l'impatto di Spectre nel cloud computing potrebbe essere maggiore di Meltdown. Mentre Meltdown permette ad applicazioni non autorizzate di leggere da memoria privilegiata risiedente nello stesso server, Spectre può servirsi di un hypervisor per trasmettere i dati al sistema in esecuzione su di esso.

## Funzionamento

Spectre è una vulnerabilità che forza i programmi in esecuzione ad accedere a locazioni di memoria che in teoria dovrebbero essere inaccessibili al programma.
I moderni processori al fine di fornire prestazioni elevate sono dotati di una serie di unità di calcolo che lavorano in parallelo. Per poter utilizzare al meglio queste unità di calcolo a volte i processori fanno ipotesi sulle istruzioni da eseguire (esecuzione speculativa) basandosi su quel che è successo in passato. Quando le ipotesi sono corrette il processore ha già eseguito una parte del lavoro e questo velocizza l'esecuzione dei programmi; se le ipotesi si rivelano errate, il processore elimina le istruzioni eseguite per errore. L'esecuzione di queste istruzioni non necessarie modifica tutta una serie di stati interni del processore, ma questo, quando annulla le istruzioni, non corregge gli stati interni alterati ma solo quelli che possono influenzare direttamente l'esecuzione del programma. Spectre, utilizzando questi stati interni "non corretti", estrae informazioni riservate dalla CPU.
Invece di essere una singola vulnerabilità l'articolo che descrive Spectre discute di un'intera classe di possibili vulnerabilità.
Tutte queste vulnerabilità sono basate sull'utilizzo di un effetto collaterale dell'esecuzione speculativa, tecnica utilizzata dai processori per ridurre/mascherare la latenza della memoria del computer e quindi fornire prestazioni migliori. In particolare Spectre si concentra sulla predizione delle diramazioni, una tecnica di esecuzione speculativa. A differenza della vulnerabilità Meltdown, Spectre non si basa su una caratteristica tecnica di un singolo processore o di una famiglia di processori ma è un'idea generale applicata a un ambito molto ampio e che potenzialmente può essere utilizzato in diversi modi.
Il punto di partenza dell'articolo è l'attacco laterale basato sui tempi di accesso alla memoria applicato alla predizione delle diramazioni dei moderni processori che implementano l'esecuzione fuori ordine delle istruzioni. A livello architetturale i processori implementano meccanismi che eliminano i dati elaborati per errore quando i processori eseguono predizioni sulle diramazioni errate. Queste predizioni errate però hanno effetti collaterali non funzionali (come il caricamento nella memoria cache della CPU di dati non necessari) che comunque alterano lo stato interno del processore. Queste alterazioni possono in seguito modificare l'esecuzione delle istruzioni successive in modo non funzionale (quindi la correttezza dei risultati delle operazioni non è influenzata, ma aspetti non funzionali come per esempio i tempi di esecuzione delle operazioni possono variare). Se le modifiche non funzionali sono visibili da programmi potenzialmente malevoli potremmo utilizzare queste alterazioni non funzionali per desumere dati riservati, dati che il programma malevolo non dovrebbe poter determinare, nonostante i meccanismi di protezioni dei dati e di compartimentazione della memoria funzionino come da specifica.
L'articolo Spectre è suddiviso in 4 fasi:
* La prima fase discute come funziona il meccanismo di predizione delle diramazioni nei moderni processori e come un programma opportunamente progettato può addestrare l'unità di predizione delle diramazioni a individuare in modo corretto o no una certa diramazione. In questo modo si può indurre a comando un successo o fallimento della predizione.
* La seconda fase descrive come sia possibile definire in modo affidabile se uno specifico dato è presente o no all'interno della cache del processore. In questo modo una caratteristica non funzionale (la cache è un componente che dovrebbe essere trasparente al funzionamento dei programmi) diviene una caratteristica che può essere utilizzato da un programma per estrarre dalla CPU delle informazioni interne, informazioni che un programma non dovrebbe poter desumere.
* La terza fase utilizzando degli esempi di codice JavaScript mostra come sia possibile scrivere un programma che eseguito all'interno della sandbox del browser riesca a leggere dei dati esterni alla sandbox e che in teoria non dovrebbero essere accessibili. Il codice sfrutta l'esecuzione speculativa e la capacità di definire se i dati sono memorizzati nella cache della CPU oppure no. L'idea generale è che il programma malevolo tramite un ciclo o un altro frammento di codice sia in grado di indurre una predizione delle diramazioni errata e che questa forzi il processore ad accedere ad aree di memoria che in teoria non dovrebbero essere accessibili. In un certo momento, il processore individuerà la predizione errata e provvederà ad annullare le istruzioni eseguite, ma comunque il processore avrà già letto i dati riservati e avrà provveduto a salvare questi nella cache. In seguito, i dati (presenti nella cache del processore) vengono estratti con opportuni attacchi, come quello descritto dalla vulnerabilità Meltdown.
* L'ultima parte dell'articolo generalizza il concetto mostrando come sia possibile utilizzare anche altri stati non funzionali del processore e descrive esempi non ovvi come i tempi di arbitraggio dei bus.
La differenza principale tra Meltdown e Spectre è che Meltdown sfrutta una specificità architetturale dei processori Intel mentre Spectre è molto più generico e quindi può potenzialmente colpire qualsiasi processore. Meltdown sfrutta il fatto che le CPU Intel eseguono controlli a posteriori sui privilegi di accesso delle istruzioni alla memoria e che quindi la CPU può essere forzata ad accedere a locazioni non consentite. Durante l'esecuzione di istruzioni che richiedano dati in memoria, il processore avvia la verifica sui privilegi di accesso e in parallelo legge il dato dalla memoria. Se l'istruzione non ha i privilegi corretti per accedere alla memoria il processore blocca l'istruzione ma comunque l'accesso alla memoria è stato già eseguito e i dati sono stati salvati nella cache. Una volta presenti nella cache questi possono essere estratti tramite un altro attacco. Spectre invece mostra come utilizzando la predizione delle diramazioni si può forzare il processore ad accedere ad aree di memoria riservate che, una volta copiate in cache, possono essere estratte tramite lo stesso attacco utilizzato da Meltdown. L'attacco Spectre richiede solo che il processore abbia una cache e una unità di predizione delle diramazione, due condizioni molto comuni nelle CPU moderne; inoltre mentre l'attacco Meltdown può essere bloccato utilizzando la tecnica KAISER l'attacco Spectre non ha una soluzione singola che consenta di eliminare il problema.

## Patch

Le mitigazioni studiate pur riducendo il problema, non possono risolvere completamente la questione oltre ad avere un impatto più o meno importante in base al tipo del contesto di utilizzo.

### PC, MacOS e Linux

Dato che Spectre copre una vasta serie di vulnerabilità, con buona probabilità non potrà essere corretto con una singola patch. Sebbene si stia già lavorando per correggere alcuni specifici casi della vulnerabilità, il sito originale dedicato a Spectre e Meltdown dichiara che Spectre non è facile da correggere e che dovremo averci a che fare per molto tempo.
Una soluzione di rilievo è stata studiata da Google e prende il nome di Reptoline in quanto impatta meno sulle prestazioni, inizialmente utilizzata solo in ambito Linux, venne poi utilizzato nei sistemi Windows

### Smartphones

Mentre Apple ha pubblicato aggiornamenti che mitigano il problema su tutti i modelli dall’iPhone 5S e successivi, vari produttori di dispositivi che montano Android, non pubblicheranno update per modelli più vecchi di 24 mesi.

### Impatto prestazionale

La prestazione della CPU può subire una riduzione più o meno marcata in base al livello di sicurezza richiesto e al tipo di carico di lavoro, nei casi più gravi si perdono in media fino al 25% delle prestazioni, come nel caso di alcuni server