
CVE2021-38297 GO WASM बफर-ओवरफ्लो के शोषण के लिए एक प्रूफ ऑफ कॉन्सेप्ट परिदृश्य
WebAssembly (WASM) अधिकांश आधुनिक वेब ब्राउज़रों में निष्पादन योग्य एक बाइनरी निर्देश प्रारूप के रूप में कार्य करता है। यह C, C++, Rust, और GO जैसी विभिन्न उच्च-स्तरीय भाषाओं के लिए संकलन लक्ष्य के रूप में कार्य करता है, जिससे इन भाषाओं में कोड लिखा जा सकता है और WASM में संकलित किया जा सकता है।
CVE-2021-38297, GO के संकलन और GO-संकलित WASM बाइनरी के लोडिंग में एक महत्वपूर्ण बग को उजागर करता है। यह भेद्यता GO द्वारा प्रदान किए गए JS wasm लोडर (wasm_exec.js) में मौजूद है, जो argv तर्क में अप्रतिबंधित डेटा के साथ WASM बाइनरी लोड करने में सक्षम बनाता है। चूंकि argv WASM के रैखिक मेमोरी में संग्रहीत होता है, दुर्भावनापूर्ण अभिनेता अत्यधिक बड़े argv इनपुट के साथ GO-संकलित WASM प्रोग्राम के रैखिक मेमोरी को अधिलेखित करने के लिए इसका शोषण कर सकते हैं।
यह भेद्यता GO संस्करण 1.17.2 से पहले के संस्करणों में मौजूद थी।
यह प्रूफ ऑफ कॉन्सेप्ट एक सोशल मीडिया एप्लिकेशन, Vuln-Twitter को प्रदर्शित करता है, जो कई उपयोगकर्ताओं को पोस्ट और टिप्पणियां करने की अनुमति देता है। Node.js पर बनाया गया वेब-सर्वर, पोस्ट और टिप्पणी डेटा संग्रहीत करने के लिए SQLite का उपयोग करता है।
फ्रंट-एंड सादे JS के साथ wordprocessor.wasm नामक एक GO WASM मॉड्यूल का उपयोग करता है। यह मॉड्यूल toLeetSpeak जैसी विधियों को उजागर करता है, जो इनपुट स्ट्रिंग्स को "LeetSpeak" में बदलता है (उदाहरण के लिए, "Hello!" "h3ll0!" बन जाता है)।
GO WASM मॉड्यूल पोस्ट और टिप्पणियों को LeetSpeak में प्रस्तुत करने में सहायता करते हैं।

फ्रंट-एंड रेंडरिंग प्रक्रिया के दौरान, जब सर्वर से पोस्ट और टिप्पणियां प्राप्त होती हैं, प्रत्येक टिप्पणी GO WASM मॉड्यूल का उपयोग करके "LeetSpeak" में रेंडर होती है। प्रत्येक पोस्ट की टिप्पणी GO WASM मॉड्यूल लोड करने के बाद argv चर के भाग के रूप में पारित की जाती है।
इसके अलावा, GO मॉड्यूल में एक विधि processSharedVar() मौजूद है, जो पते 0x5000 पर स्थित स्ट्रिंग को पढ़ने और इसे सरलीकृत भाषण में बदलने के लिए डिज़ाइन की गई है (उदाहरण के लिए, "How are you?" "How r u?" बन जाता है)। मूल पोस्ट को स्पष्ट रूप से रैखिक मेमोरी में 0x5000 पर जोड़ा जाता है ताकि इस विधि द्वारा एक्सेस किया जा सके, जिससे पोस्ट की सामग्री बदल जाती है।
ऐसा करने वाले कोड अनुभाग को देखें:

टिप्पणी रेंडर करते समय WASM रैखिक मेमोरी आरेख:

संक्षेप में:
argv चर के माध्यम से टिप्पणियों को संसाधित करता है और मेमोरी पते 0x5000 पर पोस्ट करता है।toLeetSpeak और processSharedVar जैसे फ़ंक्शन का उपयोग किया जाता है।argv में आकार जांच की कमी को ध्यान में रखते हुए, CVE-2021-38297 के आधार पर, एक संभावित खतरा उत्पन्न होता है। यदि कोई दुर्भावनापूर्ण उपयोगकर्ता किसी ऐसी पोस्ट पर अत्यधिक बड़ी टिप्पणी करता है जो उनकी नहीं है, तो यह टिप्पणी रेंडरिंग के दौरान argv के माध्यम से पारित हो जाएगी। चूंकि कोई आकार सीमा नहीं है, पते 0x5000 (मूल पोस्ट का प्रतिनिधित्व करने वाली) पर सामग्री अधिलेखित होने के लिए संवेदनशील हो जाती है।
इस दोष का शोषण करके, एक दुर्भावनापूर्ण उपयोगकर्ता प्रभावी रूप से मूल पोस्ट सामग्री को बदल देता है, जो एक Stored XSS हमले के समान है। इसके बाद, जब अन्य लोग पेज देखते हैं, तो बदली गई सामग्री प्रदर्शित होती है, जो सभी के रेंडरिंग पर लागू साझा फ्रंट-एंड लॉजिक द्वारा कायम रहती है, जिसके परिणामस्वरूप अधिलेखित पोस्ट सभी को दिखाई देती है।

