
CVE-2021-3560 — Polkit Privilegieneskalation-Exploit durch accounts-daemon D-Bus Race Condition
CVE-2021-3560 ist eine lokale Privilegieneskalations-Schwachstelle in Polkit (früher PolicyKit), dem Autorisierungsframework, das in Linux-Desktop-Umgebungen verwendet wird. Ein lokaler, nicht privilegierter Angreifer kann eine Race-Condition in der accounts-daemon D-Bus-Schnittstelle ausnutzen, um einen privilegierten Benutzer zu erstellen, dessen Passwort festzulegen und letztendlich root-Zugriff zu erlangen.
accounts-daemon (org.freedesktop.Accounts) ist ein systemweiter D-Bus-Dienst, der Benutzerkonten verwaltet (Erstellung, Löschung, Passwortänderungen usw.). Er stellt Methoden zur Verfügung wie:
| Methode | Aktion |
|---|---|
CreateUser | Erstellt einen neuen Systembenutzer |
SetPassword | Legt das Benutzerpasswort fest |
DeleteUser | Löscht einen Benutzer |
Diese Vorgänge erfordern eine Autorisierung. Wenn ein D-Bus-Aufruf eintrifft, sitzt Polkit zwischen dem Aufrufer und accounts-daemon:
Caller → D-Bus → Polkit (authorization check) → accounts-daemon (action)
Polkit entscheidet, ob der Aufrufer berechtigt ist, und leitet die Anfrage gegebenenfalls zur Ausführung an accounts-daemon weiter.
Die Schwachstelle ist eine TOCTOU (Time Of Check, Time Of Use)-Race. Hier ist der entscheidende Punkt:
accounts-daemon gesendet (z. B. CreateUser).accounts-daemon die Verarbeitung abschließt – wird die Benutzererstellung ohne ordnungsgemäße Authentifizierung durchgeführt, aber der Benutzereintrag bleibt unvollständig (z. B. kein Passwort, kein Home-Verzeichnis).SetPassword für den neu erstellten (aber nicht authentifizierten) Benutzer aufzurufen, oder der unvollständige Zustand gewährt selbst erhöhte Privilegien.Kurz gesagt: Beenden Sie die Anfrage zum richtigen Zeitpunkt, und Sie umgehen die Authentifizierung.
Dieses exploit.sh-Skript automatisiert die gesamte Angriffskette:
# 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
Sobald der Exploit abgeschlossen ist, haben Sie eine root-Shell:
whoami
# root

| Komponente | Betroffen |
|---|---|
| polkit | ≤ 0.119 (ungepatcht) |
| accounts-daemon (accountsservice) | Alle Versionen, die betroffenes polkit verwenden |
Die Schwachstelle wurde in polkit 0.120 und später gepatcht.
Gepatchte Distributionen (nicht vollständig):
Dieses Repository dient ausschließlich zu Bildungs- und autorisierten Sicherheitsforschungszwecken. Verwenden Sie diesen Exploit nicht auf Systemen, die Ihnen nicht gehören oder für die Sie keine ausdrückliche Testberechtigung haben. Der Autor übernimmt keine Haftung für Missbrauch.
| Schritt | Aktion |
|---|
| 1. Zeitkalibrierung | Verwendet einen Dummy-CreateUser("nobody")-Aufruf, um die Dauer des D-Bus-Rundgangs zu messen und das „Kill-Fenster“ zu berechnen |
| 2. Benutzererstellung | Sendet einen CreateUser-Aufruf für einen gewählten Benutzernamen, startet ihn im Hintergrund, wartet für das berechnete Fenster und beendet ihn dann – nutzt die Race aus, um einen nicht autorisierten Benutzer zu erstellen |
| 3. Passwort setzen | Sobald der Benutzer existiert (in einem unvollständigen Zustand), sendet er einen SetPassword-Aufruf mit derselben Race-Technik, um ein bekanntes Passwort zuzuweisen |
| 4. Privilegieneskalation | Verwendet su, um zu dem neuen Benutzer zu wechseln, führt sudo aus (was funktioniert, weil der Benutzer durch einen umgangenen Autorisierungspfad erstellt wurde), kopiert /bin/bash nach /var/tmp/bash mit SUID root und startet eine root-Shell |