Le mitigazioni basate sull’hardware introdotte nelle CPU Intel e ARM negli ultimi anni per correggere una grave vulnerabilità nota come Spectre non sono risultate così forti come si credeva. Alcuni ricercatori hanno infatti escogitato un nuovo metodo di attacco in grado di sconfiggere queste difese, sebbene il processo sia decisamente complesso e alla portata di pochi. 

Il nuovo attacco, scoperto dai ricercatori del Systems and Network Security Group del VU Amsterdam (VUSec) si chiama Spectre-BHI (Branch History Injection) o Spectre-BHB (Branch History Buffer), dal momento che Intel e ARM gli hanno assegnato nomi diversi. Secondo il team di ricerca, si tratta di un’estensione dell’attacco Spectre v2 del 2017, noto anche come Spectre-BTI (Branch Target Injection) e, analogamente a Spectre v2, può comportare la fuga di informazioni sensibili dallo spazio di memoria privilegiato del kernel.

L’exploit proof-of-concept creato dai ricercatori di VUSec fa trapelare l’hash della password di root dal file /etc/shadow utilizzando un account senza privilegi. Il file /etc/shadow è un file di sistema su Linux accessibile solo all’account amministrativo root. In sostanza, l’exploit costringe il kernel a caricare il file in memoria, dove normalmente sarebbe protetto dall’accesso da parte di processi non privilegiati, ma poi sfrutta l’attacco Spectre-BHI per accedere e divulgare i suoi contenuti. Questa è una grave violazione del confine di sicurezza nei moderni sistemi operativi che separa le applicazioni in modalità utente dallo spazio di memoria privilegiato del kernel.

Cos’è Spectre?

Spectre è una classe di vulnerabilità di sicurezza, originariamente emersa nel gennaio del 2017, che deriva da una caratteristica relativa alle prestazioni delle moderne CPU chiamata esecuzione speculativa, in cui la CPU cerca sia di prevedere in anticipo quale percorso prenderà l’esecuzione di un programma quando raggiunge un ramo condizionale, sia di eseguire le istruzioni su quel percorso in anticipo. Se la previsione, che si basa su algoritmi interni, risulta essere errata, i risultati archiviati nelle cache temporanee della CPU vengono scartati. Attacchi di esecuzione speculativa come Spectre e molti altri che sono seguiti ingannano questo meccanismo per far trapelare informazioni dalle cache temporanee che fungono da canali laterali.

“Ai tempi in cui è stato scoperto Spectre, si poteva facilmente sfruttare Branch Target Injection (BTI o Spectre-v2), la variante Spectre più pericolosa, attraverso i livelli di privilegio”, spiegano i ricercatori VUSec. “Ad esempio, un utente malintenzionato senza privilegi poteva inviare qualsiasi branch target al predittore di branch e indurre il kernel a saltare speculativamente nella posizione del codice di destinazione iniettato ed eseguire il codice trovato lì”.

Per mitigare il rischio, i fornitori di software come Google e gli sviluppatori del kernel Linux hanno escogitato soluzioni basate su software come retpoline. Sebbene questi metodi fossero efficaci, hanno introdotto un significativo calo delle prestazioni, tanto che fornitori di CPU hanno successivamente sviluppato difese basate su hardware. Quella di Intel si chiama EIBRS, mentre quella di ARM si chiama CSV2.

spectre

Credit: Google/Natascha Eibl

“Queste soluzioni sono complesse, ma il loro vero punto debole è che il predittore tiene traccia in qualche modo del livello di privilegio (utente/kernel) in cui viene eseguito il target”, spiegano i ricercatori VUSec . “E, come ci si può aspettare, se il target appartiene a un livello di privilegio inferiore, l’esecuzione del kernel non lo utilizzerà. Ciò significa che non verranno più utilizzate posizioni di codice arbitrarie fornite da aggressori in cui dirottare speculativamente il flusso di controllo del kernel.”

Il problema, tuttavia, è che il predittore della CPU si basa su una cronologia globale per selezionare le voci di destinazione da eseguire in modo speculativo e, come hanno dimostrato i ricercatori VUSec, questa cronologia globale può essere “avvelenata”. In altre parole, mentre l’originale Spectre v2 consentiva agli aggressori di iniettare effettivamente posizioni di codice di destinazione e quindi ingannare il kernel per eseguire quel codice, il nuovo attacco Spectre-BHI/BHB può solo costringere il kernel a prevedere erroneamente ed eseguire frammenti di codice interessanti che esistono già nella cronologia e che sono stati eseguiti in passato, ma che potrebbero portare a un leak di dati.

“Ma allora Intel eIBRS e Arm CSV2 non funzionano più? Più o meno”, hanno detto i ricercatori. “Se infatti le mitigazioni funzionano come previsto, la superficie di attacco residua è molto più significativa di quanto inizialmente ipotizzato da Intel e ARM. Tuttavia, trovare frammenti di codice sfruttabili è più difficile rispetto a prima”.

Mitigazione della nuova vulnerabilità Spectre-BHI

Intel ha classificato la nuova vulnerabilità Spectre-BHI come CVE-2022-0001 (variazione cross-privilege) e CVE-2022-0002 (variazione same-privilege). ARM l’ha invece classificata come CVE-2022-23960 per entrambe le variazioni.

La maggior parte delle CPU Intel è interessata alla nuova vulnerabilità, a parte quelle della famiglia Atom. Per quanto riguarda invece ARM, le CPU vulnerabili sono Cortex-A15, Cortex-A57, Cortex-A72, Cortex-A73, Cortex-A75, Cortex-A76, Cortex-A76AE, Cortex-A77, Cortex-A78, Cortex-A78AE, Cortex-A78C , Cortex-X1, Cortex-X2, Cortex-A710, Neoverse N1, Neoverse N2 e Neoverse V1. Entrambe le società renderanno disponibili mitigazioni software e ARM offre cinque diverse mitigazioni a seconda del sistema.

Per il loro exploit Linux, i ricercatori VUSec hanno anche parlato di eBPF, una tecnologia disponibile dal kernel 4.4 in grado di eseguire programmi sandbox in un kernel del sistema operativo. Sebbene eBPF non faccia parte del problema sottostante e si possano trovare altri snippet di codice che “leakano” dati, la presenza di eBPF senza privilegi “facilita enormemente l’esecuzione speculativa (e altri) attacchi”. Ecco perché i ricercatori consigliano di disabilitarlo e perché alcune distribuzioni Linux hanno già iniziato a farlo di default.