नोट: इसे पुन: प्रस्तुत करने के लिए आपको स्थानीय रूप से go संस्करण go1.17.1 स्थापित करना होगा, जो इस परिदृश्य में उपयोग किया जाने वाला असुरक्षित संस्करण है। आप विशिष्ट go संस्करण स्थापित करने के तरीके के बारे में आधिकारिक go दस्तावेज़ देख सकते हैं।
अब ऊपर दिए गए परिदृश्य को पुन: प्रस्तुत करने का प्रयास करते हैं:
git clone [email protected]:gkrishnan724/CVE-2021-38297.git && cd vuln-twitternpm install चलाएंnpm run resetDB चलाएं जो डेटाबेस को कुछ पोस्ट और टिप्पणियों के साथ प्रारंभ करेगा।npm run dev चलाएं जो स्थानीय सर्वर शुरू करेगा, ब्राउज़र में localhost:3000 खोलें और आपको एक लॉगिन पेज दिखाई देना चाहिए।अब, एक दुर्भावनापूर्ण खाते से लॉगिन करें, क्रेडेंशियल उपयोगकर्ता नाम: I_CANT_HACK, पासवर्ड: hacker का उपयोग करें, एक बार लॉग इन करने के बाद, आपको कुछ पोस्ट के साथ फ़ीड देखने में सक्षम होना चाहिए।
यह पोस्ट काफी दिलचस्प लगती है:
Amazon: ready 4 black friday? https://www.amazon.com/blackfriday
क्या होगा यदि उपरोक्त तकनीक का उपयोग करके, हम Amazon.com से पोस्ट को अधिलेखित करके एक दुर्भावनापूर्ण लिंक की ओर इंगित कर सकें?
exploit.txt फ़ाइल देखें, इसमें वह टिप्पणी है जो "A" के पैडिंग से भरी हुई है ताकि हम पते 0x5000 तक सब कुछ अधिलेखित कर दें, अंत में आप टेक्स्ट ready for black friday? https://evil.com/blackfriday देख सकते हैं। यदि हम इस टेक्स्ट को कॉपी करें और उपरोक्त पोस्ट पर टिप्पणी करें, तो हम मूल पोस्ट को उपरोक्त टेक्स्ट से अधिलेखित करने में सक्षम होना चाहिए।
इसे स्वयं आज़माएं और देखें :)

इस एप्लिकेशन में, मैंने एक पैच स्क्रिप्ट भी प्रदान की है। जो go के नए संस्करण का उपयोग करती है:
npm run patchServer चलाएंयह go फ़ाइल को नए संस्करण के साथ पुनर्संकलित करेगा और पैच संस्करण के साथ सर्वर शुरू करेगा
अब आप देखेंगे कि पोस्ट अधिलेखित नहीं हो रही है और यदि आप कंसोल देखते हैं, तो हमें एक त्रुटि Argument length too long दिखाई देती है।

हमने एक ऐसे परिदृश्य का प्रदर्शन किया है जहां रैखिक मेमोरी पर WASM बफर ओवरफ्लो का लाभ उठाकर हम एक stored XSS हमला करने में सक्षम हुए। हालांकि, इस शोषण की विशिष्टता पर ध्यान देना आवश्यक है: इसके लिए हमें रैखिक मेमोरी में एक हार्डकोडेड पते पर एक टेक्स्ट में हेरफेर करने की आवश्यकता थी। व्यावहारिक वेब अनुप्रयोगों में, विशिष्टता के इस स्तर के कारण ऐसी भेद्यताएं खोजना अत्यंत चुनौतीपूर्ण हो सकता है। इसके अलावा, सिस्टम क्रैश किए बिना रैखिक मेमोरी में मनमाना डेटा अधिलेखित करना जटिल है, विशेष रूप से GO के आंतरिक मॉड्यूल और डेटा से निपटने के दौरान, मुख्य रूप से GO के मेमोरी लेआउट पर व्यापक दस्तावेज़ीकरण की कमी के कारण।
हमारी समझ के आधार पर हमें लगता है कि GO रैखिक मेमोरी लेआउट नीचे दर्शाया गया है:

जबकि यह शोषण वेब विकास में, विशेष रूप से WASM के भीतर, दिलचस्प हमले के वेक्टर प्रस्तुत करता है, यह प्रोग्रामिंग भाषाओं से जुड़े अंतर्निहित सुरक्षा जोखिम भी प्रस्तुत करता है। उदाहरण के लिए, एक ऐसे परिदृश्य पर विचार करें जहां एक C प्रोग्राम WASM में संकलित किया गया है। यदि मूल C प्रोग्राम में ओवरफ्लो या भेद्यताएं हैं, तो ये जोखिम WASM वातावरण में स्थानांतरित हो जाते हैं, इसे समान भेद्यताओं और खतरों के लिए उजागर करते हैं।
हम कार्नेगी मेलॉन विश्वविद्यालय के छात्र हैं और हमने अपनी एक कक्षा (18-739D Hacking101) में इस CVE प्रूफ-ऑफ-कॉन्सेप्ट को प्रस्तुत किया था। आप हमारी स्लाइड-डेक यहां देख सकते हैं: GOWasm.pptx