Linux, nuova grave vulnerabilità: approfondimento su Dirty Pipe
Un ricercatore di sicurezza ha reso noti i dettagli di una grave vulnerabilità che consente a un malintenzionato di sovrascrivere dati presenti in file arbitrari di sola lettura. La vulnerabilità, battezzata Dirty Pipe (CVE-2022-0847), è stata scoperta da Max Kellermann nell’aprile 2021, ma ci sono voluti diversi mesi prima che capisse cosa stava effettivamente accadendo. Kellermann ha spiegato che la vulnerabilità interessa Linux Kernel 5.8 e le versioni successive, e attualmente è stata corretta in Linux 5.16.11, 5.15.25 e 5.10.102.
Dirty Pipe: vulnerabilità grave
Tutto è iniziato un anno fa con un ticket di supporto relativo a file corrotti. Un cliente si è lamentato del fatto che i log di accesso scaricati non potevano essere decompressi. E, in effetti, c’era un file di log corrotto su uno dei server di log; poteva essere decompresso, ma gzip segnalava un errore CRC. Non riuscivo a spiegare perché fosse corrotto, ma presumevo che il processo di divisione notturna si fosse arrestato in modo anomalo e avesse prodotto un file corrotto. Ho corretto manualmente il CRC del file, chiuso il ticket e presto mi sono dimenticato del problema.
queste le parole di Kellermann.
Il problema, mesi dopo, si è ripetuto ancora e ancora. Ogni volta, il contenuto del file sembrava corretto, ma il CRC alla fine del file era anomalo. Dopo l’analisi di diversi file corrotti Kellermann è stato in grado di scavare più a fondo ed è emerso un modello di corruzione.
Kellermann ha capito come funziona la vulnerabilità e quindi come qualcuno potrebbe potenzialmente sfruttarla. Inizialmente presumeva che il bug fosse sfruttabile solo mentre un processo privilegiato scriveva il file e che dipendesse dal timing. In seguito, ha scoperto che è possibile sovrascrivere la cache della pagina anche in assenza di autori, senza vincoli di tempo, in posizioni (quasi) arbitrarie e con dati arbitrari.
Exploit
Per attivare la vulnerabilità, Kellerman ha condiviso il suo proof-of-concept, l’attaccante deve disporre dei permessi di lettura. Inoltre, l’offset non deve trovarsi su un limite di pagina, la scrittura non può oltrepassare un limite di pagina e il file non può essere ridimensionato.
Per sfruttare questa vulnerabilità, è necessario: creare una pipe, riempire la pipe con dati arbitrari (per impostare il flag PIPE_BUF_FLAG_CAN_MERGE in tutte le voci dell’anello), svuotare la pipe (lasciando il flag impostato in tutte le istanze struct pipe_buffer sull’anello struct pipe_inode_info), unire i dati dal file di destinazione (aperto con O_RDONLY) nella pipe appena prima dell’offset di destinazione e scrivere dati arbitrari nella pipe.
Il buco è abbastanza grave perché funziona senza permessi di scrittura e soprattutto funziona anche con file immutabili, su snapshot btrfs di sola lettura e su mount di sola lettura (compresi i CD-ROM). Questo perché la cache della pagina è sempre scrivibile (dal kernel) e la scrittura su una pipe non controlla mai i permessi.
La segnalazione di bug, l’exploit e la patch sono state inviate al team di sicurezza del kernel Linux da Kellermann il 20 febbraio scorso. Il bug è stato riprodotto su Google Pixel 6 e una segnalazione è stata inviata all’Android Security Team. Gli sviluppatori del kernel Linux hanno rilasciato correzioni (5.16.11, 5.15.25, 5.10.102) il 23 febbraio mentre Google ha inserito la patch nel kernel Android il 24 febbraio. Kellermann e altri esperti hanno confrontato la vulnerabilità con la CVE-2016-5195 “Dirty Cow”, affermando che è ancora più facile da sfruttare.
Seguiteci sul nostro canale Telegram, sulla nostra pagina Facebook e su Google News. Nel campo qui sotto è possibile commentare e creare spunti di discussione inerenti le tematiche trattate sul blog.