18 février 2022

Linux : retour sur la faille de sécurité Pwnkit

Logo

À peine deux mois après la faille de sécurité Log4Shell atteignant une bibliothèque de journalisation développée en Java, une nouvelle annonce a provoqué un vent de panique au sein des équipes cyber. Une vulnérabilité affectant depuis douze ans diverses distributions Linux vient en effet d’être mise à jour. Cette dernière, si elle ne peut être exploitée sans accès à la machine, permet l’élévation des droits de n’importe quel utilisateur à root. Ainsi, étant donné sa gravité et sa présence depuis plus d’une dizaine d’années au sein des systèmes Linux, la faille CVE-2021-4034, communément appelée faille de sécurité Pwnkit, a de quoi inquiéter.

1. Polkit une vulnérabilité vieille de douze ans

C’est en novembre dernier que la société de sécurité Qualys découvre la possibilité, via la bibliothèque libre Polkit d’obtenir les droits root sur une machine Linux. La vulnérabilité est immédiatement signalée aux équipes techniques et, rapidement, des patchs de sécurité sont publiés par Redhat et Ubuntu.

Polkit, anciennement PolicyKit, permet aux applications exécutées via des droits restreints de communiquer avec des services privilégiés. Pour ce faire, la librairie utilise un programme nommé Pkexec. Ce dernier souffre d’une mauvaise gestion des arguments de la ligne de commande. En effet, comme expliqué sur le blog de Qualys, lors d’un appel au programme via execve(), si le nombre d’arguments de la ligne de commande (argc) est défini à zéro, il est alors possible d’écraser les valeurs envp[0], et ainsi définir de nouvelles variables d’environnements.

Ce comportement est présent sur les systèmes Linux embarquant Polkit depuis une douzaine d’années, faisant redouter des exploitations largement antérieures à la découverte de la vulnérabilité.

2. Faille de sécurité Pwnkit : preuve du concept

Bien que Qualys n’ait pas publié de preuve du concept, il n’aura pas fallu attendre longtemps avoir de voir fleurir ici et là des codes attestant de la facilité d’exploitation. Un simple programme en C d’une vingtaine de lignes publié par Arthepsy sur Github permet l’élévation de privilèges sans réelle connaissance technique. Bien qu’elle nécessite tout de même un accès préalable à la machine.

faille de securite pwnkit du systeme linux
Cliquez sur l’image pour l’agrandir

Le code ci-dessus procède à la création des répertoires et des éléments supplantant les variables d’environnements de execve(). L’auteur définit une fonction shell(), cette dernière est compilée dans une librairie partagée Pwnkit.so et celle-ci est par la suite appelée par pkexec comme variable d’environnement. En effet, lors de l’appel à la fonction execve(), le dépassement de mémoire inhérent à pkexec, viendra remplacer la valeur de envp[0] par le pointeur env dans le code :

code faille de securite pwnkit

La librairie pwnkit.so est alors exécutée et nous obtenons un shell en tant que root sur la machine.

code de vulnerabilite pwnkit

La facilité d’exploitation d’une vulnérabilité aussi dangereuse nécessite sa correction de toute urgence.

3. Faille de sécurité Pwnkit : des patchs et des protections

Cyberark a publié sur son dépôt Github un script Python permettant de découvrir si son système est vulnérable à Pwnkit, fonctionnant pour l’instant uniquement sous Debian ou Ubuntu.

Les premiers correctifs ont été publiés pour Ubuntu, Debian Mint et Redhat. La mise à jour du système sous sa dernière version devrait corriger la vulnérabilité. Il est également possible de patcher directement Pkexec via le Gitlab officiel.

Il est également envisageable si les solutions précédentes ne sont pas applicables de procéder à une neutralisation de pkexec :

code neutralisation pkexec

Cette commande modifie les droits en supprimant le bit SUID de pkexec, ce qui l’empêche de s’exécuter en tant que binaire. Il est également possible de rechercher au sein des logs des erreurs symptomatiques de l’exploitation de Pwnkit.

La recherche des termes suivants peut indiquer des tentatives d’exploitation.

« The value for the Shell variable was not found the /etc/shells file » or « The value for environment variable […] contains suspicious content. » Ce n’est pas la première fois que Polkit souffre d’une élévation de privilège : en juin 2021, une vulnérabilité équivalente appelée CVE-2021-3560 avait déjà été découverte au sein de la librairie.  

4. Faille de sécurité Pwnkit : un code d’exploitation en PHP

Si les exemples d’exploitation sont rapidement apparus après publication de la vulnérabilité, la plupart ont été développés en langage C ou Python, partant du principe d’un accès direct sur la machine. Il peut être intéressant de voir s’il est possible d’adapter les charges virales développées en C au PHP. Dans le cadre d’une faille de type upload, l’exploitation s’en verrait facilitée.

Le but étant d’obtenir un reverse shell en tant que root sur la machine vulnérable. Pour ce faire, nous nous inspirons du travail effectué par Arthepsy, en l’adaptant à nos besoins.

5. Pwnkit : ne pas compiler sur le serveur

Afin de faciliter l’exploitation et obtenir notre accès même si gcc n’est pas accessible sur le serveur cible, nous allons compiler notre pwnkit.so (qui viendra écraser les valeurs d’environnements), et ensuite l’encoder en base 64. La donnée ainsi obtenue sera inscrite en dur dans notre charge en PHP puis réécrite sur le serveur. Nous adaptons le code pour obtenir un reverse shell.

