Retbleed è un nuovo attacco al meccanismo di esecuzione speculativa delle CPU Intel e AMD

Un gruppo di ricercatori dell'ETH di Zurigo ha identificato un nuovo attacco al meccanismo di esecuzione speculativa delle transizioni indirette nella CPU, che consente di estrarre informazioni dalla memoria del kernel o di organizzare un attacco al sistema host da macchine virtuali. Le vulnerabilità hanno il nome in codice Retbleed (CVE-2022-29900, CVE-2022-29901) e sono di natura simile agli attacchi Spectre-v2. La differenza si riduce all'organizzazione dell'esecuzione speculativa del codice arbitrario durante l'elaborazione dell'istruzione "ret" (return), che recupera l'indirizzo da saltare dallo stack, invece di un salto indiretto utilizzando l'istruzione "jmp", caricando l'indirizzo da memoria o un registro della CPU.

Un utente malintenzionato può creare le condizioni per una previsione errata della transizione e organizzare una transizione mirata e speculativa verso un blocco di codice non previsto dalla logica di esecuzione del programma. Alla fine, il processore determinerà che la previsione del ramo non era giustificata e riporterà l'operazione al suo stato originale, ma i dati elaborati durante l'esecuzione speculativa finiranno nella cache e nei buffer della microarchitettura. Se un blocco eseguito erroneamente accede alla memoria, la sua esecuzione speculativa porterà al deposito dei dati letti dalla memoria nella cache condivisa.

Per determinare i dati rimanenti nella cache dopo operazioni speculative, un utente malintenzionato può utilizzare tecniche di canale laterale per determinare i dati residui, come l'analisi delle modifiche nei tempi di accesso ai dati memorizzati nella cache e non nella cache. Per estrarre intenzionalmente informazioni da aree ad un altro livello di privilegio (ad esempio, dalla memoria del kernel), vengono utilizzati i "gadget": sequenze di comandi presenti nel kernel adatte alla lettura speculativa dei dati dalla memoria in base alle condizioni esterne che possono essere influenzate da l'attaccante.

Per proteggersi dai classici attacchi della classe Spectre che utilizzano istruzioni di salto condizionale e indiretto, la maggior parte dei sistemi operativi utilizza la tecnica "retpoline", che si basa sulla sostituzione delle operazioni di salto indiretto con l'istruzione "ret", per la quale i processori utilizzano un'unità di previsione dello stato dello stack separata .non utilizzare un blocco di previsione dei rami. Quando retpoline è stata introdotta nel 2018, si credeva che le manipolazioni degli indirizzi in stile Spectre non fossero pratiche per le ramificazioni speculative utilizzando l’istruzione “ret”.

I ricercatori che hanno sviluppato il metodo di attacco Retbleed hanno dimostrato la possibilità di creare condizioni microarchitettoniche per avviare una transizione speculativa utilizzando l’istruzione “ret” e hanno pubblicato strumenti già pronti per identificare sequenze di istruzioni (gadget) adatte a sfruttare la vulnerabilità nel kernel Linux, in cui tali condizioni si manifestano.

Durante la ricerca è stato preparato un exploit funzionante che consente, su sistemi con CPU Intel, di estrarre dati arbitrari dalla memoria del kernel da un processo non privilegiato nello spazio utente ad una velocità di 219 byte al secondo e con una precisione del 98%. Sui processori AMD, l'efficienza dell'exploit è molto più elevata: il tasso di perdita è di 3.9 KB al secondo. Come esempio pratico, mostriamo come utilizzare l'exploit proposto per determinare il contenuto del file /etc/shadow. Sui sistemi con CPU Intel, l'attacco per determinare l'hash della password dell'utente root è stato effettuato in 28 minuti e su sistemi con CPU AMD in 6 minuti.

L'attacco è stato confermato per le generazioni 6-8 di processori Intel rilasciati prima del terzo trimestre del 3 (incluso Skylake) e di processori AMD basati sulle microarchitetture Zen 2019, Zen 1+ e Zen 1 rilasciati prima del secondo trimestre del 2. Nei modelli di processori più recenti come AMD Zen2021 e Intel Alder Lake, così come nei processori ARM, il problema è bloccato dai meccanismi di protezione esistenti. Ad esempio, l’utilizzo delle istruzioni IBRS (Indirect Branch Restricted Speculation) aiuta a proteggersi dagli attacchi.

È stata preparata una serie di modifiche per il kernel Linux e l'hypervisor Xen, che bloccheranno il problema nel software delle CPU più vecchie. La patch proposta per il kernel Linux modifica 68 file, aggiunge 1783 righe e cancella 387 righe. Sfortunatamente, la protezione comporta notevoli costi generali: nei testi condotti sui processori AMD e Intel, il calo delle prestazioni è stimato dal 14% al 39%. È preferibile utilizzare la protezione basata sulle istruzioni IBRS, disponibile nelle nuove generazioni di CPU Intel e supportata a partire dal kernel Linux 4.19.

Sui processori Intel, la sostituzione dell'indirizzo per un salto indiretto speculativo viene effettuata grazie a una funzionalità che appare quando si verifica un overflow attraverso il limite inferiore (underflow) nel Return Stack Buffer. Quando si verificano tali condizioni, l'istruzione “ret” inizia ad applicare una logica di selezione dell'indirizzo simile a quella utilizzata per i normali salti indiretti. Nel kernel Linux sono stati trovati più di mille posti che creano le condizioni per avviare un simile flusso di ritorno e sono accessibili tramite chiamate di sistema.

Sui processori AMD, l'esecuzione speculativa dell'istruzione "ret" viene eseguita senza riferimento a un buffer specifico dello stack (Return Address Stack) e l'unità di previsione del ramo considera l'istruzione "ret" non come un ritorno di controllo, ma come un ramo indiretto e, di conseguenza, utilizza i dati per prevedere le transizioni indirette. In queste condizioni, praticamente qualsiasi operazione "ret" raggiungibile tramite una chiamata di sistema può essere sfruttata.

Inoltre, è stato identificato anche un altro problema nelle CPU AMD (CVE-2022-23825, Branch Type Confusion) relativo all'implementazione di rami fittizi: le condizioni per la previsione dei rami possono verificarsi anche senza le necessarie istruzioni di ramo, il che consente di influenzare il buffer di previsione dei rami. senza l'istruzione "ret". Questa funzionalità complica notevolmente l'implementazione della protezione e richiede una pulizia più attiva del buffer di previsione dei rami. Si prevede che l'aggiunta di una protezione completa al kernel aumenterà il sovraccarico del 209%.

Fonte: opennet.ru

Aggiungi un commento