
Ricercatori hanno dimostrato un exploit che permette di ottenere privilegi di root su OpenBSD 7.9, combinando un overflow di interi risalente agli anni '80 con una falla nel kernel. Le vulnerabilità sono state corrette a settembre.
Ricercatori di sicurezza hanno recentemente reso pubblica la dimostrazione di un exploit in grado di elevare i privilegi fino a ottenere l'accesso di root su sistemi OpenBSD versione 7.9. L'attacco sfrutta una combinazione di due vulnerabilità distinte: una che risale a circa 37 anni fa, legata a un integer overflow, e una più recente relativa al kernel. Questo tandem di falle permette di aggirare le protezioni hardware di SMAP (Supervisor Mode Access Prevention) e SMEP (Supervisor Mode Execution Prevention), oltre alla randomizzazione degli indirizzi del kernel KARL.
Le falle sono state scoperte e segnalate dalla società di sicurezza Calif, che ha pubblicato dettagli tecnici e codice di prova di concetto (proof-of-concept) dopo che OpenBSD ha rilasciato le patch correttive a settembre.
La prima vulnerabilità, un integer overflow nella funzione shmat(4) (utilizzata per l'attacco di memoria condivisa), è stata classificata come un problema di affidabilità piuttosto che di sicurezza. Questa falla è stata corretta nell'errata 018, rilasciata il 14 settembre. La seconda falla, un use-after-free legato al conteggio dei riferimenti, è stata risolta separatamente nell'errata 026, distribuita il 30 settembre come correzione di sicurezza. Entrambe le correzioni sono disponibili tramite lo strumento syspatch e coprono tutte le architetture supportate da OpenBSD. Anche la versione 7.8 di OpenBSD ha ricevuto la correzione per l'overflow di interi.
Al momento della pubblicazione, nessuna delle due falle ha ricevuto un identificativo CVE (Common Vulnerabilities and Exposures). Non ci sono prove che queste vulnerabilità siano state sfruttate in attacchi reali.
L'exploit inizia con l'overflow di interi. Il contatore shm_nattch, che gestisce il numero di processi che accedono a un segmento di memoria condivisa, è definito come un signed 16-bit short, con un valore massimo di 32.767. Questo tipo di dato, ereditato da vecchie versioni BSD del 1988, non è mai stato ampliato in OpenBSD. L'attaccante crea 127 segmenti di memoria condivisa e avvia 259 processi. Questo porta il contatore a superare il suo limite massimo, causando un wrap-around a un valore negativo (-32.643). Questa condizione crea una race condition che innesca il use-after-free: il conteggio dei riferimenti corrotto induce il kernel a liberare memoria che è ancora in uso da altri processi.
Successivamente, un'operazione di scrittura fuori dai limiti (out-of-bounds write) sovrascrive i contatori relativi ai gruppi multicast all'interno del kernel. Quando il socket interessato viene chiuso, le decrementazioni associate modificano le page table entries. Questo processo permette di rendere accessibile alla modalità supervisore una porzione di memoria utente, bypassando così le protezioni SMAP e SMEP. L'exploit può quindi sovrascrivere un puntatore a funzione in un indirizzo prevedibile del kernel per eseguire codice arbitrario.
Nonostante OpenBSD implementi KARL (Kernel Address Randomization by Linker) per randomizzare gli indirizzi delle funzioni e dei dati nel binario del kernel, i meccanismi di allocazione della memoria rimangono deterministici. Sia l'allocatore all'avvio (boot-time allocator) sia quello a miglior adattamento (best-fit allocator) mancano di randomizzazione dell'indirizzo base. Di conseguenza, le strutture dati caricate all'avvio del sistema, inclusi i puntatori a funzione nei gestori delle interfacce di rete lo0 e enc0, si trovano agli stessi indirizzi dopo ogni riavvio sulla stessa macchina. Questo rende l'exploit efficace senza la necessità di una vulnerabilità di information disclosure.
Oltre alle correzioni rilasciate, Calif ha suggerito quattro aree di miglioramento per rafforzare ulteriormente la sicurezza di OpenBSD: l'implementazione di un meccanismo di safe-unlinking per le liste concatenate del kernel (già adottato da FreeBSD e NetBSD), la randomizzazione della mappatura auto-referenziale delle page table, la randomizzazione degli allocatori del kernel e l'uso di controlli dei limiti basati sul compilatore.
La società ha dichiarato di aver segnalato le falle a OpenBSD all'inizio dell'anno. Il codice di prova di concetto è disponibile pubblicamente su GitHub, permettendo ad altri ricercatori e amministratori di sistema di studiarne il funzionamento e verificare la corretta applicazione delle patch.
Contenuto generato automaticamente da intelligenza artificiale a partire da fonti pubbliche. Non garantiamo l'accuratezza assoluta delle informazioni: consulta sempre la fonte originale. I diritti sui contenuti originali appartengono ai rispettivi editori.