
CVE-2021-3156 (Baron Samedit) Report and Research
लेखक: IJ Baig
तिथि: 7 जुलाई, 2026
1.8.2 से 1.8.31p2, और स्थिर संस्करण 1.9.0 से 1.9.5p1।1.9.5p1इस भेद्यता का सुरक्षित रूप से विश्लेषण करने के लिए, भेद्य Sudo संस्करण को एक पृथक, गैर-उत्पादन वातावरण में संकलित (compile) किया गया।

Sudo 1.9.5p1 का स्रोत कोड डाउनलोड करके मानक make उपयोगिताओं का उपयोग करके स्थानीय रूप से संकलित किया गया। इसे स्थानीय निर्देशिका से चलाने का ध्यान रखा गया ताकि यह होस्ट सिस्टम के मूल, पैच किए गए sudo बाइनरी को अधिलेखित (overwrite) न करे।

बिल्ड पुष्टि: संकलन के बाद, यह सत्यापित करने के लिए कि सही भेद्य संस्करण बना है, कस्टम बाइनरी को निष्पादित किया गया।


plugins/sudoers/sudoers.cset_cmnd() (संस्करण 1.9.5p1 में लगभग पंक्ति 864)
कल्पना कीजिए कि आपके पास एक सहायक है जिसका काम शब्दों की सूची से एस्केप वर्णों (बैकस्लैश) को हटाना है, इससे पहले कि उन्हें नव-आवंटित भंडारण बॉक्स (हीप बफर) में रखा जाए। सहायक आँख बंद करके यह मान लेता है कि हर बैकस्लैश के बाद हमेशा एक मान्य वर्ण आता है, इसलिए जब भी उसे बैकस्लैश दिखता है, वह उसे छोड़ देता है और अगला वर्ण कॉपी कर लेता है।
हालाँकि, sudoedit -s चलाते समय प्रोग्राम द्वारा तर्कों (arguments) को संभालने के तरीके में एक त्रुटि मौजूद है। यह उपयोगकर्ता को एक ऐसा शब्द डालने की अनुमति देता है जो ठीक एक बैकस्लैश (\) के साथ समाप्त होता है, जिसके तुरंत बाद अदृश्य शब्द-अंत चिह्नक (एक नल टर्मिनेटर, \0) आता है।
जब सहायक का कोड इस अंतिम बैकस्लैश तक पहुँचता है, तो वह उसे छोड़ देता है और अगले वर्ण—नल टर्मिनेटर—को देखता है। रुकने के बजाय, if स्टेटमेंट का तर्क सहायक को नल टर्मिनेटर को भी छोड़ने के लिए बाध्य करता है। लूप चलता रहता है, और जो भी मनमानी, सीमा-से-बाहर (out-of-bounds) मेमोरी आगे आती है, उसे भंडारण बॉक्स में कॉपी करता रहता है। इच्छित शब्द लंबाई से परे यह निरंतर कॉपी करना निर्धारित बफर को ओवरफ्लो कर देता है, जिससे गंभीर हीप-आधारित बफर ओवरफ्लो उत्पन्न होता है।
भेद्य कोड स्निपेट:
/* Unescape characters, skipping over backslashes */
for (to = user_args, av = NewArgv + 1; (from = *av); av++) {
while (*from) {
// VULNERABILITY: If from[0] is '\' and from[1] is '\0',
// the loop evaluates to true, increments 'from', skipping the null terminator.
if (from[0] == '\\' && !isspace((unsigned char)from[1]))
from++;
*to++ = *from++;
}
*to++ = ' ';
}
*--to = '\0';
Sudo डेवलपर्स ने संस्करण 1.9.5p2 में एक सख्त बाउंड्स जाँच जोड़कर इस तर्क त्रुटि को ठीक किया। कोड अब स्पष्ट रूप से सुनिश्चित करता है कि बैकस्लैश के बाद आने वाला वर्ण नल टर्मिनेटर नहीं है, इससे पहले कि उसे अनएस्केप करने का प्रयास किया जाए।
पैच डिफ:
- if (from[0] == '\\' && !isspace((unsigned char)from[1]))
+ if (from[0] == '\\' && from[1] != '\0' && !isspace((unsigned char)from[1]))
यह मूल कारण को क्यों ठीक करता है:
from[1] != '\0' को जोड़ने से सीमा-से-बाहर रीड (out-of-bounds read) तुरंत रुक जाती है। अब, यदि कोड को स्ट्रिंग के बिल्कुल अंत में एक अंतिम बैकस्लैश मिलता है (जिसका अर्थ है कि from[1] नल टर्मिनेटर है), तो if स्टेटमेंट गलत (false) मूल्यांकित होता है। पॉइंटर को समय से पहले नहीं बढ़ाया जाता, नल टर्मिनेटर को स्ट्रिंग के अंत के रूप में सही ढंग से संसाधित किया जाता है, और लूप हीप को ओवरफ्लो किए बिना सुरक्षित रूप से समाप्त हो जाता है।
इस पुनरुत्पादन के लिए, सुरक्षा शोधकर्ता Worawit द्वारा विकसित व्यापक रूप से मान्यता प्राप्त Python एक्सप्लॉइट (विशेष रूप से exploit_nss.py संस्करण) का उपयोग किया गया।
PoC निष्पादित करने से पहले, इसकी कार्यप्रणाली को समझना महत्वपूर्ण है। स्क्रिप्ट केवल प्रोग्राम को क्रैश नहीं करती; यह कोड निष्पादन प्राप्त करने के लिए मेमोरी का अत्यधिक सटीक हेरफेर करती है।
PoC के संचालन का चरण-दर-चरण विवरण यहाँ दिया गया है:
.so) में गतिशील रूप से संकलित करती है। यह पेलोड /bin/sh को रूट के रूप में निष्पादित करने के लिए डिज़ाइन किया गया है।LC_ALL, LANG, और TZ) सेट करती है। चूँकि Sudo स्टार्टअप पर पर्यावरण चरों को हीप पर लोड करता है, स्क्रिप्ट हीप को एक अनुमानित लेआउट में व्यवस्थित करने के लिए आवश्यक सटीक आकारों की गणना करती है।sudoedit -s निष्पादित करती है और एक कमांड-लाइन तर्क पास करती है जो एकल बैकस्लैश में समाप्त होता है। यह अनुभाग 2 में चर्चित ऑफ-बाय-वन भेद्यता को ट्रिगर करता है, जिससे सीमा-से-बाहर राइट (out-of-bounds write) उत्पन्न होता है।service_user स्ट्रक्चर। इस स्ट्रक्चर का उपयोग Name Service Switch (NSS) द्वारा सिस्टम जानकारी देखने के लिए किया जाता है।service_user स्ट्रक्चर को दूषित करके चरण 1 में संकलित दुर्भावनापूर्ण .so लाइब्रेरी की ओर इंगित किया जाता है। जब Sudo उपयोगकर्ता विशेषाधिकारों को देखने का प्रयास करता है, तो वह आँख बंद करके हमलावर की लाइब्रेरी को लोड और निष्पादित कर लेता है, जिससे रूट शेल प्राप्त हो जाता है।सबसे पहले, यह सिद्ध करने के लिए कि भेद्यता मौजूद है, बिना इसे हथियार बनाए एक बुनियादी क्रैश परीक्षण किया गया।

