
Exploits de la vulnerabilidad CVE-2022-0847 (Dirty Pipe).
Divulgada el 7 de marzo de 2022 por Max Kellerman[2], la CVE-2022-0847 es una vulnerabilidad en el kernel de Linux (versiones entre la 5.8 y 5.16.11) que permite a los atacantes sobrescribir archivos de solo lectura o inmutables y aumentar sus privilegios en el sistema de la víctima. La CVE-2022-0847 fue apodada Dirty Pipe y tiene una puntuación CVSS de 7,8 (considerada alta).
La vulnerabilidad Dirty Pipe se describe como una falla en la forma en que el atributo flags de la struct pipe_buffer[7] no contenía una inicialización adecuada en las funciones copy_page_to_iter_pipe y push_pipe del kernel de Linux y, por lo tanto, podía contener valores obsoletos. Una de las flags que se puede configurar en el atributo flags de la struct pipe_buffer es la flag llamada PIPE_BUF_FLAG_CAN_MERGE. Esta indica si se permite o no la fusión de más datos en el pipe_buffer. De esta forma, cuando los datos se copian a un pipe_buffer, se pueden agregar más datos al pipe_buffer si la página copiada tiene menos de 4096 bytes de tamaño.
Al inyectar PIPE_BUF_FLAG_CAN_MERGE en una referencia de caché de página, fue posible sobrescribir datos en el caché de página, simplemente escribiendo nuevos datos en el pipe preparado de manera especial (este proceso se describirá en los siguientes párrafos). De esta manera, un usuario local sin privilegios puede usar esta falla para sobrescribir/escribir en páginas del caché de página respaldadas por archivos de solo lectura y, así, aumentar sus privilegios en el sistema.
Dicho esto, para explotar la vulnerabilidad, se deben seguir los siguientes pasos:
Compila todo con el siguiente comando:
make
./exploit-1
El exploit 1, presente en el archivo exploit-1.c del repositorio, consiste en sobrescribir la contraseña del usuario root presente en el archivo /etc/passwd (este archivo contiene información sobre la cuenta de usuario, como la contraseña cifrada) y, finalmente, proporcionar una terminal con acceso root. Para ello, fue necesario:
/etc/passwd./etc/passwd al pipe y sobrescribir el contenido de este archivo con una nueva contraseña de root conocida (como se presentó en los pasos 4 y 5 mencionados anteriormente).find / -perm -4000 2>/dev/null
./exploit-2 <path-of-suid-binary>
El exploit 2, presente en el archivo exploit-2.c del repositorio, consiste en sobrescribir y secuestrar un binario SUID (este tipo de ataque se informó en la sección 3.5.2) y, finalmente, proporcionar una terminal con acceso root. Para ello, fue necesario:
/tmp/sh), que a su vez crea una terminal shell con acceso root./tmp/sh mencionado en el paso 1, abriendo así un nuevo shell con acceso root../exploit-3
El exploit 3, presente en el archivo exploit-3.c del repositorio, utiliza los mismos pasos que el exploit 1 para obtener acceso a la shell root. La diferencia es que el exploit 3, después de obtener acceso a la shell root, carga una clave pública SSH (Secure Shell) del atacante en el archivo /root/.ssh/authorized_keys y crea un túnel TCP (Transmission Control Protocol) para acceso remoto al SSH utilizando la plataforma Ngrok.
[1] AHMED, Alexis. Privilege Escalation Techniques: Learn the art of exploiting Windows and Linux systems. Birmingham: Packt Publishing, octubre de 2021.
[2] KELLERMANN, Max. The Dirty Pipe Vulnerability. Disponible en: https://dirtypipe.cm4all.com/. Accedido el 23 de julio de 2022.
[3] Exploit Database. Disponible en: https://www.exploit-db.com/. Accedido el 03 de agosto de 2022.
[4] Traitor: Automatically exploit low-hanging fruit to pop a root shell. Disponible en: https://github.com/liamg/traitor. Accedido el 03 de agosto de 2022.
[5] PayloadsAllTheThings. Linux - Privilege Escalation. Disponible en: https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Linux%20-%20Privilege%20Escalation.md#cve-2022-0847-dirtypipe. Accedido el 03 de agosto de 2022.
[6] Repositorio del Kernel de Linux - Struct pipe_inode_info. Disponible en: https://github.com/torvalds/linux/blob/v5.8/include/linux/pipe_fs_i.h#L76. Accedido el 03 de agosto de 2022.
[7] Repositorio del Kernel de Linux - Struct pipe_buffer. Disponible en: https://github.com/torvalds/linux/blob/v5.8/include/linux/pipe_fs_i.h#L26-L32. Accedido el 03 de agosto de 2022.
[8] ARNTZ, Pieter. Linux "Dirty Pipe" vulnerability gives unprivileged users root access. Malwarebytes Lab. Disponible en: https://www.malwarebytes.com/blog/news/2022/03/linux-dirty-pipe-vulnerability-gives-unprivileged-users-root-access. Accedido el 03 de agosto de 2022.
[9] Picus Security. Linux “Dirty Pipe” CVE-2022-0847 Vulnerability Exploitation Explained. Disponible en: https://www.picussecurity.com/resource/linux-dirty-pipe-cve-2022-0847-vulnerability-exploitation-explained. Accedido el 03 de agosto de 2022.
[10] Exploit Database - Local Privilege Escalation (Dirty Pipe). Disponible en: https://www.exploit-db.com/exploits/50808. Accedido el 03 de agosto de 2022.