I ricercatori di sicurezza di Calif hanno pubblicato un exploit di prova di concetto che, secondo loro, permette a un utente locale di ottenere privilegi root su OpenBSD 7.9. La catena combina un integer overflow nella memoria condivisa, uno use-after-free legato al conteggio dei riferimenti e una scrittura fuori dai limiti nel kernel.
Secondo il resoconto di The Hacker News sulla ricerca di Calif, la società ha segnalato le falle a OpenBSD «all'inizio dell'anno» e in seguito ha pubblicato un'analisi tecnica dettagliata e il codice completo del PoC su GitHub.
L'attacco descritto richiede l'accesso locale. Il report non contiene prove che le vulnerabilità siano state sfruttate in attacchi reali. Al momento della pubblicazione, nessuna delle due falle aveva ancora un identificativo CVE.
Un contatore a 16 bit apre la catena di exploit
Il problema iniziale risiede nella funzione di attach associata a shmat(4), che collega un processo a un segmento di memoria condivisa. OpenBSD tiene traccia del numero di collegamenti tramite shm_nattch, un short con segno a 16 bit il cui valore massimo è 32.767.
Calif ha ricondotto quel tipo di dato a codice sorgente BSD del 1988. Poiché il campo non è stato allargato, un numero di collegamenti sufficientemente alto può superare il limite positivo e passare a un valore negativo.
Nel PoC dei ricercatori vengono mappati 127 segmenti di memoria condivisa e creati 259 processi con fork. Secondo quanto riportato, questa sequenza porta il contatore oltre il massimo, fino al valore di −32.643.
Il solo overflow non concede privilegi elevati. Secondo Calif, una race condition che segue il wraparound porta a un conteggio dei riferimenti errato e a uno use-after-free: il kernel rilascia la memoria mentre altri processi continuano a farvi riferimento.
Una scrittura fuori dai limiti, separata, corrompe quindi i contatori di appartenenza multicast nel kernel. Alla chiusura del socket interessato, i decrementi di tali contatori alterano le voci della tabella delle pagine. Secondo i ricercatori, il risultato è che una mappatura della memoria utente diventa accessibile in modalità supervisor.
Nella fase finale, l'exploit sovrascrive un puntatore a funzione a un indirizzo del kernel prevedibile, consentendo l'esecuzione di codice controllato dall'attaccante con privilegi kernel. Secondo Calif, la catena non richiede una vulnerabilità separata di divulgazione di informazioni.
L'allocazione deterministica indebolisce la randomizzazione del kernel
L'exploit si basa anche sul posizionamento prevedibile delle strutture del kernel. Il report afferma che gli allocatori del kernel di boot-time e best-fit di OpenBSD non randomizzano i loro indirizzi base. Le strutture iniziali possono quindi occupare le stesse posizioni dopo i riavvii sullo stesso hardware.
I puntatori a funzione rilevanti sono associati agli handler delle interfacce di rete lo0 e enc0.
Il ricercatore Andrew Griffiths ha spiegato che KARL ricollega il kernel per modificare la posizione di funzioni e dati, mentre gli allocatori restano deterministici. Calif afferma che la catena aggira KARL, SMAP e SMEP.
Questi risultati riguardano livelli di protezione diversi: randomizzare l'immagine del kernel non randomizza necessariamente ogni oggetto allocato successivamente. Un comportamento prevedibile dell'allocatore può quindi fornire all'exploit bersagli stabili anche quando codice e dati del kernel sono stati ricollegati.
Le correzioni sono disponibili tramite syspatch
L'integer overflow della memoria condivisa è stato corretto con l'errata 018, rilasciata il 14 settembre. Il report afferma che OpenBSD ha classificato l'aggiornamento come correzione di affidabilità, non di sicurezza. È stato inoltre distribuito anche per OpenBSD 7.8.
Lo use-after-free è stato corretto con l'errata 026, rilasciata il 30 settembre e classificata come correzione di sicurezza. Entrambi gli aggiornamenti sono disponibili tramite syspatch, valgono per tutte le architetture e vanno installati dove applicabili.
Gli amministratori che usano OpenBSD 7.9 dovrebbero verificare che siano presenti sia l'errata 018 sia la 026, invece di considerare il primo aggiornamento come una semplice correzione di stabilità operativa. Gli utenti di OpenBSD 7.8 dovrebbero assicurarsi di aver ricevuto gli aggiornamenti syspatch applicabili, inclusa la correzione dell'errata 018 documentata per quella release.
Calif ha inoltre proposto quattro difese più ampie: safe-unlinking per le liste collegate del kernel, randomizzazione della mappatura auto-referenziale della tabella delle pagine, randomizzazione dell'allocatore del kernel e controllo dei limiti assistito dal compilatore. Si tratta di raccomandazioni di hardening, non di correzioni riportate come distribuite con le due errata.




