Vulnérabilité dans le sous-système io_uring, permettant d'obtenir des privilèges root

Une vulnérabilité a été identifiée dans l'interface d'entrée/sortie asynchrone io_uring fournie par le noyau Linux (CVE-2024-0582), permettant à un utilisateur non privilégié d'obtenir des droits root sur le système. Pour exploiter cette vulnérabilité, un simple accès local au système est suffisant, sans avoir besoin de manipuler les espaces de noms. Un exploit fonctionnel est actuellement disponible publiquement, et une seconde technique d'exploitation a également été décrite en détail.

La vulnérabilité est causée par un accès à un bloc de mémoire déjà libéré (use-after-free) dans la sous-système io_uring, survenant lors de l'enregistrement et de la libération d'un tampon circulaire créé avec le drapeau IORING_REGISTER_PBUF_RING. Lorsqu'une opération mmap() est appliquée au tampon, il reste reflété dans l'espace utilisateur après l'exécution de son opération de libération (IORING_UNREGISTER_PBUF_RING). En tirant parti de cette particularité, un attaquant peut lire et écrire des données dans les pages mémoire renvoyées par le système de distribution de mémoire du noyau.

Le problème apparaît à partir de la version 6.4 du noyau Linux et a été corrigé dans les versions 6.7 et 6.6.5, ainsi que dans le paquet du noyau 6.5.0-21, préparé pour Ubuntu 22.04 et 23.10. Il est intéressant de noter que dans le noyau principal, le problème a été corrigé en décembre 2023, le projet Google Zero a rendu accessible le message d'erreur signalant la vulnérabilité le 8 janvier, et le paquet corrigé du noyau 6.5 pour Ubuntu n'a été formé que le 22 février 2024. Dans d'autres distributions, il est possible de suivre la correction et l'exposition à la vulnérabilité sur les pages : Debian, Gentoo, RHEL, SUSE, Fedora, Arch.

Le premier exploit manipule la création d'un grand nombre de pages mémoire contrôlées par l'attaquant afin de déterminer la disposition de la mémoire dans le noyau et d'accéder aux pages mémoire physiques voisines, en utilisant comme balises le contenu de structures de sockets réseau remplies d'une certaine manière. Pour exécuter le code dans l'exploit, un « gadget » (une séquence d'instructions existant dans le noyau) est utilisé, entraînant l'exécution de la fonction call_usermodehelper_exec, destinée à lancer des processus dans l'espace utilisateur depuis le noyau.

Le deuxième exploit repose sur le fait qu'en épuisant tous les blocs slab dans le cache (par exemple, en ouvrant un fichier plusieurs fois), les pages de mémoire libres, accessibles à l'attaquant, sont utilisées par le système de gestion de la mémoire pour créer un nouveau bloc slab, et toutes les nouvelles structures de fichiers commencent à être placées dans ce bloc. Par conséquent, certaines structures de fichiers finiront dans des pages de mémoire que l'attaquant peut lire et modifier. L'exploitation consiste donc à organiser l'accès à un fichier spécifique dans le cache de fichiers et à remplacer dans les structures de fichiers associées le champ f_mode, qui détermine les droits d'accès, ce qui permet de rendre accessible en écriture un fichier système nécessaire, par exemple, /etc/passwd.

Source : opennet.ru

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster