
Élévation de privilèges par race condition dans polkit
Élévation de privilèges via une condition de course dans polkit.
CVE-2021-3560 est une condition de course (race condition) dans polkit qui permet à un utilisateur local non autorisé d'obtenir les droits root. La vulnérabilité réside dans la manière dont polkit gère les erreurs D-Bus lors d'une interruption de la connexion.
Pour déterminer le timing optimal, exécutez la commande :
time dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:testuser string:"Test User" int32:1
Le code utilise une plage de la moitié du temps réel ± 0,003.
Pourquoi le timing est-il important ?
Si l'on tue le processus trop tôt — la requête n'a pas le temps d'être envoyée
Si l'on tue trop tard — polkit a le temps de vérifier l'autorisation et rejette la demande
Il faut atteindre la "fenêtre dorée", lorsque polkit a déjà reçu la requête mais n'a pas encore vérifié l'autorisation
Comment fonctionne l'exploit ?
Une requête D-Bus est envoyée pour créer un utilisateur avec le paramètre int32:1 (ajout au groupe wheel)
La requête est interrompue au milieu (condition de course)
Polkit n'a pas le temps de terminer la vérification de l'autorisation
D-Bus ne peut pas trouver l'expéditeur
Polkit gère incorrectement l'erreur et attribue UID = 0 (root)
L'utilisateur est créé sans authentification
Une requête est envoyée pour définir le mot de passe du nouvel utilisateur (avec le même timing)
Statistiques de réussite
L'utilisateur peut être créé en 1 à 2 tentatives
L'attribution du mot de passe nécessite davantage de tentatives
100 itérations donnent une forte probabilité de succès
Si l'exploit ne fonctionne pas, essayez :
Élargir TIMING_RANGE dans le code
Exécuter le script plusieurs fois
Vérifier que vous êtes dans une session SSH (et non dans une session graphique)