
CVE-2026-41651 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो PackageKit TOCTOU स्थानीय विशेषाधिकार वृद्धि है, तकनीकी विश्लेषण, डिटेक्शन लॉजिक और उपचार मार्गदर्शन के साथ।
वर्गीकरण: पर्पल टीम मूल्यांकन आर्टिफैक्ट
केवल अधिकृत उपयोग के लिए। यह दस्तावेज़ और साथ में दी गई परीक्षण स्क्रिप्ट केवल उन प्रणालियों पर आंतरिक सुरक्षा सत्यापन के लिए हैं जहाँ लिखित प्राधिकरण प्राप्त किया गया है।

| फ़ील्ड | मान |
|---|---|
| CVE ID | CVE-2026-41651 |
| CWE | CWE-367 — समय-जाँच समय-उपयोग (TOCTOU) रेस स्थिति |
| घटक | PackageKit (packagekitd, D-Bus सेवा) |
| प्रभावित | PackageKit ≤ 1.3.4 |
| इसमें ठीक किया गया | PackageKit 1.3.5 |
| प्रभाव | स्थानीय विशेषाधिकार वृद्धि → रूट |
| हमला वेक्टर | स्थानीय / D-Bus (अविशेषाधिकार प्राप्त उपयोगकर्ता सत्र) |
| खुलासा | 2026-04-22 (डॉयचे टेलीकॉम रेड टीम) |
| सलाह | GHSA-f55j-vvr9-69xv |
| फिक्स कमिट | 76cfb675fb31acc3ad5595d4380bfff56d2a8697 |
PackageKit सिस्टम पैकेज प्रबंधन के लिए एक D-Bus एब्स्ट्रैक्शन परत है, जो Debian, Ubuntu, Fedora, RHEL, SUSE और Arch Linux पर GNOME-आधारित डेस्कटॉप पर डिफ़ॉल्ट रूप से मौजूद है। चूँकि यह अविशेषाधिकार प्राप्त उपयोगकर्ताओं की ओर से विशेषाधिकार प्राप्त पैकेज संचालन की मध्यस्थता करता है, इसलिए इसके प्राधिकरण प्रवाह में एक दोष का पूरे सिस्टम पर रूट प्रभाव पड़ता है।
pk-transaction.c (पूर्व-1.3.5) ने एक्शन विधि के पुनः-आह्वान पर राज्य गार्ड लागू नहीं किया। एक D-Bus क्लाइंट PK_TRANSACTION_STATE_NEW से बाहर संक्रमण के बाद उसी ट्रांज़ैक्शन ऑब्जेक्ट पर InstallFiles (या अन्य एक्शन विधियों) को कई बार कॉल कर सकता था।
हमलावर (अविशेषाधिकार प्राप्त)
│
├─① CreateTransaction() → PackageKit ट्रांज़ैक्शन ऑब्जेक्ट पथ (tid) लौटाता है
│
├─② InstallFiles(tid, FLAG_SIMULATE=4, [dummy.pkg])
│ PackageKit dummy.pkg के लिए polkit प्राधिकरण जाँच को कतारबद्ध करता है।
│ अभी तक कोई स्थापना नहीं होती — SIMULATE का अर्थ केवल ड्राई-रन है।
│
├─③ InstallFiles(tid, FLAG_NONE=0, [payload.pkg]) ← TOCTOU विंडो
│ प्राधिकरण हल होने से पहले उसी tid पर पुनः-आह्वान करता है।
│ कमजोर संस्करण कतारबद्ध मापदंडों को payload.pkg से अधिलेखित कर देते हैं।
│
└─④ polkit प्राधिकरण प्रदान करता है (उपयोगकर्ता द्वारा अनुमोदित या स्वतः-अधिकृत)
packagekitd payload.pkg को रूट के रूप में स्थापित करता है।
payload postinst/post स्क्रिप्ट: install -m 4755 /bin/bash /tmp/.suid_bash
हमलावर /tmp/.suid_bash -p निष्पादित करता है → रूट शेल।
चरण ② और ③ को उसी कनेक्शन पर गैर-अवरोधक async D-Bus कॉल के रूप में भेजा जाता है और एक ही लेखन में फ्लश किया जाता है। दोनों संदेश packagekitd तक पहुँचते हैं इससे पहले कि वह ② को संसाधित कर सके और राज्य मशीन को आगे बढ़ा सके, जिससे TOCTOU विंडो खुली रहती है। 1.3.5 में फिक्स एक स्पष्ट राज्य जाँच जोड़ता है जो PK_TRANSACTION_STATE_NEW के बाद किसी भी पुनः-आह्वान पर PK_TRANSACTION_ERROR_INVALID_STATE लौटाता है।
फ़ाइल: cve-2026-41651-purpleteam.py
भाषा: Python 3
निर्भरताएँ: python3-gi (GObject introspection / GLib/Gio बाइंडिंग)
निम्नलिखित उद्देश्यों के लिए तैयार परीक्षण प्रणाली पर CVE-2026-41651 की शोषणीयता प्रदर्शित करता है:
| चरण | क्रिया |
|---|---|
| सेटअप | SUID/exec-सक्षम ड्रॉप निर्देशिका का चयन करने के लिए /proc/mounts की जाँच करता है, umask(022) सेट करता है, सभी बिल्ड आर्टिफैक्ट पर स्पष्ट chmod लागू करता है, फिर /tmp में एक डमी और एक पेलोड पैकेज बनाता है |
| शोषण | सिस्टम D-Bus कनेक्शन खोलता है, PackageKit ट्रांज़ैक्शन बनाता है, दो-कॉल रेस को ट्रिगर करता है |
| पेलोड | पैकेज पोस्ट-इंस्टॉल स्क्रिप्ट /bin/bash को <drop_dir>/.suid_bash में मोड 04755, स्वामी root के साथ कॉपी करती है। ड्रॉप निर्देशिका रनटाइम पर हल की जाती है (देखें कठोर वातावरण समर्थन) |
| वृद्धि | SUID बाइनरी के लिए पोल करता है (90 सेकंड टाइमआउट), फिर रूट शेल के लिए -p के साथ execls करता है |
| सफाई | बाहर निकलने पर अस्थायी .deb/.rpm फ़ाइलों को हटाता है (सफलता या विफलता) |
डिफ़ॉल्ट-कठोर प्रणालियाँ शोषण को दो स्वतंत्र बिंदुओं पर रोक सकती हैं। स्क्रिप्ट दोनों को स्वचालित रूप से संभालती है।
027 / 077)प्रक्रिया-विरासत में मिला umask 027 या 077 mkdir() को 750 या 700 निर्देशिकाएँ उत्पन्न करने का कारण बनता है। dpkg-deb और rpmbuild दोनों को पूर्ण बिल्ड ट्री को पार करना होगा — यदि कोई निर्देशिका अपठनीय है तो बिल्ड चुपचाप विफल हो जाता है।
लागू फिक्स: किसी भी फ़ाइल या निर्देशिका के निर्माण से पहले स्टार्टअप पर os.umask(0o022) कॉल किया जाता है। इसके अतिरिक्त, बिल्ड ट्री में प्रत्येक निर्देशिका और फ़ाइल को निर्माण के तुरंत बाद स्पष्ट chmod प्राप्त होता है (निर्देशिकाओं और स्क्रिप्ट के लिए 0o755, डेटा फ़ाइलों के लिए 0o644), इसलिए विरासत में मिले umask की परवाह किए बिना सही अनुमतियाँ सुनिश्चित की जाती हैं।
/tmp पर nosuid / noexec माउंट फ्लैग| फ्लैग | शोषण पर प्रभाव |
|---|---|
nosuid | कर्नेल चुपचाप उस फ़ाइल सिस्टम पर संग्रहीत किसी भी फ़ाइल से SUID बिट हटा देता है — कॉपी किया गया bash कभी रूट नहीं बनता |
noexec | SUID बाइनरी को बिल्कुल भी निष्पादित नहीं किया जा सकता |
लागू फिक्स: स्टार्टअप पर, _find_suid_dir() /proc/mounts पढ़ता है और उम्मीदवार निर्देशिकाओं का प्राथमिकता क्रम में परीक्षण करता है जब तक कि उसे ऐसी फ़ाइल सिस्टम नहीं मिल जाती जिसमें कोई भी फ्लैग सेट न हो। हल किया गया पथ फिर पेलोड की पोस्ट-इंस्टॉल स्क्रिप्ट में बेक किया जाता है और पोलिंग और निष्पादन के लिए उपयोग किया जाता है।
| प्राथमिकता | उम्मीदवार | विशिष्ट कठोरीकरण |
|---|---|---|
| 1 | /var/tmp | शायद ही कभी nosuid/noexec रखता है; रिबूट से बचता है |
| 2 | /dev/shm | tmpfs, आमतौर पर अनुमेय; रिबूट पर साफ़ हो जाता है |
| 3 | /tmp | CIS/STIG प्रणालियों पर अक्सर कठोर किया जाता है |
| 4 | $HOME | अंतिम उपाय; हमेशा उपयोगकर्ता द्वारा लिखने योग्य |
यदि सभी उम्मीदवार अवरुद्ध हैं तो स्क्रिप्ट चुपचाप विफल होने के बजाय स्पष्ट त्रुटि के साथ बाहर निकलती है।