CVE-2026-41651 — PackageKit TOCTOU Lokale Rechteausweitung
Klassifizierung: Purple-Team-Bewertungsartefakt
Nur für autorisierte Nutzung. Dieses Dokument und das begleitende Testskript sind ausschließlich für interne Sicherheitsvalidierung auf Systemen bestimmt, für die eine schriftliche Genehmigung vorliegt.
Nachweis der Ausnutzung

Inhaltsverzeichnis
- Überblick über die Schwachstelle
- Technische Analyse
- Beschreibung des Testskripts
- Indikatoren für eine Kompromittierung
- Erkennungslogik
- Betroffene Systeme & Versionen
- Behebung
- Referenzen
Überblick über die Schwachstelle
PackageKit ist eine D-Bus-Abstraktionsschicht für die Systempaketverwaltung, die standardmäßig auf GNOME-basierten Desktops unter Debian, Ubuntu, Fedora, RHEL, SUSE und Arch Linux vorhanden ist. Da es privilegierte Paketoperationen im Namen von Benutzern ohne Privilegien vermittelt, hat ein Fehler in seinem Autorisierungsablauf systemweite Root-Auswirkungen.
Technische Analyse
Grundursache
pk-transaction.c (vor 1.3.5) erzwang keine Zustandsprüfung bei erneuter Aufrufung von Aktionsmethoden. Ein D-Bus-Client konnte InstallFiles (oder andere Aktionsmethoden) mehrfach auf demselben Transaktionsobjekt aufrufen, nachdem es bereits aus PK_TRANSACTION_STATE_NEW übergegangen war.
Angriffskette
Angreifer (ohne Privilegien)
│
├─① CreateTransaction() → PackageKit gibt Objektpfad der Transaktion zurück (tid)
│
├─② InstallFiles(tid, FLAG_SIMULATE=4, [dummy.pkg])
│ PackageKit stellt eine polkit-Autorisierungsprüfung für dummy.pkg in die Warteschlange.
│ Es findet noch keine Installation statt — SIMULATE bedeutet nur Trockenlauf.
│
├─③ InstallFiles(tid, FLAG_NONE=0, [payload.pkg]) ← TOCTOU-Fenster
│ Ruft dasselbe tid erneut auf, bevor die Autorisierung aufgelöst wird.
│ Verwundbare Versionen überschreiben die in der Warteschlange befindlichen Parameter mit payload.pkg.
│
└─④ polkit gewährt Autorisierung (Benutzer genehmigt oder automatisch autorisiert)
packagekitd installiert payload.pkg als root.
payload postinst/post-Skript: install -m 4755 /bin/bash /tmp/.suid_bash
Angreifer führt /tmp/.suid_bash -p aus → Root-Shell.
Warum das Rennen gewinnt
Die Schritte ② und ③ werden als nicht blockierende asynchrone D-Bus-Aufrufe auf derselben Verbindung gesendet und in einem einzigen Schreibvorgang geleert. Die beiden Nachrichten treffen bei packagekitd ein, bevor es ② verarbeiten und die Zustandsmaschine vorantreiben kann, wodurch das TOCTOU-Fenster offen bleibt. Der Fix in 1.3.5 fügt eine explizite Zustandsprüfung hinzu, die bei jeder erneuten Aufrufung nach PK_TRANSACTION_STATE_NEW PK_TRANSACTION_ERROR_INVALID_STATE zurückgibt.
Beschreibung des Testskripts
Datei: cve-2026-41651-purpleteam.py
Sprache: Python 3
Abhängigkeiten: python3-gi (GObject-Introspection / GLib-Gio-Bindungen)
Zweck
Demonstriert die Ausnutzbarkeit von CVE-2026-41651 auf einem vorbereiteten Testsystem für folgende Zwecke:
- Validierung, ob die installierte PackageKit-Version verwundbar ist
- Erzeugung realistischer IOC-Telemetrie für die SIEM/EDR-Abstimmung
- Testen der Erkennungsabdeckung vor und nach dem Patchen
Verhalten
Unterstützung gehärteter Umgebungen
Standardmäßig gehärtete Systeme können den Exploit an zwei unabhängigen Punkten blockieren. Das Skript behandelt beide automatisch.
1. Restriktive umask (027 / 077)
Eine prozessvererbte umask von 027 oder 077 führt dazu, dass mkdir() Verzeichnisse mit 750 oder 700 erzeugt. Sowohl dpkg-deb als auch rpmbuild müssen den gesamten Build-Baum durchlaufen — wenn ein Verzeichnis nicht lesbar ist, schlägt der Build still fehl.
Angewendeter Fix: os.umask(0o022) wird beim Start aufgerufen, bevor eine Datei oder ein Verzeichnis erstellt wird. Zusätzlich erhält jedes Verzeichnis und jede Datei im Build-Baum unmittelbar nach der Erstellung ein explizites chmod (0o755 für Verzeichnisse und Skripte, 0o644 für Datendateien), sodass die korrekten Berechtigungen unabhängig von der geerbten umask garantiert sind.
2. nosuid / noexec-Mount-Flags auf /tmp
| Flag | Auswirkung auf den Exploit |
|---|
nosuid | Der Kernel entfernt still das SUID-Bit von jeder Datei, die auf diesem Dateisystem gespeichert ist — die kopierte bash wird nie root |
noexec | Die SUID-Binärdatei kann überhaupt nicht ausgeführt werden |
Angewendeter Fix: Beim Start liest _find_suid_dir() /proc/mounts und testet Kandidatenverzeichnisse in Präferenzreihenfolge, bis es eines findet, dessen Dateisystem keines der beiden Flags gesetzt hat. Der aufgelöste Pfad wird dann in das Post-Installationsskript des Payloads eingebettet und für Abfragen und Ausführung verwendet.
Wenn alle Kandidaten blockiert sind, beendet sich das Skript mit einer klaren Fehlermeldung, anstatt still zu scheitern.
Kompatibilität
| Distributionsfamilie | Paketwerkzeug | Getestet |
|---|
| Debian / Ubuntu | dpkg-deb | ✓ |
| RHEL / Fedora |
Indikatoren für eine Kompromittierung
IOCs sind von generisch/Infrastrukturebene bis hin zu skriptspezifischen Artefakten aufgelistet. Erkennungen, die auf den generischen Indikatoren basieren, erfassen diese CVE unabhängig davon, welche PoC-Variante verwendet wird.
Dateisystem
Prozess & Ausführung
D-Bus-Aktivität
Audit-Log-Muster
Aktivieren mit: auditctl -a always,exit -F arch=b64 -S all -F path=/usr/bin/packagekitd
Oder verwenden Sie die folgenden Regeln in /etc/audit/rules.d/:
# Erkennung der SUID-Dateierstellung in allen Kandidaten-Ablageverzeichnissen
-a always,exit -F arch=b64 -S chmod,fchmod,fchmodat -F a2&04000 -F dir=/tmp -k suid_drop
-a always,exit -F arch=b64 -S chmod,fchmod,fchmodat -F a2&04000 -F dir=/var/tmp -k suid_drop
-a always,exit -F arch=b64 -S chmod,fchmod,fchmodat -F a2&04000 -F dir=/dev/shm -k suid_drop
# Erkennung von dpkg-deb / rpmbuild durch Nicht-Root
-w /usr/bin/dpkg-deb -p x -k pkg_build_nonroot
-w /usr/bin/rpmbuild -p x -k pkg_build_nonroot
# Erkennung der SUID-bash-Ausführung aus jedem Kandidaten-Ablageverzeichnis
-a always,exit -F arch=b64 -S execve -F dir=/tmp -F uid!=0 -F euid=0 -k priv_esc_drop
-a always,exit -F arch=b64 -S execve -F dir=/var/tmp -F uid!=0 -F euid=0 -k priv_esc_drop
-a always,exit -F arch=b64 -S execve -F dir=/dev/shm -F uid!=0 -F euid=0 -k priv_esc_drop
Paketmanager-Artefakte
Artefakte der Rechteausweitung
Erkennungslogik
SIEM-Pseudo-Regel (Generisch — deckt alle CVE-2026-41651-Varianten ab)
(
event.category == "process"
AND process.name IN ("dpkg-deb", "rpmbuild")
AND process.user.id != "0"
AND NOT process.parent.name IN ("apt", "apt-get", "dpkg", "rpm", "dnf", "yum", "zypper", "mock", "koji")
)
OR
(
event.category == "file"
AND file.path LIKE "/tmp/%" OR file.path LIKE "/var/tmp/%" OR file.path LIKE "/dev/shm/%"
AND file.owner == "root"
AND (file.mode LIKE "04%")
)
OR
(
event.category == "process"
AND process.name == "bash"
AND process.real_user.id != "0"
AND process.effective_user.id == "0"
AND NOT process.parent.name IN ("sudo", "su", "sshd", "login", "pam")
)
EDR-Verhaltenskette
packagekitd
└─ sh / bash (cwd oder arg stimmt mit /tmp, /var/tmp, /dev/shm oder $HOME überein)
└─ install / cp / chmod (Ziel hat SUID + Besitzer root)
Kennzeichnen Sie die gesamte Kette. Jeder einzelne Schritt allein kann harmlos sein; die Eltern-Kind-Beziehung durch packagekitd zu einem SUID-setzenden Befehl ist hochpräzise, unabhängig davon, welches Ablageverzeichnis ausgewählt wurde. Erweitern Sie pfadbasierte Regeln, um alle vier Kandidaten abzudecken.
Betroffene Systeme & Versionen
Installierte Version prüfen: pkcon backend-details oder packagekit --version
Verwundbar, wenn die gemeldete Version ≤ 1.3.4 ist.
Behebung
Primär: Aktualisieren Sie PackageKit auf 1.3.5 oder wenden Sie den herstellerspezifischen Backport an.
# Debian / Ubuntu
apt update && apt install --only-upgrade packagekit
# Fedora / RHEL
dnf upgrade packagekit
# SUSE
zypper update packagekit
Minderungsmaßnahmen (falls ein Patchen nicht sofort möglich ist):
Referenzen
Generiert: 2026-04-24 | Aktualisiert: 2026-04-25 | Purple-Team-Bewertung | Nur für interne Verwendung