Une vulnérabilité critique dans PolKit permettant d'obtenir un accès root dans la plupart des distributions Linux

La société Qualys a identifié une vulnérabilité (CVE-2021-4034) dans le composant système Polkit (anciennement PolicyKit), utilisé dans les distributions pour faciliter l'exécution d'actions nécessitant des droits d'accès élevés par des utilisateurs non privilégiés. Cette vulnérabilité permet à un utilisateur local non privilégié d'élever ses privilèges au niveau de l'utilisateur root et d'obtenir un contrôle total sur le système. Le problème a été nommé PwnKit et est remarquable par la préparation d'un exploit fonctionnant par défaut dans la plupart des distributions Linux.

Le problème se trouve dans l'utilitaire pkexec, qui fait partie de PolKit, livré avec le drapeau SUID root et conçu pour exécuter des commandes avec les privilèges d'un autre utilisateur selon les règles établies par PolKit. En raison d'un traitement incorrect des arguments de ligne de commande passés à pkexec, un utilisateur non privilégié pouvait contourner l'authentification et faire exécuter son code avec des droits root, quel que soit les règles d'accès appliquées. Peu importe les paramètres et restrictions définis dans PolKit, il suffit que l'exécutable de l'utilitaire pkexec ait le drapeau SUID root activé.

Pkexec ne vérifie pas la validité du compteur d'arguments de la ligne de commande (argc) passés lors du démarrage du processus. Les développeurs de pkexec pensaient que le premier élément du tableau argv contiendrait toujours le nom du processus (pkexec), et que le second soit NULL, soit le nom de la commande lancée via pkexec. Étant donné que le compteur d'arguments n'était pas vérifié par rapport au contenu réel du tableau et qu'il était supposé être toujours supérieur à 1, si un tableau argv vide était passé au processus, comme le permet la fonction execve dans Linux, pkexec interprétait NULL comme le premier argument (nom du processus), et la mémoire à l'extérieur du tampon comme le contenu suivant du tableau.

Le problème est que juste après le tableau argv en mémoire se trouve le tableau envp, contenant les variables d'environnement. Ainsi, avec un tableau argv vide, pkexec extrait les données sur la commande à privilèges élevés à partir du premier élément du tableau des variables d'environnement (argv[1] devenant identique à envp[0]), dont le contenu peut être contrôlé par l'attaquant.

Après avoir obtenu la valeur d'argv[1], pkexec tente de déterminer le chemin complet du fichier exécutable en tenant compte des chemins de fichiers dans PATH et d'écrire un pointeur vers la chaîne avec le chemin complet en retour dans argv[1], ce qui entraîne l'écrasement 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, l'attaquant peut substituer une autre variable d'environnement dans pkexec, par exemple, substituer la variable d'environnement « LD_PRELOAD », qui n'est pas autorisée dans les programmes suid, et organiser le chargement dans le processus de sa bibliothèque partagée.

Dans l'exploit fonctionnel, une substitution de la variable GCONV_PATH est effectuée, utilisée pour déterminer le chemin vers la bibliothèque de conversion de caractères, 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, l'attaquant peut réaliser le chargement d'une bibliothèque iconv non standard, dont les gestionnaires seront exécutés lors de l'affichage d'un message d'erreur à un moment où pkexec s'exécute encore avec les droits root et avant la vérification des autorisations de lancement.

Il est signalé que, bien que le problème soit causé par 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 disponible publiquement, ce qui indique qu'il est trivial et peut être facilement reproduit par d'autres chercheurs. Par conséquent, sur les systèmes multi-utilisateurs, il est important d'installer au plus vite la mise à jour corrective. Polkit est également disponible pour les systèmes BSD et Solaris, mais la possibilité d'exploitation dans ceux-ci n'a pas été étudiée. On sait seulement que l'attaque ne peut pas être réalisée sur OpenBSD, car le noyau d'OpenBSD ne permet pas le passage d'une valeur nulle pour argc lors de l'appel de execve().

Le problème existe depuis mai 2009, depuis l'ajout de la commande pkexec. Le correctif pour la vulnérabilité de PolKit est actuellement disponible sous forme de patch (une version corrigée n'a pas encore été publiée), mais comme les développeurs des distributions ont été avertis à l'avance du problème, la plupart des distributions ont publié une mise à jour en même temps que la divulgation de la vulnérabilité. Le problème a été 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é, il est possible de retirer le drapeau SUID root du programme /usr/bin/pkexec ("chmod 0755 /usr/bin/pkexec").



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