flawopen.com/Teardowns/cve-2021-3156-sudo-baron-samedit

● CVE-2021-3156 · CVSS 9.8 · अति गंभीर
सुरक्षा अनुसंधान · FlawOpen

CVE-2021-3156: Sudo Baron Samedit हीप बफर ओवरफ्लो प्रिविलेज एस्केलेशन

Baron Samedit (CVE-2021-3156) का तकनीकी विश्लेषण: sudo के कमांड-लाइन आर्ग्युमेंट्स में बैकस्लैश की गलती ने कैसे किसी भी सामान्य यूज़र को Root एक्सेस दे दिया।

💡 आसान भाषा में (ELI5)

एक फॉर्म-प्रोसेसिंग क्लर्क की कल्पना करें जिसका एक नियम है: एक बैकस्लैश का मतलब है 'अगले अक्षर को शाब्दिक रूप से लें'। कोई एकल बैकस्लैश पर समाप्त होने वाला फॉर्म देता है। क्लर्क पन्ने के किनारे से आगे पढ़ना जारी रखता है और अगले फॉर्म पर सुरक्षा अनुमतियों को अधिलेखित (overwrite) कर देता है।

इस पेज के मुख्य शब्द

setuid बाइनरी
एक निष्पादन योग्य प्रोग्राम जो कॉलर के बजाय मालिक (root) के विशेषाधिकारों के साथ चलता है।
हीप बफर ओवरफ्लो
हीप मेमोरी आवंटन की सीमाओं से परे डेटा लिखना, जिससे पड़ोसी संरचनाएं दूषित हो जाती हैं।
स्थानीय विशेषाधिकार वृद्धि
एक अप्रतिबंधित सामान्य उपयोगकर्ता से पूर्ण root नियंत्रण प्राप्त करना।

मूल कारण विश्लेषण (Root Cause)

मूल कारण ओपन सोर्स सिस्टम में अनसत्यापित सीमा पैरामीटर हैं, जिससे स्थिति का असंतुलन और सुरक्षा नियंत्रणों को बायपास किया जा सकता है।

हमले का चरण-दर-चरण प्रवाह

Step 1

Trailing Backslash Injection

Unprivileged user executes 'sudoedit -s \', bypassing normal argument escaping flags.

Step 2

Unterminated Buffer Traversal

The unescape pointer jumps past the null byte delimiter into uninitialized heap memory.

Step 3

Heap Corruption of Service Structures

The heap overflow overwrites the sudo_nss service structure in glibc.

Step 4

Root Privilege Escalation

Sudo loads an attacker-controlled shared library (/tmp/libnss_x.so.2) as root, granting instant root shell access.

सोर्स कोड: कमज़ोर बनाम सुरक्षित कार्यान्वयन

✕ कमज़ोर कार्यान्वयन
/* VULNERABLE: Unescape loop skips past string termination null byte */
for (to = user_args, from = NewArgv[0]; *from != '\0'; from++) {
    if (from[0] == '\\' && !isspace((unsigned char)from[1]))
        from++; /* BUG: If from[1] == '\0', loop skips past null terminator! */
    *to++ = *from;
}
*to = '\0'; /* Corrupts adjacent heap chunks with root auth structures */
✓ सुरक्षित और सुदृढ़ फ़िक्स
/* FIXED: Explicitly check that from[1] is neither space nor the null byte */
for (to = user_args, from = NewArgv[0]; *from != '\0'; from++) {
    if (from[0] == '\\' && from[1] != '\0' && !isspace((unsigned char)from[1]))
        from++;
    *to++ = *from;
}
*to = '\0';

इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट

References