
Exploits de la vulnérabilité CVE-2022-0847 (Dirty Pipe).
Divulguée le 7 mars 2022 par Max Kellerman[2], la CVE-2022-0847 est une vulnérabilité dans le noyau Linux (versions entre 5.8 et 5.16.11) qui permet aux attaquants de remplacer des fichiers en lecture seule ou immuables et d'augmenter leurs privilèges sur le système de la victime. La CVE-2022-0847 a été surnommée Dirty Pipe et possède un score CVSS de 7,8 (considéré comme élevé).
La vulnérabilité Dirty Pipe est décrite comme un défaut dans la manière dont l'attribut flags de la struct pipe_buffer[7] ne contenait pas d'initialisation adéquate dans les fonctions copy_page_to_iter_pipe et push_pipe du noyau Linux et pouvait donc contenir des valeurs obsolètes. L'un des drapeaux pouvant être configurés dans l'attribut flags de la struct pipe_buffer est le drapeau appelé PIPE_BUF_FLAG_CAN_MERGE. Il indique si la fusion de données supplémentaires dans le pipe_buffer est autorisée ou non. Ainsi, lorsque des données sont copiées dans un pipe_buffer, davantage de données peuvent être ajoutées au pipe_buffer si la page copiée a une taille inférieure à 4096 octets.
En injectant PIPE_BUF_FLAG_CAN_MERGE dans une référence de cache de page, il est devenu possible d'écraser des données dans le cache de page, simplement en écrivant de nouvelles données dans le pipe préparé de manière spéciale (ce processus sera décrit dans les paragraphes suivants). Ainsi, un utilisateur local sans privilèges peut utiliser ce défaut pour écraser/écrire dans des pages du cache de page soutenues par des fichiers en lecture seule et ainsi augmenter ses privilèges sur le système.
Cela dit, pour exploiter la vulnérabilité, les étapes suivantes doivent être respectées :
Compilez tout avec la commande suivante :
make
./exploit-1
L'exploit 1, présent dans le fichier exploit-1.c du dépôt, consiste à écraser le mot de passe de l'utilisateur root présent dans le fichier /etc/passwd (ce fichier contient des informations sur le compte utilisateur, comme le mot de passe crypté) et enfin, fournir un terminal avec accès root. Pour cela, il a été nécessaire :
/etc/passwd./etc/passwd vers le pipe et écraser le contenu de ce fichier avec un nouveau mot de passe root connu (comme présenté dans les étapes 4 et 5 mentionnées ci-dessus).find / -perm -4000 2>/dev/null
./exploit-2 <chemin-du-binaire-suid>
L'exploit 2, présent dans le fichier exploit-2.c du dépôt, consiste à écraser et détourner un binaire SUID (ce type d'attaque a été rapporté dans la section 3.5.2) et enfin, fournir un terminal avec accès root. Pour cela, il a été nécessaire :
/tmp/sh), qui à son tour, crée un terminal shell avec accès root./tmp/sh cité à l'étape 1 est exécuté, ouvrant ainsi un nouveau shell avec accès root../exploit-3
L'exploit 3, présent dans le fichier exploit-3.c du dépôt, utilise les mêmes étapes que l'exploit 1 pour obtenir un accès shell root. La différence est que l'exploit 3, après avoir obtenu l'accès au shell root, charge une clé publique SSH (Secure Shell) de l'attaquant dans le fichier /root/.ssh/authorized_keys et crée un tunnel TCP (Transmission Control Protocol) pour un accès à distance au SSH en utilisant la plateforme Ngrok.
[1] AHMED, Alexis. Privilege Escalation Techniques: Learn the art of exploiting Windows and Linux systems. Birmingham: Packt Publishing, octobre 2021.
[2] KELLERMANN, Max. The Dirty Pipe Vulnerability. Disponible sur : https://dirtypipe.cm4all.com/. Consulté le : 23 juillet 2022.
[3] Exploit Database. Disponible sur : https://www.exploit-db.com/. Consulté le : 3 août 2022.
[4] Traitor: Automatically exploit low-hanging fruit to pop a root shell. Disponible sur : https://github.com/liamg/traitor. Consulté le : 3 août 2022.
[5] PayloadsAllTheThings. Linux - Privilege Escalation. Disponible sur : https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Linux%20-%20Privilege%20Escalation.md#cve-2022-0847-dirtypipe. Consulté le : 3 août 2022.
[6] Dépôt du noyau Linux - Struct pipe_inode_info. Disponible sur : https://github.com/torvalds/linux/blob/v5.8/include/linux/pipe_fs_i.h#L76. Consulté le : 3 août 2022.
[7] Dépôt du noyau Linux - Struct pipe_buffer. Disponible sur : https://github.com/torvalds/linux/blob/v5.8/include/linux/pipe_fs_i.h#L26-L32. Consulté le : 3 août 2022.
[8] ARNTZ, Pieter. Linux "Dirty Pipe" vulnerability gives unprivileged users root access. Malwarebytes Lab. Disponible sur : https://www.malwarebytes.com/blog/news/2022/03/linux-dirty-pipe-vulnerability-gives-unprivileged-users-root-access. Consulté le : 3 août 2022.
[9] Picus Security. Linux “Dirty Pipe” CVE-2022-0847 Vulnerability Exploitation Explained. Disponible sur : https://www.picussecurity.com/resource/linux-dirty-pipe-cve-2022-0847-vulnerability-exploitation-explained. Consulté le : 3 août 2022.
[10] Exploit Database - Local Privilege Escalation (Dirty Pipe). Disponible sur : https://www.exploit-db.com/exploits/50808. Consulté le : 3 août 2022.