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

विषय-सूची
- भेद्यता अवलोकन
- तकनीकी विश्लेषण
- परीक्षण स्क्रिप्ट विवरण
- समझौते के संकेतक
- पहचान तर्क
- प्रभावित सिस्टम और संस्करण
- उपचार
- संदर्भ
भेद्यता अवलोकन
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 की शोषणीयता प्रदर्शित करता है:
- यह सत्यापित करना कि स्थापित PackageKit संस्करण कमजोर है या नहीं
- SIEM/EDR ट्यूनिंग के लिए यथार्थवादी IOC टेलीमेट्री उत्पन्न करना
- पैचिंग से पहले और बाद में पहचान कवरेज का परीक्षण करना
व्यवहार
कठोर वातावरण समर्थन
डिफ़ॉल्ट-कठोर प्रणालियाँ शोषण को दो स्वतंत्र बिंदुओं पर रोक सकती हैं। स्क्रिप्ट दोनों को स्वचालित रूप से संभालती है।
1. प्रतिबंधात्मक umask (027 / 077)
प्रक्रिया-विरासत में मिला umask 027 या 077 mkdir() को 750 या 700 निर्देशिकाएँ उत्पन्न करने का कारण बनता है। dpkg-deb और rpmbuild दोनों को पूर्ण बिल्ड ट्री को पार करना होगा — यदि कोई निर्देशिका अपठनीय है तो बिल्ड चुपचाप विफल हो जाता है।
लागू फिक्स: किसी भी फ़ाइल या निर्देशिका के निर्माण से पहले स्टार्टअप पर os.umask(0o022) कॉल किया जाता है। इसके अतिरिक्त, बिल्ड ट्री में प्रत्येक निर्देशिका और फ़ाइल को निर्माण के तुरंत बाद स्पष्ट chmod प्राप्त होता है (निर्देशिकाओं और स्क्रिप्ट के लिए 0o755, डेटा फ़ाइलों के लिए 0o644), इसलिए विरासत में मिले umask की परवाह किए बिना सही अनुमतियाँ सुनिश्चित की जाती हैं।
2. /tmp पर nosuid / noexec माउंट फ्लैग
| फ्लैग | शोषण पर प्रभाव |
|---|
nosuid | कर्नेल चुपचाप उस फ़ाइल सिस्टम पर संग्रहीत किसी भी फ़ाइल से SUID बिट हटा देता है — कॉपी किया गया bash कभी रूट नहीं बनता |
noexec | SUID बाइनरी को बिल्कुल भी निष्पादित नहीं किया जा सकता |
लागू फिक्स: स्टार्टअप पर, _find_suid_dir() /proc/mounts पढ़ता है और उम्मीदवार निर्देशिकाओं का प्राथमिकता क्रम में परीक्षण करता है जब तक कि उसे ऐसी फ़ाइल सिस्टम नहीं मिल जाती जिसमें कोई भी फ्लैग सेट न हो। हल किया गया पथ फिर पेलोड की पोस्ट-इंस्टॉल स्क्रिप्ट में बेक किया जाता है और पोलिंग और निष्पादन के लिए उपयोग किया जाता है।
यदि सभी उम्मीदवार अवरुद्ध हैं तो स्क्रिप्ट चुपचाप विफल होने के बजाय स्पष्ट त्रुटि के साथ बाहर निकलती है।
संगतता
| वितरण परिवार | पैकेज टूल | परीक्षण किया गया |
|---|
| Debian / Ubuntu | dpkg-deb | ✓ |
| RHEL / Fedora |
समझौते के संकेतक
IOC सामान्य/इन्फ्रास्ट्रक्चर-स्तर से लेकर स्क्रिप्ट-विशिष्ट आर्टिफैक्ट तक सूचीबद्ध हैं। सामान्य संकेतकों पर निर्मित पहचान इस CVE को पकड़ लेंगी चाहे किसी भी PoC वैरिएंट का उपयोग किया जाए।
फ़ाइल सिस्टम
प्रक्रिया और निष्पादन
D-Bus गतिविधि
ऑडिट लॉग पैटर्न
इससे सक्षम करें: auditctl -a always,exit -F arch=b64 -S all -F path=/usr/bin/packagekitd
या /etc/audit/rules.d/ में नीचे दिए गए नियमों का उपयोग करें:
# सभी उम्मीदवार ड्रॉप निर्देशिकाओं में SUID फ़ाइल निर्माण का पता लगाएँ
-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
# गैर-रूट द्वारा dpkg-deb / rpmbuild का पता लगाएँ
-w /usr/bin/dpkg-deb -p x -k pkg_build_nonroot
-w /usr/bin/rpmbuild -p x -k pkg_build_nonroot
# किसी भी उम्मीदवार ड्रॉप निर्देशिका से SUID bash निष्पादन का पता लगाएँ
-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
पैकेज प्रबंधक आर्टिफैक्ट
विशेषाधिकार वृद्धि आर्टिफैक्ट
पहचान तर्क
SIEM स्यूडो-नियम (सामान्य — सभी CVE-2026-41651 वैरिएंट को कवर करता है)
(
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 व्यवहारिक श्रृंखला
packagekitd
└─ sh / bash (cwd या arg /tmp, /var/tmp, /dev/shm, या $HOME से मेल खाता है)
└─ install / cp / chmod (लक्ष्य में SUID + स्वामी root है)
पूरी श्रृंखला को फ्लैग करें। अकेले कोई भी व्यक्तिगत चरण सौम्य हो सकता है; packagekitd के माध्यम से SUID-सेटिंग कमांड तक पैरेंट-चाइल्ड संबंध उच्च-निष्ठा वाला है चाहे किसी भी ड्रॉप निर्देशिका का चयन किया गया हो। सभी चार उम्मीदवारों को कवर करने के लिए पथ-आधारित नियमों को व्यापक बनाएँ।
प्रभावित सिस्टम और संस्करण
स्थापित संस्करण जाँचें: pkcon backend-details या packagekit --version
रिपोर्ट किया गया संस्करण ≤ 1.3.4 होने पर कमजोर।
उपचार
प्राथमिक: PackageKit को 1.3.5 में अपग्रेड करें या विक्रेता-विशिष्ट बैकपोर्ट लागू करें।
# Debian / Ubuntu
apt update && apt install --only-upgrade packagekit
# Fedora / RHEL
dnf upgrade packagekit
# SUSE
zypper update packagekit
शमन (यदि पैचिंग तुरंत संभव नहीं है):
संदर्भ
निर्मित: 2026-04-24 | अद्यतन: 2026-04-25 | पर्पल टीम मूल्यांकन | केवल आंतरिक उपयोग