Vulnérabilité critique dans PolKit permettant un accès root sur la plupart des distributions Linux

Qualys a identifié une vulnérabilité (CVE-2021-4034) dans le composant système Polkit (anciennement PolicyKit) utilisé dans les distributions pour permettre aux utilisateurs non privilégiés d'effectuer des actions nécessitant des droits d'accès élevés. La vulnérabilité permet à un utilisateur local non privilégié d'élever ses privilèges au niveau root et d'obtenir le contrôle total du système. Le problème portait le nom de code PwnKit et se distingue par la production d'un exploit fonctionnel qui s'exécute dans la configuration par défaut sur la plupart des distributions Linux.

Le problème est présent dans l'utilitaire pkexec de PolKit, fourni avec l'indicateur racine SUID et conçu pour exécuter des commandes avec les privilèges d'un autre utilisateur conformément aux règles PolKit spécifiées. En raison d'une gestion incorrecte des arguments de ligne de commande transmis à pkexec, un utilisateur non privilégié pourrait contourner l'authentification et exécuter son code en tant que root, quelles que soient les règles d'accès définies. Pour une attaque, peu importe les paramètres et restrictions spécifiés dans PolKit, il suffit que l'attribut racine SUID soit défini pour le fichier exécutable avec l'utilitaire pkexec.

Pkexec ne vérifie pas la validité du nombre d'arguments de ligne de commande (argc) transmis lors du démarrage d'un processus. Les développeurs de pkexec ont supposé que la première entrée du tableau argv contenait toujours le nom du processus (pkexec), et la seconde soit une valeur NULL, soit le nom de la commande lancée via pkexec. Étant donné que le nombre d'arguments n'a pas été vérifié par rapport au contenu réel du tableau et a été supposé être toujours supérieur à 1, si un processus recevait un tableau argv vide, comme le permet la fonction execve de Linux, pkexec traiterait NULL comme premier argument ( le nom du processus) et le suivant comme en dehors de la mémoire tampon, comme le contenu ultérieur du tableau. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV "programme" "-option" NULL "valeur" "PATH=nom" NULL

Le problème est qu'après le tableau argv, il y a un tableau envp en mémoire contenant des variables d'environnement. Ainsi, si le tableau argv est vide, pkexec extrait les données sur la commande exécutée avec des privilèges élevés du premier élément du tableau avec des variables d'environnement (argv[1] est devenu identique à envp[0]), dont le contenu peut être contrôlé par l'attaquant.

Après avoir reçu la valeur de argv[1], pkexec essaie, en tenant compte des chemins de fichiers dans PATH, de déterminer le chemin complet vers le fichier exécutable et écrit un pointeur sur la chaîne avec le chemin complet vers argv[1], qui conduit à écraser la valeur de la première variable d'environnement, puisque argv[ 1] est identique à envp[0]. En manipulant le nom de la première variable d'environnement, un attaquant peut substituer une autre variable d'environnement dans pkexec, par exemple, remplacer la variable d'environnement « LD_PRELOAD », qui n'est pas autorisée dans les programmes suid, et faire en sorte que sa bibliothèque partagée soit chargée dans le processus.

L'exploit de travail consiste à remplacer la variable GCONV_PATH, qui est utilisée pour déterminer le chemin d'accès à la bibliothèque de transcodage de symboles, chargée dynamiquement lors de l'appel de la fonction g_printerr(), dont le code utilise iconv_open(). En redéfinissant le chemin dans GCONV_PATH, un attaquant peut s'assurer que ce n'est pas la bibliothèque iconv standard qui est chargée, mais sa propre bibliothèque, dont les gestionnaires seront exécutés lorsqu'un message d'erreur s'affichera au moment où pkexec est toujours en cours d'exécution avec les droits root et avant le lancement les autorisations sont vérifiées.

Il convient de noter que même si le problème est dû à une corruption de la mémoire, il peut être exploité de manière fiable et répétée, quelle que soit l'architecture matérielle utilisée. L'exploit préparé a été testé avec succès sur Ubuntu, Debian, Fedora et CentOS, mais peut également être utilisé sur d'autres distributions. L'exploit original n'est pas encore accessible au public, ce qui indique qu'il est trivial et peut être facilement recréé par d'autres chercheurs. Il est donc important d'installer la mise à jour du correctif dès que possible sur les systèmes multi-utilisateurs. Polkit est également disponible pour les systèmes BSD et Solaris, mais n'a pas été étudié pour être utilisé sur ceux-ci. Ce que l'on sait, c'est que l'attaque ne peut pas être menée sur OpenBSD, puisque le noyau OpenBSD ne permet pas de transmettre une valeur argc nulle lorsque execve() est appelé.

Le problème est présent depuis mai 2009, depuis l'ajout de la commande pkexec. Le correctif pour la vulnérabilité PolKit est actuellement disponible sous forme de correctif (aucun correctif n'a été publié), mais comme les développeurs de distribution ont été informés du problème à l'avance, la plupart des distributions ont publié la mise à jour en même temps que la divulgation des informations sur la vulnérabilité. Le problème est résolu dans RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux et Manjaro. Comme mesure temporaire pour bloquer la vulnérabilité, vous pouvez supprimer l'indicateur racine SUID du programme /usr/bin/pkexec (« chmod 0755 /usr/bin/pkexec »).



Source: opennet.ru

Ajouter un commentaire