Une vulnérabilité PolKit a permis d'obtenir un accès root sur la plupart des distributions Linux

Récemment Qualys publié la nouvelle que a identifié une vulnérabilité (CVE-2021-4034) en composant du système polkit (anciennement PolicyKit), qui est 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.

Vulnérabilité permet à un utilisateur local non privilégié d'élever ses privilèges à l'utilisateur root et obtenir un contrôle total sur le système. Le problème porte le nom de code PwnKit et se distingue par la production d'un exploit fonctionnel qui s'exécute dans les paramètres par défaut sur la plupart des distributions Linux.

Il est mentionné que le problème existe dans l'utilitaire pkexec inclus avec PolKit, qui est fourni avec l'indicateur racine SUID et est conçu pour exécuter des commandes avec les privilèges d'autres utilisateurs conformément aux règles de PolKit.

Suite à une mauvaise manipulation des arguments depuis la ligne de commande passée à pkexec, un un utilisateur non privilégié pourrait contourner l'authentification et exécuter votre code en tant que root, quelles que soient les règles d'accès établies. Pour une attaque, quels que soient les paramètres et les restrictions définis dans PolKit, il suffit que l'attribut racine SUID du fichier exécutable soit défini avec l'utilitaire pkexec.

Pkexec ne vérifie pas l'exactitude du nombre d'arguments de ligne de commande (argc) passés lors du démarrage d'un processus. Les développeurs de pkexec ont supposé que la première entrée du tableau argv contient toujours le nom du processus (pkexec) et que la deuxième entrée est NULL ou le nom de la commande exécutée via pkexec.

Étant donné que le nombre d'arguments n'était pas comparé au contenu réel du tableau et était supposé être toujours supérieur à 1, si un tableau argv vide était passé au processus, ce que la fonction execve de Linux autorise, pkexec traitait NULL comme premier argument ( process nom), et le suivant après une mémoire tampon insuffisante, comme contenu de tableau suivant.

Le problème est qu'après le tableau argv en mémoire se trouve le tableau envp qui contient les variables d'environnement. Ainsi, avec un tableau argv vide, pkexec extrait les données sur la commande en cours d'exécution 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 argv[1], pkexec essaie de déterminer le chemin complet vers le fichier exécutable en utilisant les chemins de fichier dans PATH et écrit le pointeur sur la chaîne avec le chemin complet vers argv[1], ce qui conduit à écraser la valeur de la première variable d'environnement également, 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 substituer la variable d'environnement "LD_PRELOAD", qui n'est pas autorisée dans les programmes suid, et faire charger au processus sa bibliothèque partagée dans le processus .

L'exploit de travail utilise la substitution de variable GCONV_PATH, qui est utilisé pour déterminer le chemin vers la bibliothèque de transcodage de symboles qui est chargée dynamiquement lorsque la fonction g_printerr() est appelée, qui utilise iconv_open() dans son code.

En redéfinissant le chemin dans GCONV_PATH, l'attaquant peut arriver à charger non pas la bibliothèque iconv normale, mais sa propre bibliothèque, dont les pilotes seront exécutés lors du message d'erreur à l'étape où pkexec tourne toujours en tant que root et avant vérification du démarrage autorisations.

On observe que, bien que le problème soit 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é testé avec succès sur Ubuntu, Debian, Fedora et CentOS, mais peut également être utilisé sur d'autres distributions. L'exploit d'origine 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é exploré pour l'exploitation. Ce que l'on sait, c'est que l'attaque ne peut pas être effectuée sur OpenBSD, car le noyau OpenBSD ne permet pas de passer une valeur argc nulle lors de l'appel à execve().

Le problème existe depuis mai 2009 lorsque la commande pkexec a été ajoutée. Le correctif de la vulnérabilité dans PolKit est toujours disponible sous forme de correctif (la version du correctif n'a pas été formée), mais comme les développeurs de la distribution ont été informés du problème à l'avance, la plupart des distributions ont publié une mise à jour en même temps que la divulgation. d'informations sur la vulnérabilité.

Enfin si vous souhaitez en savoir plus, vous pouvez vérifier les détails dans le lien suivant.


Soyez le premier à commenter

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont marqués avec *

*

*

  1. Responsable des données: Miguel Ángel Gatón
  2. Finalité des données: Contrôle du SPAM, gestion des commentaires.
  3. Légitimation: votre consentement
  4. Communication des données: Les données ne seront pas communiquées à des tiers sauf obligation légale.
  5. Stockage des données: base de données hébergée par Occentus Networks (EU)
  6. Droits: à tout moment, vous pouvez limiter, récupérer et supprimer vos informations.