È stata individuata una vulnerabilità nel kernel Linux (CVE-2022-0847) che consente di sovrascrivere il contenuto della cache delle pagine per qualsiasi file, incluso quelli in sola lettura, aperti con il flag O_RDONLY o situati in filesystem montati in sola lettura. Dal punto di vista pratico, questa vulnerabilità può essere sfruttata per inserire codice in processi arbitrari o per corrompere dati in file aperti. Ad esempio, è possibile modificare il contenuto del file authorized_keys per il processo sshd. È disponibile un prototipo di exploit per il test.
Il problema è stato assegnato il nome in codice Dirty Pipe, in analogia con la vulnerabilità critica Dirty COW scoperta nel 2016. Si segnala che, per livello di pericolo, Dirty Pipe è equiparabile a Dirty COW, ma risulta significativamente più semplice da sfruttare. La vulnerabilità è stata scoperta durante l'analisi di segnalazioni riguardo a danni periodici ai file caricati in rete da un sistema che carica archivi compressi da un log server (37 danneggiamenti in 3 mesi su un sistema sotto carico), durante il quale è stata utilizzata l'operazione splice() e pipe non denominate.
La vulnerabilità si manifesta a partire dal kernel Linux 5.8, rilasciato nell'agosto 2020, ossia è presente in Debian 11, ma non colpisce il kernel di base in Ubuntu 20.04 LTS. I kernel RHEL 8.x e openSUSE/SUSE 15 sono inizialmente basati su rami più vecchi, ma non si esclude che la modifica che ha causato il problema sia stata retroportata in essi (non ci sono ancora dati certi). È possibile monitorare la pubblicazione degli aggiornamenti dei pacchetti nelle distribuzioni sulle seguenti pagine: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. La correzione della vulnerabilità è stata proposta nelle versioni 5.16.11, 5.15.25 e 5.10.102. La correzione è stata inoltre inclusa nel kernel utilizzato nella piattaforma Android.
La vulnerabilità è causata dalla mancanza di inizializzazione del valore "buf->flags" nel codice delle funzioni copy_page_to_iter_pipe() e push_pipe(), dato che la memoria non viene liberata durante l'allocazione della struttura e, a seguito di particolari manovre con pipe non denominate, nel "buf->flags" potrebbe trovarsi un valore proveniente da un'altra operazione. Sfruttando questa caratteristica, un utente locale non privilegiato può ottenere la comparsa nel flag di 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 non denominata appositamente preparata.
Per attaccare, il file di destinazione deve essere accessibile in lettura; poiché durante la scrittura nel pipe non vengono controllati i diritti di accesso, la sostituzione nella cache di pagina può avvenire anche per file situati in partizioni montate in sola lettura (ad esempio, per file su CD-ROM). Dopo la sostituzione delle informazioni nella cache di pagina, il processo che legge i dati dal file otterrà non dati reali, ma dati alterati.
Lo sfruttamento consiste nella creazione di un canale anonimo e nel riempirlo di dati casuali per indurre l'impostazione del flag PIPE_BUF_FLAG_CAN_MERGE in tutte le strutture anulari associate. Successivamente, i dati vengono letti dal canale, ma il flag rimane attivo in tutte le istanze della struttura pipe_buffer nelle strutture anulari pipe_inode_info. Viene quindi chiamato splice() per leggere i dati dal file di destinazione nel canale anonimo, a partire dall'offset richiesto. Durante la scrittura dei dati in questo canale anonimo, a causa del flag PIPE_BUF_FLAG_CAN_MERGE, i dati nella cache di pagina verranno sovrascritti, invece di creare una nuova istanza della struttura pipe_buffer.
Fonte: opennet.ru
