
CVE-2022-0847(Dirty Pipe) exploit della vulnerabilità.
Divulgata il 7 marzo 2022 da Max Kellerman[2], la CVE-2022-0847 è una vulnerabilità nel kernel Linux (versioni tra la 5.8 e la 5.16.11) che consente agli attaccanti di sostituire file di sola lettura o immutabili e aumentare i propri privilegi sul sistema della vittima. La CVE-2022-0847 è stata soprannominata Dirty Pipe e ha un punteggio CVSS di 7,8 (considerato alto).
La vulnerabilità Dirty Pipe è descritta come un difetto nel modo in cui l'attributo flags della struct pipe_buffer[7] non conteneva un'inizializzazione adeguata nelle funzioni copy_page_to_iter_pipe e push_pipe nel kernel Linux e, pertanto, poteva contenere valori obsoleti. Una delle flag che può essere impostata nell'attributo flags della struct pipe_buffer è la flag chiamata PIPE_BUF_FLAG_CAN_MERGE. Essa indica se l'unione di ulteriori dati nel pipe_buffer è consentita o meno. In questo modo, quando i dati vengono copiati in un pipe_buffer, è possibile aggiungere altri dati al pipe_buffer se la pagina copiata ha una dimensione inferiore a 4096 byte.
Iniettando PIPE_BUF_FLAG_CAN_MERGE in un riferimento alla cache di pagina, è diventato possibile sovrascrivere i dati nella cache di pagina, semplicemente scrivendo nuovi dati nella pipe preparata in modo speciale (questo processo verrà descritto nei paragrafi successivi). In questo modo, un utente locale senza privilegi può usare questo difetto per sovrascrivere/scrivere su pagine nella cache di pagina supportate da file di sola lettura e quindi aumentare i propri privilegi sul sistema.
Detto questo, per sfruttare la vulnerabilità, è necessario seguire i seguenti passaggi:
Compila tutto con il seguente comando:
make
./exploit-1
L'exploit 1, presente nel file exploit-1.c del repository, consiste nel sovrascrivere la password dell'utente root presente nel file /etc/passwd (questo file contiene informazioni sull'account utente, come la password criptata) e infine fornire un terminale con accesso root. A tal fine, è stato necessario:
/etc/passwd./etc/passwd nella pipe e sovrascrivere il contenuto di questo file con una nuova password di root nota (come mostrato nei passaggi 4 e 5 sopra citati).find / -perm -4000 2>/dev/null
./exploit-2 <path-of-suid-binary>
L'exploit 2, presente nel file exploit-2.c del repository, consiste nel sovrascrivere e sequestrare un binario SUID (questo tipo di attacco è stato descritto nella sezione 3.5.2) e infine fornire un terminale con accesso root. A tal fine, è stato necessario:
/tmp/sh), che a sua volta crea una shell con accesso root./tmp/sh menzionato nel passaggio 1 viene eseguito, aprendo così una nuova shell con accesso root../exploit-3
L'exploit 3, presente nel file exploit-3.c del repository, utilizza gli stessi passaggi dell'exploit 1 per ottenere l'accesso a una shell root. La differenza è che l'exploit 3, dopo aver ottenuto l'accesso alla shell root, carica una chiave pubblica SSH (Secure Shell) dell'attaccante nel file /root/.ssh/authorized_keys e crea un tunnel TCP (Transmission Control Protocol) per l'accesso remoto via SSH utilizzando la piattaforma Ngrok.
[1] AHMED, Alexis. Privilege Escalation Techniques: Learn the art of exploiting Windows and Linux systems. Birmingham: Packt Publishing, ottobre 2021.
[2] KELLERMANN, Max. The Dirty Pipe Vulnerability. Disponibile su: https://dirtypipe.cm4all.com/. Accesso effettuato il: 23 luglio 2022.
[3] Exploit Database. Disponibile su: https://www.exploit-db.com/. Accesso effettuato il: 03 agosto 2022.
[4] Traitor: Automatically exploit low-hanging fruit to pop a root shell. Disponibile su: https://github.com/liamg/traitor. Accesso effettuato il: 03 agosto 2022.
[5] PayloadsAllTheThings. Linux - Privilege Escalation. Disponibile su: https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Linux%20-%20Privilege%20Escalation.md#cve-2022-0847-dirtypipe. Accesso effettuato il: 03 agosto 2022.
[6] Repository del kernel Linux - Struct pipe_inode_info. Disponibile su: https://github.com/torvalds/linux/blob/v5.8/include/linux/pipe_fs_i.h#L76. Accesso effettuato il: 03 agosto 2022.
[7] Repository del kernel Linux - Struct pipe_buffer. Disponibile su: https://github.com/torvalds/linux/blob/v5.8/include/linux/pipe_fs_i.h#L26-L32. Accesso effettuato il: 03 agosto 2022.
[8] ARNTZ, Pieter. Linux "Dirty Pipe" vulnerability gives unprivileged users root access. Malwarebytes Lab. Disponibile su: https://www.malwarebytes.com/blog/news/2022/03/linux-dirty-pipe-vulnerability-gives-unprivileged-users-root-access. Accesso effettuato il: 03 agosto 2022.
[9] Picus Security. Linux “Dirty Pipe” CVE-2022-0847 Vulnerability Exploitation Explained. Disponibile su: https://www.picussecurity.com/resource/linux-dirty-pipe-cve-2022-0847-vulnerability-exploitation-explained. Accesso effettuato il: 03 agosto 2022.
[10] Exploit Database - Local Privilege Escalation (Dirty Pipe). Disponibile su: https://www.exploit-db.com/exploits/50808. Accesso effettuato il: 03 agosto 2022.