
CVE-2021-3560 — Exploit d'élévation de privilèges de Polkit via une condition de concurrence D-Bus d'accounts-daemon
CVE-2021-3560 est une vulnérabilité locale d'élévation de privilèges dans Polkit (anciennement PolicyKit), le cadre d'autorisation utilisé par les environnements de bureau Linux. Un attaquant local non privilégié peut exploiter une condition de course dans l'interface D-Bus accounts-daemon pour créer un utilisateur privilégié, définir son mot de passe et finalement obtenir un accès root.
accounts-daemon (org.freedesktop.Accounts) est un service D-Bus système qui gère les comptes utilisateurs (création, suppression, changements de mot de passe, etc.). Il expose des méthodes telles que :
| Méthode | Action |
|---|---|
CreateUser | Crée un nouvel utilisateur système |
SetPassword | Définit le mot de passe de l'utilisateur |
DeleteUser | Supprime un utilisateur |
Ces opérations nécessitent une autorisation. Lorsqu'un appel D-Bus arrive, Polkit se situe entre l'appelant et accounts-daemon :
Caller → D-Bus → Polkit (authorization check) → accounts-daemon (action)
Polkit décide si l'appelant a la permission et, le cas échéant, transmet la requête à accounts-daemon pour exécution.
La vulnérabilité est une course TOCTOU (Time Of Check, Time Of Use). Voici l'idée clé :
accounts-daemon (par exemple CreateUser).accounts-daemon ait fini de traiter — la création de l'utilisateur aboutit sans authentification appropriée, mais l'enregistrement de l'utilisateur se retrouve incomplet (par exemple, pas de mot de passe, pas de répertoire personnel).SetPassword sur l'utilisateur nouvellement créé (mais non authentifié), ou l'état incomplet lui-même accorde des privilèges élevés.En bref : tuez la requête au bon moment et vous contournez l'authentification.
Ce script exploit.sh automatise toute la chaîne d'attaque :
# Clone the repository
git clone https://github.com/Jeanback1/CVE-2021-3560.git
cd CVE-2021-3560
# Make the exploit executable
chmod +x exploit.sh
# Run it
./exploit.sh
Une fois l'exploit terminé, vous disposerez d'un shell root :
whoami
# root

| Composant | Concerné |
|---|---|
| polkit | ≤ 0.119 (non corrigé) |
| accounts-daemon (accountsservice) | Toutes les versions utilisant polkit affecté |
La vulnérabilité a été corrigée dans polkit 0.120 et versions ultérieures.
Distributions corrigées (liste non exhaustive) :
Ce dépôt est destiné uniquement à la recherche en sécurité éducative et autorisée. N'utilisez pas cet exploit sur des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas l'autorisation explicite de tester. L'auteur décline toute responsabilité en cas d'utilisation abusive.
| Étape | Action |
|---|
| 1. Calibrage temporel | Utilise un appel factice CreateUser("nobody") pour mesurer la durée de l'aller-retour D-Bus, en calculant la "fenêtre de kill" |
| 2. Création de l'utilisateur | Envoie un appel CreateUser pour un nom d'utilisateur choisi, le lance en arrière-plan, attend la fenêtre calculée, puis le tue — exploitant la course pour créer un utilisateur non autorisé |
| 3. Définition du mot de passe | Une fois que l'utilisateur existe (dans un état incomplet), envoie un appel SetPassword avec la même technique de course pour attribuer un mot de passe connu |
| 4. Élévation de privilèges | Utilise su pour passer au nouvel utilisateur, exécute sudo (qui fonctionne parce que l'utilisateur a été créé via un chemin d'autorisation contourné), copie /bin/bash vers /var/tmp/bash avec SUID root, et lance un shell root |