È stata identificata una vulnerabilità nel kernel Linux (CVE-2022-0847) che consente di sovrascrivere il contenuto della cache delle pagine per qualsiasi file, inclusi quelli aperti in modalità di sola lettura con il flag O_RDONLY o montati in sistemi di file in sola lettura. Dal punto di vista pratico, questa vulnerabilità può essere sfruttata per iniettare codice in processi arbitrari o corrompere i dati in file aperti. Ad esempio, è possibile modificare il contenuto del file authorized_keys per il processo sshd. È disponibile un prototipo di exploit per i test.
Il problema è stato battezzato Dirty Pipe, in analogia alla vulnerabilità critica Dirty COW scoperta nel 2016. Si fa notare che Dirty Pipe presenta un livello di pericolosità pari a quello di Dirty COW, ma è significativamente più facile da sfruttare. La vulnerabilità è stata scoperta durante l'analisi di segnalazioni riguardanti la corruzione periodica di file scaricati dalla rete in un sistema che caricava archivi compressi da un server di log (37 corruzioni in 3 mesi su un sistema sovraccarico), utilizzando l'operazione splice() e pipe anonime.
La vulnerabilità si manifesta a partire dal kernel Linux 5.8, rilasciato nell'agosto 2020, quindi è presente in Debian 11, ma non interessa il kernel base di Ubuntu 20.04 LTS. I kernel RHEL 8.x e openSUSE/SUSE 15 sono inizialmente basati su vecchie versioni, ma non si può escludere che la modifica problematica sia stata retroportata in esse (al momento non ci sono dati precisi). È possibile tenere traccia della pubblicazione degli aggiornamenti dei pacchetti nei distribuiti su queste pagine: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. La correzione della vulnerabilità è proposta nelle versioni 5.16.11, 5.15.25 e 5.10.102. La correzione è stata inclusa anche nel kernel utilizzato nella piattaforma Android.
La vulnerabilità è causata dall'assenza di inizializzazione del valore «buf->flags» nel codice delle funzioni copy_page_to_iter_pipe() e push_pipe(), poiché la memoria non viene pulita durante l'allocazione della struttura. A seguito di particolari manipolazioni con pipe anonime, in «buf->flags» potrebbe trovarsi un valore derivante da un'altra operazione. Sfruttando questa particolare caratteristica, un utente locale non privilegiato potrebbe ottenere la comparsa nel flag del valore PIPE_BUF_FLAG_CAN_MERGE, che consente di organizzare la sovrascrittura dei dati nella cache delle pagine tramite la semplice scrittura di nuovi dati in una pipe anonima appositamente preparata.
Per attaccare, il file bersaglio deve essere accessibile in lettura. Inoltre, poiché durante la scrittura in pipe non vengono controllati i diritti di accesso, la sostituzione nella cache delle pagine può avvenire anche per file situati in sezioni montate solo in lettura (ad esempio, per file su CD-ROM). Dopo aver sostituito le informazioni nella cache delle pagine, il processo, durante la lettura dei dati dal file, otterrà non i dati reali ma quelli sovrascritti.
L'utilizzo consiste nella creazione di un canale unnamed e nel riempirlo con dati arbitrari per attivare il flag PIPE_BUF_FLAG_CAN_MERGE in tutte le strutture circolari correlate. Successivamente, i dati vengono letti dal canale, ma il flag rimane attivato in tutte le istanze della struttura pipe_buffer nelle strutture circolari pipe_inode_info. Si procede poi con la chiamata a splice() per leggere i dati dal file di destinazione nel canale unnamed, partendo dallo spostamento richiesto. Durante la scrittura dei dati in questo canale unnamed, a causa del flag PIPE_BUF_FLAG_CAN_MERGE, i dati nella cache a pagina verranno sovrascritti, anziché creare una nuova istanza della struttura pipe_buffer.
Fonte: opennet.ru
