Vulnerabilità nel kernel Linux che può manomettere i file di sola lettura

È stata individuata una vulnerabilità nel kernel Linux (CVE-2022-0847) che consente di sovrascrivere il contenuto della cache della pagina per qualsiasi file, inclusi quelli in modalità di sola lettura, aperti con il flag O_RDONLY o che si trovano su file system montati in modalità di sola lettura. In pratica, la vulnerabilità potrebbe essere utilizzata per inserire codice in processi arbitrari o corrompere dati in file aperti. Ad esempio, puoi modificare il contenuto del file authorized_keys per il processo sshd. Un exploit prototipo è disponibile per il test.

Al problema è stato dato il nome in codice Dirty Pipe, per analogia con la vulnerabilità critica Dirty COW identificata nel 2016. Si noti che Dirty Pipe è allo stesso livello di Dirty COW in termini di pericolo, ma è molto più facile da usare. La vulnerabilità è stata individuata durante l'analisi dei reclami sui danni periodici ai file scaricati in rete in un sistema che scarica archivi compressi da un server di log (37 danni in 3 mesi su un sistema caricato), che sono stati preparati utilizzando l'operazione splice() e tubi senza nome.

La vulnerabilità si è manifestata dal kernel Linux 5.8, rilasciato nell'agosto 2020, ovvero è presente in Debian 11 ma non influisce sul kernel di base in Ubuntu 20.04 LTS. I kernel RHEL 8.xe openSUSE/SUSE 15 sono originariamente basati su rami vecchi, ma è possibile che la modifica che ha causato il problema sia stata trasferita su di essi (non ci sono ancora dati esatti). Puoi seguire la pubblicazione degli aggiornamenti dei pacchetti nelle distribuzioni su queste pagine: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Una correzione per la vulnerabilità è stata proposta nelle versioni 5.16.11, 5.15.25 e 5.10.102. La correzione è inclusa anche nel kernel utilizzato nella piattaforma Android.

La vulnerabilità è causata dalla mancata inizializzazione del valore “buf->flags” nel codice delle funzioni copy_page_to_iter_pipe() e push_pipe(), nonostante la memoria non venga cancellata quando la struttura viene allocata, e con alcune manipolazioni con pipe senza nome, "buf->flags" può contenere un valore da un'altra operazione. Utilizzando questa funzione, un utente locale senza privilegi può ottenere l'aspetto del valore PIPE_BUF_FLAG_CAN_MERGE nel flag, che consente di sovrascrivere i dati nella cache della pagina semplicemente scrivendo nuovi dati in una pipe (pipe) senza nome appositamente preparata.

Per un attacco, il file di destinazione deve essere leggibile e poiché i diritti di accesso non vengono controllati durante la scrittura su una pipe, è possibile effettuare la sostituzione nella cache della pagina, anche per i file che si trovano nelle partizioni montate in sola lettura (ad esempio, per i file c CD ROM). Dopo aver sostituito le informazioni nella cache della pagina, il processo, durante la lettura dei dati dal file, non riceverà i dati effettivi, ma quelli sostituiti.

L'operazione si riduce alla creazione di una pipe senza nome e al suo riempimento con dati arbitrari per ottenere l'impostazione del flag PIPE_BUF_FLAG_CAN_MERGE in tutte le strutture ad anello ad essa associate. Successivamente, i dati vengono letti dalla pipe, ma il flag rimane impostato in tutte le istanze della struttura pipe_buffer nelle strutture ad anello pipe_inode_info. Quindi viene eseguita una chiamata splice() per leggere i dati dal file di destinazione in una pipe senza nome, a partire dall'offset richiesto. Quando i dati vengono scritti in questa pipe senza nome, il flag PIPE_BUF_FLAG_CAN_MERGE sovrascriverà i dati nella cache della pagina invece di creare una nuova istanza della struttura pipe_buffer.

Fonte: opennet.ru

Aggiungi un commento