
ChakraCore शोषण तकनीकें
CVE-2016-7190 [0] ChakraCore के Array.map() फ़ंक्शन में एक हीप ओवरफ़्लो है जो आसन्न मेमोरी को अधिलेखित करने की अनुमति देता है। मनमाना रीड-राइट एक्सेस प्राप्त करने का मुख्य विचार पहले क्रमिक JavaScript पूर्णांक एरेज़ आवंटित करना है, और फिर एक एरे के आकार में हेरफेर करने के लिए ओवरफ़्लो का शोषण करना है। फिर, हम इस एरे का उपयोग Uint8Array के बेस एड्रेस को उस पते में बदलने के लिए करते हैं जिसे हम पढ़ना/लिखना चाहते हैं। इस अतिरिक्त कदम का कारण यह है कि ओवरफ़्लो ओवरफ़्लो हुए पूर्णांक एरे के आकार के 2x तक सीमित है।
यह भेद्यता विभिन्न शोषण रणनीतियों के परीक्षण के लिए बहुत उपयुक्त है क्योंकि इसे ChakraCore के वर्तमान संस्करणों में आसानी से पुनः प्रस्तुत किया जा सकता है (undo-cve-2016-7190.patch देखें)।
इस उदाहरण में, हम एक Uint8Array C++ ऑब्जेक्ट के vtable पॉइंटर को एक नियंत्रित मेमोरी पते पर अधिलेखित करके और Uint8Array ऑब्जेक्ट के एक फ़ंक्शन को लागू करके नियंत्रण प्रवाह का अपहरण करते हैं जिसके परिणामस्वरूप एक वर्चुअल फ़ंक्शन का आह्वान होता है।
कंट्रोल-फ़्लो इंटीग्रिटी (CFI) एक रक्षा तकनीक है जो नियंत्रण-प्रवाह अपहरण हमलों को शमित करने के लिए है। CFI का सामान्य विचार संकलन समय के दौरान एक एप्लिकेशन का नियंत्रण-प्रवाह ग्राफ़ (CFG) की गणना करना है, और फिर एप्लिकेशन को रन-टाइम जाँच के साथ उपकरणित करना है ताकि यह सुनिश्चित हो सके कि नियंत्रण प्रवाह रन टाइम के दौरान स्थिर रूप से गणना किए गए CFG से विचलित न हो। हालाँकि, यदि कोई एप्लिकेशन, जैसे वेब-ब्राउज़र, डायनेमिक कोड जनरेशन का समर्थन करता है, तो CFG को रन टाइम के दौरान विस्तार योग्य होना चाहिए। यह कई चुनौतियाँ प्रस्तुत करता है:
जिस समय हमने अपना शोध किया, हमने अंतिम चुनौती पर ध्यान केंद्रित किया। मुख्य विचार जस्ट-इन-टाइम (JIT) कंपाइलर के इनपुट (डेटा) में हेरफेर करना है। परिणामस्वरूप, JIT कंपाइलर दुर्भावनापूर्ण कोड उत्पन्न करेगा जो तब वर्तमान संदर्भ में एकीकृत हो जाएगा—और CFI के साथ भी सख्त किया जा सकता है। हमारे शोध के समानांतर, theori [4] ने दिखाया कि JIT कंपाइलर के आउटपुट में हेरफेर करके CFI को कैसे बायपास किया जाए। इस हमले को चेकसम के माध्यम से आउटपुट की अखंडता को सत्यापित करके शमित किया जाता है। यह हमारे हमले को नहीं रोक सकता क्योंकि हम JIT कंपाइलर के इनपुट में हेरफेर करते हैं। हालाँकि, JIT संकलन को किसी अन्य प्रक्रिया (उर्फ आर्बिट्रेरी कोड गार्ड [3]) को आउटसोर्स करके दोनों हमले शमित हो जाते हैं।
हम प्रदर्शित करते हैं कि एक हमलावर JIT कंपाइलर के विरुद्ध डेटा-केवल हमले का शोषण करके मनमाना नेटिव कोड उत्पन्न कर सकता है। विशेष रूप से, हम हमलावर-नियंत्रित निर्देशों को इंजेक्ट करने के लिए JIT कंपाइलर के मध्यवर्ती प्रतिनिधित्व (IR) को संशोधित करते हैं। जब JIT कंपाइलर तब संशोधित IR के आधार पर नेटिव कोड उत्पन्न करता है तो वह हमलावर-नियंत्रित नेटिव कोड उत्पन्न करेगा।
मूल रूप से शोध किए जाने के समय और अब के बीच, ChakraCore का IR बदल दिया गया था। हमने हमले को पोर्ट करने का प्रयास नहीं किया, इसलिए, इस हमले के साथ खेलने के लिए, कृपया निम्नलिखित बाइनरी का उपयोग करें।
ACG [3] के विश्लेषण के दौरान हमने अन्य [1,2] के अलावा देखा कि वैश्विक केवल-पढ़ने योग्य डेटा, जो .mrdata अनुभाग में संग्रहीत है, को गतिशील रूप से उत्पन्न कोड को एकीकृत करने के लिए समायोजित किया जाना चाहिए। यह LdrProtectMrdata() फ़ंक्शन के माध्यम से किया जाता है जो इसे थ्रेड-सुरक्षित बनाने के लिए एक लॉक का उपयोग करता है। हालाँकि, .mrdata अनुभाग को लॉक प्राप्त करने से पहले पहले लिखने योग्य के रूप में पुनः मैप किया जाता है। दिलचस्प बात यह है कि .mrdata अनुभाग में .mrdata अनुभाग का बेस एड्रेस और आकार होता है जिसका उपयोग बाद में इस अनुभाग को फिर से केवल पढ़ने योग्य के रूप में पुनः मैप करने के लिए किया जाता है।
एक हमलावर इसका शोषण करके एक हमला प्रिमिटिव बना सकता है जो केवल-पढ़ने योग्य मेमोरी को लिखने योग्य के रूप में पुनः मैप करने की अनुमति देता है। इसलिए, हमलावर निम्नलिखित चरणों को निष्पादित करता है:
इस हमले का परिणाम यह है कि पहले से विश्वसनीय डेटा, यानी डेटा जो केवल पढ़ने योग्य के रूप में मैप किया गया है, अविश्वसनीय हो जाता है। हमारे प्रूफ-ऑफ-कॉन्सेप्ट में, हम CFGuard के सत्यापन फ़ंक्शन के पॉइंटर को बदलकर कंट्रोल-फ़्लो गार्ड (CFGuard) को बायपास करने के लिए इस प्रिमिटिव का शोषण करते हैं जो _guard_dispatch_icall_fptr में सहेजा गया है। प्रभाव को डीबगर संलग्न करके और bypass_cfguard चर को बदलकर देखा जा सकता है।
[0] https://bugs.chromium.org/p/project-zero/issues/detail?id=923
[1] http://alex-ionescu.com/publications/euskalhack/euskalhack2017-cfg.pdf
[2] https://sites.google.com/site/bingsunsec/dataonlyattack
[3] https://blogs.windows.com/msedgedev/2017/02/23/mitigating-arbitrary-native-code-execution/
[4] http://theori.io/research/chakra-jit-cfg-bypass