
Linux-Privilegieneskalation über LXD
Mitglieder der lokalen lxd-Gruppe auf Linux-Systemen haben zahlreiche Wege, ihre Privilegien auf Root auszuweiten. Dieses Repository enthält Beispiele für vollautomatisierte lokale Root-Exploits. Eine ausführliche Erklärung der Schwachstelle und eine exemplarische Vorführung des Exploits finden Sie in meinem Blog hier.
Die folgenden Exploits sind keine Container-Ausbrüche, sondern lokale Root-Exploits, die Container ausnutzen und das Host-Betriebssystem angreifen. Für eine erfolgreiche Ausnutzung ist ein Zugriff mit niedrigen Privilegien auf die Host-Umgebung erforderlich.
Ich glaube, meine Strategie bei Version 2 des Exploits ist einzigartig und war interessant genug (zumindest für mich), um im oben verlinkten Blog eine ausführliche Erklärung zu schreiben.
lxd_rootv1.sh mountet das Host-Dateisystem / in einen Container, wo der Benutzer mit niedrigen Privilegien Root-Zugriff hat. Dieser Root-Zugriff wird auf den Host zurückgemappt und ermöglicht es, den aktuellen Benutzer zur Datei /etc/sudoers hinzuzufügen. Dies wurde vor mir bereits von anderen ausgenutzt.lxd_rootv2.py mountet den privaten systemd-UNIX-Socket des Hosts in einen Container und dann über LXD-Proxy-Geräte wieder zurück auf den Host. Diese Proxy-Geräte haben Root-Rechte und übergeben während der Socket-Kommunikation ihre Anmeldeinformationen, im Gegensatz zu den Anmeldeinformationen des auslösenden Benutzers mit niedrigen Privilegien. Dies wird missbraucht, um einen temporären systemd-Dienst zu erstellen, der den aktuellen Benutzer zur Datei /etc/sudoers hinzufügt.Beide Exploits benötigen einen Container, also erstellen Sie zuerst einen. Führen Sie den Exploit dann vom Host-Betriebssystem aus aus, wobei der Name des Containers das erste Argument ist.
# Exploit with v1
$ bash lxd_rootv1.sh <container name>
# Exploit with v2
$ python3 lxd_rootv2.py <container name>

Bevor ich auf diese Probleme stieß, gab es in der offiziellen LXD-Dokumentation nichts, das Benutzer davor warnte, dass die lxd-Gruppe gefährlich ist. Jeder, der den offiziellen Richtlinien zur Konfiguration von LXD folgte, hätte sein Konto vor der Bereitstellung seines ersten Containers zu dieser Gruppe hinzugefügt. Ich habe einen Bug bei Canonical eröffnet, um meine Bedenken zu äußern – die vollständige Diskussion können Sie hier lesen. Das LXD-Team hat die Dokumentation schnell angepasst; sie stellt nun klar, dass diese Gruppe nur Personen erhalten sollten, denen Root-Zugriff anvertraut wird.
Wie immer war die Interaktion mit den Leuten von Canonical über ihren Bug-Tracker eine wirklich angenehme Erfahrung. Ich möchte ihnen für ihre Zeit und die wohlwollende Berücksichtigung meiner Ideen danken. Ich kann anderen Sicherheitsforschern nur empfehlen, Anliegen auf diese Weise direkt an sie heranzutragen.
Ich bin nicht der Erste, der LXD ausgenutzt hat. Dies wurde bereits in mehreren GitHub-Tickets ab 2016 als Bedenken geäußert:
Bei dem ersten Link handelt es sich, soweit ich das beurteilen kann, um die erste Person (simpoir), die dieses Risiko erkannt hat.
@reboare hat lange vor mir einen netten Blog über die Ausnutzung von LXD mit derselben Methode wie mein v1-Exploit geschrieben:
Danke an die LXD-Leute für die Entwicklung eines sehr coolen Tools. Ich selbst nutze LXD und mag es sehr. Ich glaube nicht, dass dies ein Ausschlusskriterium für die Verwendung von LXD ist; ich denke, es ist nur sehr wichtig, das potenzielle Risiko zu verstehen, wenn man Benutzer zur lxd-Gruppe hinzufügt.
Für keine dieser Schwachstellen gibt es einen offiziellen Fix. Jeder, der LXD verwendet, sollte sich darüber im Klaren sein, dass das Hinzufügen von Benutzern zur lxd-Gruppe im Wesentlichen bedeutet, sie zu Root zu machen.
Wenn Sie LXD auf einem Host mit nur einem Benutzer verwenden, etwa einem Desktop, ist es möglicherweise am besten, die lxd-Gruppe gar nicht zu verwenden und sudo auszuführen, wenn Sie mit der API kommunizieren müssen.
Für gemeinsam genutzte Umgebungen, in denen mehrere Personen an Containern arbeiten, ist es möglicherweise am besten, verschachtelte Umgebungen zu erstellen. Jeder einzelne Benutzer der LXD-Gruppe kann seine eigene Umgebung ausnutzen, muss dann aber mehr Aufwand betreiben, um aus diesem Container auszubrechen und die anderen anzugreifen.