vulnerabilite pwnkit payload
Payload réadapté afin d’obtenir un reverse shell – Cliquez sur l’image pour l’agrandir

L’adresse IP et le port définis sont ceux sur lesquels l’attaquant écoutera. Le reste du code procède de manière identique au travail d’Arthepsy, à la différence que nous ouvrons un socket au lieu d’exécuter /bin/sh sur la machine.

Nous compilons la charge, et l’encodons-en base64.

encodage en base 64

Enfin notre charge utile est inscrite dans le code PHP.

payload pwnkit so

6. Pwnkit : pas de libc en PHP

S’il est envisageable sous Python d’embarquer la bibliothèque C via la fonction find_library, il est largement plus difficile d’obtenir un équivalent en PHP. De plus, l’équivalent d’execve() de PHP : pcntl_exec(), ne se comportant pas de la même manière que sa version en C, l’appel à pkexec via cette fonction ne provoquera pas le dépassement de mémoire souhaité.

Ainsi, à l’instar de Pwnkit.so il faudra embarquer un programme exécutant notre payload en C au sein de notre code PHP.

code de la faille de securite pwnkit du systeme linux

En définitive le code PHP ne sert que de vecteur aux charges développées en C, cependant il devient pratique lors d’un test d’intrusion, un seul code est téléversé et automatise l’exploitation de Pwnkit.

Nous procédons à l’écriture des dossiers et fichiers nécessaire pour l’écrasement des variables d’environnements, ainsi que nos deux programmes préalablement encodés en base 64.

Ci-dessous, la charge est décodée sous le nom pwnkit.so et le programme embarquant la fonction execve sous le nom « Execution ».

Fonction execve de la faille de la securite pwmkit

Enfin, nous appelons la fonction shell_exec() afin de lancer ce dernier.

Lors du test la charge utile est téléversée sur un serveur Apache exécuté sur une Debian.

L’attaquant se met en écoute avec netcat et appel le script PHP.

faille de securite pwnkit cve 2021 4034

Enfin, afin d’automatiser un peu le principe de compilation et d’encodage en base 64, un script PHP est facilement réalisable, téléchargeable sur le Github de Digitemis.

Conclusion

Le début d’année 2022 est riche en vulnérabilités critiques : Pwnkit, Log4Shell mais aussi la CVE-2022-21907 (exécution de code à distance sur des systèmes Windows). Il est plus que nécessaire à l’heure actuelle où les attaques se multiplient de procéder aux mises à jour requises et à un état des lieux en matière de sécurité. Audits d’architecture, tests d’intrusion, Redteam selon vos besoins et votre maturité en matière de cybersécurité. Plusieurs types de contrôles sont possibles et peuvent vous épargner une attaque coûteuse en temps et en argent.

Blog

Nos derniers articles

Cybersécurité

Cyber Resilience Act : quelles obligations pour les éditeurs et les fabricants ?

Le Cyber Resilience Act est entré en vigueur le 10 décembre 2024, mais rien ne vous était encore demandé. Cela change le 11 septembre 2026 : à cette date, la plateforme européenne de signalement ouvre, et les fabricants doivent y déclarer leurs vulnérabilités activement exploitées. Restait une inconnue que le règlement laissait à chaque État membre : qui contrôle, et qui sanctionne. La foire aux questions publiée par l’ANSSI vient de la lever.

28 août 2026

Cybersécurité

Tester la sécurité de son site web : ce que voient les outils gratuits

Le contrôle d'accès défaillant occupe la première place du Top 10 de l'OWASP depuis l'édition 2021, devant les défauts cryptographiques et les injections. C'est aussi la famille de failles qu'un scanner automatique détecte le plus mal, parce qu'elle suppose de comparer les droits de deux comptes distincts et de comprendre qui a le droit de voir quoi. Un outil qui lit des en-têtes HTTP ne raisonne pas comme cela. Vouloir tester la sécurité de son site web reste une démarche saine, et les scanners publics ont leur utilité. Ils répondent simplement à une question plus étroite que celle que se pose un dirigeant.

18 août 2026

Cybersécurité

Analyse de risque EBIOS : ce que les cinq ateliers produisent vraiment

L'ANSSI a publié EBIOS Risk Manager en 2018, en rupture avec la logique d'inventaire qui dominait jusque-là les analyses de risque. Huit ans plus tard, la méthode est devenue la référence française, citée dans les dossiers NIS 2, réclamée par les auditeurs, inscrite dans les cahiers des charges. Elle est aussi, souvent, mal employée. Beaucoup d'analyses se terminent par un classeur de trois cents lignes que personne ne rouvre, faute d'avoir été construit pour décider quoi que ce soit. Chez Digitemis, nous animons ces ateliers pour des organisations qui doivent à la fois se protéger, se conformer et continuer à produire. Une analyse utile répond à une question courte : sur quels verrous investir pour que l'activité ne s'arrête pas.

18 août 2026

informations

Contactez-nous

Une question ou un projet en tête ? Remplissez le formulaire, nous reviendrons vers vous rapidement pour un premier échange.

    *Informations obligatoires

    Les informations recueillies à partir de ce formulaire sont traitées par Digitemis pour donner suite à votre demande de contact. Pour connaître et/ou exercer vos droits, référez-vous à la politique de Digitemis sur la protection des données, cliquez ici.

    Index