Nel'interfaccia di input/output asincrono io_uring fornita dal nucleo Linux è stata individuata una vulnerabilità (CVE-2024-0582) che consente a un utente non privilegiato di ottenere diritti di root nel sistema. Per sfruttare la vulnerabilità è sufficiente un normale accesso locale al sistema, senza la necessità di manipolare gli spazi dei nomi. Attualmente è disponibile pubblicamente un exploit funzionante, e viene inoltre descritta in dettaglio una seconda tecnica di sfruttamento della vulnerabilità.
La vulnerabilità è causata dall'accesso a un blocco di memoria già liberato (use-after-free) nel sottosistema io_uring, che si verifica durante la registrazione e la liberazione del buffer circolare creato con il flag IORING_REGISTER_PBUF_RING. Nella situazione in cui si applica l'operazione mmap() al buffer, esso rimane riflesso nello spazio utente dopo l'esecuzione dell'operazione di liberazione (IORING_UNREGISTER_PBUF_RING). Sfruttando questa peculiarità, l'attaccante può leggere e scrivere dati nelle pagine di memoria restituite dal sistema di allocazione della memoria del nucleo.
Il problema si manifesta a partire dalla release del nucleo Linux 6.4 ed è stato risolto nelle versioni 6.7 e 6.6.5, oltre che nel pacchetto con il nucleo 6.5.0-21, preparato per Ubuntu 22.04 e 23.10. È notevole che nel nucleo principale il problema sia stato corretto a dicembre 2023; il progetto Google Zero ha aperto l'accesso al messaggio di errore segnalante la vulnerabilità l'8 gennaio, mentre il pacchetto con il nucleo corretto 6.5 per Ubuntu è stato formato solo il 22 febbraio 2024. Negli altri distributori è possibile seguire la correzione e la suscettibilità alla vulnerabilità sulle pagine: Debian, Gentoo, RHEL, SUSE, Fedora, Arch.
Il primo exploit manipola la creazione di un gran numero di pagine di memoria controllate dall'attaccante per determinare la disposizione della memoria nel nucleo e accedere alle pagine fisiche di memoria adiacenti, utilizzando come segnali il contenuto di strutture di socket di rete riempite in un certo modo. Per eseguire il codice nell'exploit è stato utilizzato un "gadgetto" (una sequenza di istruzioni già presenti nel nucleo) che porta all'esecuzione della funzione call_usermodehelper_exec, progettata per avviare processi nello spazio utente dal nucleo.
Il secondo exploit si basa sul fatto che, quando tutte le slab blocks nella cache sono esaurite (ad esempio, quando un file viene aperto molte volte), le pagine di memoria libere, a cui l'attaccante ha accesso, vengono utilizzate dal sistema di gestione della memoria per creare un nuovo slab block e tutte le nuove strutture di file iniziano a essere collocate in questo blocco. Di conseguenza, alcune strutture di file finiranno in pagine di memoria che l'attaccante può leggere e scrivere. L'exploit consiste nell'organizzare l'ingresso del file desiderato nella cache dei file e nel cambiare nei relativi strutture di file il campo f_mode, che determina i diritti di accesso, rendendo possibile l'accesso in scrittura al file di sistema desiderato, ad esempio, /etc/passwd.
Fonte: opennet.ru
