Vulnérabilité dans le noyau Linux qui peut altérer les fichiers en lecture seule

Une vulnérabilité a été identifiée dans le noyau Linux (CVE-2022-0847) qui permet d'écraser le contenu du cache de pages pour tous les fichiers, y compris ceux en mode lecture seule, ouverts avec l'indicateur O_RDONLY ou situés sur les systèmes de fichiers. monté en mode lecture seule. Concrètement, la vulnérabilité peut être utilisée pour insérer du code dans des processus arbitraires ou corrompre des données dans des fichiers ouverts. Par exemple, vous pouvez modifier le contenu du fichierauthorized_keys pour le processus sshd. Un prototype de l'exploit est disponible pour les tests.

Le problème a été nommé Dirty Pipe, similaire à la vulnérabilité critique Dirty COW identifiée en 2016. Il est à noter qu'en termes de niveau de danger, Dirty Pipe est au même niveau que Dirty COW, mais est beaucoup plus facile à utiliser. La vulnérabilité a été identifiée lors de l'analyse de plaintes concernant des corruptions périodiques de fichiers téléchargés sur le réseau dans un système téléchargeant des archives compressées depuis un serveur de journaux (37 corruptions en 3 mois sur un système chargé), dont la préparation utilisait l'opération splice(). et des tuyaux sans nom.

La vulnérabilité apparaît à partir du noyau Linux 5.8, sorti en août 2020, soit présent dans Debian 11, mais n'affecte pas le noyau de base dans Ubuntu 20.04 LTS. Les noyaux RHEL 8.x et openSUSE/SUSE 15 sont initialement basés sur d'anciennes branches, mais il est possible que le changement à l'origine du problème y ait été rétroporté (il n'y a pas encore de données exactes). Vous pouvez suivre la publication des mises à jour des packages dans les distributions sur ces pages : Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Un correctif pour la vulnérabilité a été proposé dans les versions 5.16.11, 5.15.25 et 5.10.102. Le correctif est également inclus dans le noyau utilisé dans la plateforme Android.

La vulnérabilité est causée par le manque d'initialisation de la valeur « buf->flags » dans le code des fonctions copy_page_to_iter_pipe() et push_pipe(), malgré le fait que la mémoire n'est pas vidée lors de l'allocation d'une structure et lors de certaines manipulations avec canaux sans nom, une valeur provenant d’une autre opération. En utilisant cette fonctionnalité, un utilisateur local non privilégié peut obtenir l'apparition de la valeur PIPE_BUF_FLAG_CAN_MERGE dans l'indicateur, ce qui vous permet d'organiser l'écrasement des données dans le cache de pages en écrivant simplement de nouvelles données dans un canal sans nom spécialement préparé.

Pour une attaque, le fichier cible doit être lisible, et comme les droits d'accès ne sont pas vérifiés lors de l'écriture dans le tube, le remplacement dans le cache des pages peut également être effectué pour les fichiers situés dans des partitions montées en lecture seule (par exemple, pour les fichiers c CD- ROM). Après avoir remplacé les informations dans le cache de pages, lors de la lecture des données d'un fichier, le processus ne recevra pas les données réelles, mais les données remplacées.

L'opération revient à créer un canal sans nom et à le remplir de données arbitraires afin de garantir que l'indicateur PIPE_BUF_FLAG_CAN_MERGE est défini dans toutes les structures en anneau qui lui sont associées. Ensuite, les données sont lues à partir du canal, mais l'indicateur reste défini dans toutes les instances de la structure pipe_buffer dans les structures en anneau pipe_inode_info. Un appel à splice() est ensuite effectué pour lire les données du fichier cible dans un canal sans nom, en commençant au décalage souhaité. Lors de l'écriture de données dans ce canal sans nom, en raison de la définition de l'indicateur PIPE_BUF_FLAG_CAN_MERGE, les données du cache de page seront écrasées au lieu de créer une nouvelle instance de la structure pipe_buffer.

Source: opennet.ru

Ajouter un commentaire