Un gruppo di ricercatori dell'École polytechnique fédérale de Zurich ha identificato una nuova variante di attacco al meccanismo di esecuzione speculativa dei salti indiretti nella CPU, che consente di estrarre informazioni dalla memoria del kernel o di organizzare un attacco al sistema host dalle macchine virtuali. Le vulnerabilità hanno ricevuto il nome in codice Retbleed (CVE-2022-29900, CVE-2022-29901) e sono simili nella sostanza agli attacchi Spectre-v2. La differenza risiede nell'organizzazione dell'esecuzione speculativa di codice arbitrario durante l'elaborazione dell'istruzione "ret" (ritorna), che estrae l'indirizzo per il salto dallo stack, invece di un salto indiretto tramite l'istruzione "jmp" con il caricamento dell'indirizzo dalla memoria o dal registro CPU.
Un attaccante può creare condizioni per una previsione errata del salto e organizzare un salto speculativo mirato su un blocco di codice non previsto dalla logica di esecuzione del programma. Alla fine, il processore determinerà che la previsione del branch non è stata corretta e annullerà l'operazione allo stato originale, ma i dati elaborati durante l'esecuzione speculativa rimarranno nella cache e nei buffer microarchitettonici. Se il blocco eseguito erroneamente accede alla memoria, la sua esecuzione speculativa porterà alla reperibilità in cache condivisa dei dati letti dalla memoria.
Per identificare i dati rimasti nella cache dopo l'esecuzione speculativa delle operazioni, un attaccante può utilizzare metodi per rilevare dati residuali attraverso canali laterali, come ad esempio analizzare le variazioni nei tempi di accesso ai dati memorizzati nella cache e non memorizzati. Per un'estrazione mirata di informazioni da aree a un altro livello di privilegi (ad esempio, dalla memoria del kernel) vengono utilizzati i "gadgets" - sequenze di istruzioni presenti nel kernel, adatte per la lettura speculativa di dati dalla memoria a seconda delle condizioni esterne, su cui l'attaccante può influire.
Per proteggere da attacchi classici di tipo Spectre, che utilizzano istruzioni di salto condizionale e indiretto, la maggior parte dei sistemi operativi applica la tecnica «retpoline», basata sulla sostituzione delle operazioni di salto indiretto con l'istruzione «ret», per la quale nei processori viene utilizzato un apposito blocco di previsione dello stato dello stack, che non utilizza il blocco di previsione dei salti. Durante l'implementazione di retpoline nel 2018, si riteneva che manovre simili a quelle di Spectre, relative agli indirizzi, non fossero applicabili nella pratica per il salto speculativo tramite l'istruzione «ret».
I ricercatori che hanno sviluppato il metodo di attacco Retbleed hanno dimostrato la possibilità di creare condizioni microarchitetturali per avviare un salto speculativo utilizzando l'istruzione «ret» e hanno pubblicato un toolkit pronto per identificare nel kernel di Linux sequenze di istruzioni vulnerabili (gadgets) che presentano tali condizioni.
Durante la ricerca è stato preparato un exploit funzionante, che consente sui sistemi con CPU Intel di estrarre dati arbitrari dalla memoria del kernel a una velocità di 219 byte al secondo e con una precisione del 98%. Sui processori AMD, l'efficacia dell'exploit è molto maggiore: la velocità di fuga è di 3,9 KB al secondo. Come esempio pratico, è stato mostrato come utilizzare l'exploit proposto per determinare il contenuto del file /etc/shadow. Nei sistemi con CPU Intel, l'attacco per determinare l'hash della password dell'utente root è stato completato in 28 minuti, mentre sui sistemi con CPU AMD in 6 minuti.

La possibilità di eseguire l'attacco è stata confermata per le CPU Intel delle generazioni 6-8, prodotte prima del terzo trimestre 2019 (incluso Skylake), e per le CPU AMD basate su microarchitetture Zen 1, Zen 1+ e Zen 2, prodotte prima del secondo trimestre 2021. Nei modelli di processori più recenti, come AMD Zen3 e Intel Alder Lake, così come nei processori ARM, il problema è bloccato dai meccanismi di protezione esistenti. Ad esempio, l'uso delle istruzioni IBRS (Indirect Branch Restricted Speculation) aiuta a difendersi dall'attacco.
Per il kernel Linux e l'iperparadigma Xen è stato preparato un insieme di modifiche per le vecchie CPU che bloccano il problema tramite software. La patch proposta per il kernel Linux modifica 68 file, aggiunge 1783 righe e rimuove 387 righe. Sfortunatamente, la protezione comporta un significativo sovraccarico — nei test condotti su processori AMD e Intel, la diminuzione delle prestazioni è valutata tra il 14% e il 39%. È più preferibile applicare la protezione basata sulle istruzioni IBRS, disponibili nelle nuove generazioni di CPU Intel e supportate a partire dal kernel Linux 4.19.
Nei processori Intel, la sostituzione dell'indirizzo per il salto indiretto speculativo avviene grazie a una caratteristica che si manifesta durante il sottoscaricamento (underflow) nel buffer di previsione del contenuto dello stack (Return Stack Buffer). In presenza di tali condizioni, per l'istruzione «ret» inizia ad essere applicata una logica di selezione dell'indirizzo simile a quella utilizzata per i salti indiretti normali. Nel kernel Linux sono stati trovati più di mille punti che creano condizioni per l'inizio di tale sottoscaricamento inverso e accessibili tramite chiamate di sistema.
Nei processori AMD, l'esecuzione speculativa dell'istruzione «ret» avviene senza legarsi a un buffer specifico dello stack (Return Address Stack), e il blocco di previsione dei salti considera l'istruzione «ret» non come un ritorno al controllo, ma come un salto indiretto, e di conseguenza utilizza per la previsione i dati per i salti indiretti. In tali condizioni, praticamente qualsiasi operazione «ret» raggiunta tramite una chiamata di sistema può essere utilizzata per sfruttare questa vulnerabilità.
Inoltre, nei processori AMD è stata identificata un'altra problematica (CVE-2022-23825, Branch Type Confusion) relativa all'esecuzione di salti fittizi: le condizioni per la previsione del salto possono sorgere anche senza le necessarie istruzioni di ramificazione, il che consente di influenzare il buffer di previsione dei salti senza l'istruzione «ret». Questa caratteristica complica notevolmente l'implementazione della protezione e richiede una pulizia più attiva del buffer di previsione dei salti. Si prevede che l'aggiunta di una protezione completa nel kernel porterà a un aumento del sovraccarico del 209%.
Fonte: opennet.ru
