
Bildungsorientierte Analyse und PoC im Testmodus für CVE-2026-92162, einen Path Traversal im DeployAppstream-Arch-Parameter von Flatpak, der die Erstellung von Root-Verzeichnissen ermöglicht.
Lehrreiche Ausarbeitung und Proof of Concept im Testmodus für einen Path Traversal im
Flatpak-System-Helper (flatpak-system-helper). Die D-Bus-Methode DeployAppstream
akzeptiert einen arch-String, der in einen Dateisystempfad eingesetzt und als root
erstellt wird, ohne Validierung. Ein aktiver lokaler Benutzer kann ../-Komponenten
übergeben und bewirken, dass der root-privilegierte Dienst Verzeichnisse außerhalb des
vorgesehenen appstream-Baums erstellt.
Dieses Repository begleitet die vollständige technische Analyse und den Forschungs-Post-Mortem. Es dient der Bildung, für Verteidiger, die den Mechanismus verstehen wollen, und für autorisierte Tests auf Systemen, die Ihnen gehören oder für die Sie eine schriftliche Genehmigung zur Bewertung haben.
Dieses Material wird nach koordinierter Offenlegung und nach Bereitstellung eines korrigierten Flatpak-Releases veröffentlicht. Führen Sie den Proof of Concept nur gegen eine Labormaschine aus, die Ihnen gehört oder die Sie ausdrücklich zur Testung autorisiert haben. Führen Sie ihn nicht gegen Systeme aus, die Sie nicht kontrollieren. Sie sind dafür verantwortlich, im Rahmen des Gesetzes und im Rahmen jeder Autorisierung zu bleiben, die Sie besitzen.
handle_deploy_appstream() im System-Helper validiert das origin-Argument, aber
nicht das arch-Argument. Bei einem OCI-Remote fließt arch in flatpak_build_file
und dann in g_mkdir_with_parents, das als root läuft und ../ lexikalisch auflöst.
Die polkit-Aktion für die Methode ist org.freedesktop.Flatpak.appstream-update, die
allow_active=yes ist, sodass eine aktive lokale Sitzung den Code ohne
Passwortabfrage erreicht. Auf einem System, das bereits ein OCI-Remote hat, wie etwa
eine Standard-Fedora-Workstation mit ihrem fedora-Remote, kann ein Benutzer mit
geringen Rechten root-eigene Verzeichnisse an einem beliebigen Pfad erstellen. Die
Payload in diesem Repository zielt auf /root/.ssh selbst.
Diese Schwachstelle, Finding A, wurde als Teil einer Kette aus zwei Schwachstellen
demonstriert, die verwendet wurde, um von einem nicht authentifizierten lokalen
Benutzer zu root auf der Maschine zu eskalieren, in einem kontrollierten und
autorisierten Labor. Die Kette funktioniert wie folgt: Finding A erstellt /root/.ssh
als root. Finding B, ein sekunditives Schreib-Primitiv, kann dann vom Angreifer
kontrollierte Inhalte in dieses Verzeichnis schreiben. Zusammen geben sie einem
Angreifer eine root-eigene Datei an einem vom Angreifer gewählten Pfad. Jeder Bug
allein ist begrenzt: Finding A erstellt nur Verzeichnisse, und Finding B kann nur
dorthin schreiben, wo bereits ein übergeordnetes Verzeichnis existiert. Finding A
liefert das übergeordnete Verzeichnis, das Finding B benötigt, und das Paar wird zu
einem root-Dateischreibzugriff.
Finding B wurde unabhängig durch diese Forschung identifiziert, ist aber kein neuer
Fund: Es ist die bekannte, weiterhin ungepatchte Schwäche im Extra-Data-Write-Pfad
von Deploy, die im Forschungs-Post-Mortem dokumentiert ist. Diese Ausarbeitung
behandelt daher Finding A und wird dafür anerkannt, und verwendet Finding B nur als
die bekannte, ungepatchte Komponente, auf die sich die Kette stützt.
Dieses Repository demonstriert nur Finding A. Die Verkettungsmethodik und die defensiven Lehren sind im Forschungs-Post-Mortem dokumentiert.
Das Projekt liefert bereits flatpak_is_valid_arch, das einen Architekturnamen auf
[A-Za-z0-9_] beschränkt. Die Behebung besteht darin, es am Handler-Rand und
innerhalb der pfadbildenden Helfer auf das arch-Argument anzuwenden. Ein ../-Wert
kann dieses Prädikat nicht passieren. Aktualisieren Sie auf das korrigierte
Flatpak-Release.
.
├── README.md Diese Datei.
├── requirements.txt Systempaket-Voraussetzungen für den PoC.
└── poc_arch_traversal.sh PoC für den unvalidierten arch-Parameter.
Standardmäßig Sandbox-Testmodus, Produktionsmodus
zielt auf /root/.ssh. Nur für Bildungszwecke.
requirements.txt.allow_active=yes angewiesen ist. Prüfen
Sie mit: loginctl list-sessions und bestätigen Sie, dass Ihre Sitzung einen
Seat anzeigt./usr/libexec/flatpak-system-helper; das
Skript sucht zuerst nach einem frisch gebauten Helper in builddir/ oder
_build/ des Flatpak-Quellbaums, und FLATPAK_SYSTEM_HELPER überschreibt
alles. Siehe requirements.txt für die benötigten Systempakete.Der Produktionsmodus erkennt automatisch ein vorhandenes OCI-Remote in der Systeminstallation und verwendet es. Jedes OCI-Remote funktioniert, selbst ein gefälschtes oder unerreichbares, da das mkdir erfolgt, bevor die Registry überhaupt kontaktiert wird. Wenn kein OCI-Remote existiert, bricht das Skript mit einer Meldung "No OCI remote found" ab und sendet nichts.
Fedora Workstation liefert bereits das OCI-Remote fedora, sodass dort nichts
getan werden muss. Prüfen Sie, was existiert, mit flatpak remotes --system (ein
OCI-Remote zeigt oci in seiner Optionsspalte).
Dies ist der einzige Befehl im gesamten Ablauf, der sudo benötigt, und das Skript führt ihn nie für Sie aus. Fügen Sie eines hinzu mit:
sudo flatpak remote-add --system --no-gpg-verify oci-poc oci+http://127.0.0.1:19876
(flatpak hat kein --oci-Flag, zumindest bis 1.19.0, der Version, auf der diese
Arbeit basiert; das oci+-URL-Präfix macht das Remote zu einer OCI-Registry.) Eine
Meldung "Warning: Could not update extra metadata" ist zu erwarten, wenn keine
Registry läuft; das Remote wird trotzdem hinzugefügt.
bash poc_arch_traversal.sh
Das Skript startet einen privaten D-Bus-Bus und einen Helper im --session-Modus,
alles unter einem temporären Verzeichnis. Es ruft DeployAppstream mit der Payload
../../../../../root/.ssh auf und verifiziert, dass das ausgebrochene Verzeichnis
unter <workdir>/root/.ssh erstellt wurde, was das reale Ziel widerspiegelt.
Erwarten Sie einen D-Bus-Fehler in der Mitte der Ausgabe: Das ist der fehlschlagende
OCI-Index-Abruf, nachdem das Verzeichnis bereits erstellt wurde, und das ist das
erwartete Verhalten.
bash poc_arch_traversal.sh prod
Das Skript fragt nie nach einem Passwort. Es erkennt automatisch ein OCI-Remote,
löst DeployAppstream unauthentifiziert mit der Traversal-Payload aus und gibt die
Antwort des Helpers aus. Der root-Helper erstellt /root/.ssh und schlägt dann bei
der unerreichbaren Registry fehl, was den erwarteten D-Bus-Fehler ausgibt. Wenn die
Antwort stattdessen ein Authentifizierungsfehler ist, befinden Sie sich nicht in
einer aktiven lokalen Sitzung; führen Sie es von der Konsole der Maschine aus. Ein
bestimmtes Remote kann mit bash poc_arch_traversal.sh prod <remote> erzwungen
werden.
Der Trigger selbst läuft unprivilegiert, aber die Bestätigung des Ergebnisses erfordert root, daher überlässt das Skript das Ihnen. Nach dem Lauf, auf derselben Maschine:
sudo ls -laR /root/.ssh
sudo stat -c '%U:%G' /root/.ssh
Das Verzeichnis muss existieren und root:root gehören. Der D-Bus-Fehler in der
Skriptausgabe ist kein Fehlschlag: Er beweist, dass das mkdir vor dem Abruf lief, da
das ausgebrochene Verzeichnis existiert, obwohl der Methodenaufruf fehlschlug.
Wenn /root/.ssh bereits vor dem Lauf existierte (zum Beispiel auf einem Host mit
laufendem sshd), ist der Lauf auf diesem Pfad ein No-op und hinterlässt nichts: Die
lock-Datei des Helpers ist transient und wird entfernt, wenn die Methode
zurückkehrt, und icons wird erst nach einem erfolgreichen Index-Abruf geschrieben.
Für eine saubere Verifikation führen Sie ihn gegen einen Pfad aus, der noch nicht
existiert.
sudo rm -rf /root/.ssh # nur, wenn es vor dem Lauf nicht existierte
sudo flatpak remote-delete --system oci-poc
Recherche und Ausarbeitung von Yehia Ali Mohamed Ezzat.
Dokumentation und Code in diesem Repository werden für Bildungszwecke bereitgestellt. Nutzung auf eigenes Risiko und nur dort, wo Sie autorisiert sind.