इसके बाद, भेद्य बाइनरी के विरुद्ध पूर्ण Worawit exploit_nss.py स्क्रिप्ट निष्पादित की गई।

आधिकारिक फिक्स को सत्यापित करने के लिए, ठीक वही PoC ट्रिगर पैच किए गए Sudo बाइनरी के विरुद्ध निष्पादित किया गया।
sudoedit -s '\' 2>&1 | grep -q "sudoedit:" && echo "Vulnerable" || echo "Not vulnerable"

Sudo, हमारे सर्वरों में उपयोग किया जाने वाला एक मानक प्रशासनिक प्रोग्राम, बैकस्लैश युक्त टेक्स्ट इनपुट को संसाधित करने के तरीके में एक गंभीर त्रुटि रखता है। सावधानीपूर्वक एक दोषपूर्ण कमांड भेजकर, बुनियादी उपयोगकर्ता पहुँच वाला हमलावर सिस्टम को उसके निर्धारित मेमोरी क्षेत्र के बाहर डेटा लिखने के लिए धोखा दे सकता है। यह गलती उन्हें सुरक्षा नियंत्रणों को पूरी तरह से दरकिनार करने और बिना कोई पासवर्ड जाने मशीन पर पूर्ण, अनधिकृत प्रशासनिक नियंत्रण प्राप्त करने की अनुमति देती है।
चुनौतियाँ: प्राथमिक चुनौतियों में से एक हीप हेरफेर की नाजुकता थी। विशिष्ट OS संस्करणों को लक्षित करने वाले एक्सप्लॉइट पेलोड अक्सर अन्य पर विफल हो जाते हैं क्योंकि अंतर्निहित मानक C लाइब्रेरी (glibc) मेमोरी चंक्स को अलग तरीके से प्रबंधित करती है। इस भेद्यता को सफलतापूर्वक हथियार बनाने के लिए लक्ष्य वातावरण के लिए विशिष्ट मेमोरी संरेखण और पर्यावरण चर लेआउट (हीप फेंग शुई) की सटीक समझ आवश्यक थी।
सीखे गए सबक: रक्षात्मक और सुरक्षा संचालन के दृष्टिकोण से, इस डीप-डाइव ने कई महत्वपूर्ण अवधारणाओं को और मजबूत किया:
sudoedit -s कमांड के लिए प्रोसेस निष्पादन टेलीमेट्री की निगरानी करने से SOC टीम को पूरे इंफ्रास्ट्रक्चर में पैच पूरी तरह से तैनात होने से पहले ही एक्सप्लॉइटेशन प्रयासों का पता लगाने में मदद मिल सकती है।समानांतर CVE: CVE-2019-14287 (Sudo सुरक्षा बायपास)
ठीक उसी Sudo कोडबेस में एक और प्रमुख भेद्यता समान मूल-कारण पैटर्न साझा करती है: उपयोगकर्ता इनपुट का अनुचित पार्सिंग और सत्यापन। CVE-2019-14287 में, Sudo द्वारा उपयोगकर्ता ID (UID) को पार्स करने के तरीके में एक तर्क दोष ने हमलावर को उपयोगकर्ता ID -1 या 4294967295 निर्दिष्ट करके रूट के रूप में कमांड निष्पादित करने की अनुमति दी।
समानता: जहाँ Baron Samedit (CVE-2021-3156) एक मेमोरी भ्रष्टाचार दोष है और CVE-2019-14287 एक प्राधिकरण बायपास है, दोनों मामलों में मूल कारण प्रारंभिक तर्क पार्सिंग तर्क में विफलता है। दोनों भेद्यताएँ Sudo द्वारा अपने मुख्य विशेषाधिकार प्राप्त कार्यों को निष्पादित करने से पहले एज-केस कमांड-लाइन तर्कों (अंतिम बैकस्लैश बनाम अप्रत्याशित पूर्णांक रैप) पर गलत तरीके से भरोसा करने और उन्हें गलत तरीके से संभालने से उत्पन्न होती हैं।
सुरक्षा एवं नैतिकता घोषणा: इस रिपोर्ट में प्रदर्शित सभी एक्सप्लॉइटेशन और परीक्षण पूरी तरह से एक पृथक, अधिकृत स्थानीय वर्चुअल मशीन के भीतर किए गए थे। इस अभ्यास के दौरान किसी भी उत्पादन प्रणाली या अनधिकृत नेटवर्क को लक्षित नहीं किया गया और न ही उनके साथ कोई अंतःक्रिया की गई।