Race condition nel Garbage Collector del kernel Linux che può portare all'escalation dei privilegi

Jann Horn del team Google Project Zero, che una volta identificate le vulnerabilità Spectre e Meltdown, ha pubblicato una tecnica per sfruttare una vulnerabilità (CVE-2021-4083) nel garbage collector del kernel Linux. La vulnerabilità è dovuta a una condizione di competizione durante la pulizia dei descrittori di file sui socket Unix e potenzialmente consente a un utente locale non privilegiato di eseguire il proprio codice a livello di kernel.

Il problema è interessante perché si stima che la finestra temporale durante la quale si verifica la race condition sia troppo piccola per creare veri exploit, ma l'autore dello studio ha dimostrato che anche tali vulnerabilità inizialmente scettiche possono diventare fonte di attacchi reali se l'autore dell'exploit ha le competenze e il tempo necessari. Yann Horn ha mostrato come, con l'aiuto di manipolazioni filigranate, è possibile ridurre la condizione di competizione che si verifica quando si chiamano contemporaneamente le funzioni close() e fget() in una vulnerabilità use-after-free completamente sfruttabile e ottenere l'accesso a dati già liberati struttura all'interno del kernel.

Una condizione di competizione si verifica durante il processo di chiusura di un descrittore di file mentre si chiamano close() e fget() contemporaneamente. La chiamata a close() può verificarsi prima dell'esecuzione di fget(), il che confonderà il garbage collector perché, secondo il refcount, la struttura del file non avrà riferimenti esterni, ma rimarrà attaccata al descrittore del file, cioè Il garbage collector penserà di avere accesso esclusivo alla struttura, ma in realtà, per un breve periodo di tempo, la voce rimanente nella tabella dei descrittori di file punterà ancora alla struttura che viene liberata.

Per aumentare la probabilità di entrare in una condizione di competizione, sono stati utilizzati diversi trucchi che hanno permesso di aumentare la probabilità di successo dello sfruttamento al 30% quando si introducono ottimizzazioni specifiche del sistema. Ad esempio, per aumentare il tempo di accesso a una struttura con descrittori di file di diverse centinaia di nanosecondi, i dati sono stati espulsi dalla cache del processore riempiendo la cache di attività su un altro core della CPU, il che ha reso possibile recuperare la struttura dalla memoria anziché da la cache veloce della CPU.

La seconda caratteristica importante era l'uso di interruzioni generate da un timer hardware per aumentare il tempo della race condition. Il momento è stato selezionato in modo che il gestore delle interruzioni si attivasse quando si verificava una condizione di competizione e interrompesse l'esecuzione del codice per un po' di tempo. Per ritardare ulteriormente il ritorno del controllo, sono state generate circa 50mila voci nella coda di attesa utilizzando epoll, che richiedeva la ricerca nel gestore degli interrupt.

La tecnica per sfruttare la vulnerabilità è stata resa nota dopo un periodo di riservatezza di 90 giorni. Il problema si presenta a partire dal kernel 2.6.32 ed è stato risolto all'inizio di dicembre. La correzione è stata inclusa nel kernel 5.16 ed è stata anche trasferita ai rami LTS del kernel e ai pacchetti kernel forniti nelle distribuzioni. È interessante notare che la vulnerabilità è stata identificata durante l'analisi di un problema simile CVE-2021-0920, che si manifesta nel Garbage Collector durante l'elaborazione del flag MSG_PEEK.

Fonte: opennet.ru

Aggiungi un commento