2015-03-03 7 views
11

"heap spraying" विकिपीडिया लेख से पता चलता है कि कई जावास्क्रिप्ट शोषण में स्क्रिप्ट के निष्पादन योग्य कोड या डेटा स्पेस मेमोरी में कहीं भी शेलकोड की स्थिति शामिल होती है और उसके बाद दुभाषिया वहां कूदता है और इसे निष्पादित करता है। जो मुझे समझ में नहीं आता है, दुभाषिया के पूरे ढेर को "डेटा" के रूप में क्यों चिह्नित नहीं किया जा सकता है ताकि दुभाषिया को डीईपी द्वारा शेलकोड निष्पादित करने से रोका जा सके? इस बीच जावास्क्रिप्ट व्युत्पन्न बाइटकोड का निष्पादन वर्चुअल मशीन द्वारा किया जाएगा जो इसे दुभाषिया से संबंधित स्मृति को संशोधित करने की अनुमति नहीं देगा (यह वी 8 पर काम नहीं करेगा जो मशीन कोड निष्पादित करने लगता है, लेकिन शायद फ़ायरफ़ॉक्स पर काम करेगा जो किसी प्रकार का उपयोग करता है बाइटकोड का)।क्यों जावास्क्रिप्ट शेलकोड शोषण "डेटा निष्पादन रोकथाम" के माध्यम से तय नहीं किया जा सकता है?

मुझे लगता है कि उपर्युक्त आवाज़ तुच्छ और शायद कुछ ऐसा ही किया जा रहा है। इसलिए, मैं समझने की कोशिश कर रहा हूं कि तर्क में दोष कहां है, या मौजूदा दुभाषिया कार्यान्वयन में दोष है। जैसे क्या जावास्क्रिप्ट स्मृति के लिए पूछताछ करते समय दुभाषिया अपने आंतरिक आवंटन को लागू करने के बजाय सिस्टम की स्मृति आवंटन पर भरोसा करता है, इसलिए दुभाषिया और जावास्क्रिप्ट से संबंधित स्मृति को अलग करने के लिए इसे अनावश्यक रूप से कठिन बनाते हैं? या ऐसा क्यों है कि डीईपी आधारित विधियां शेलकोड को पूरी तरह से खत्म नहीं कर सकती हैं?

+2

सभी आधुनिक जावास्क्रिप्ट इंजन ही नहीं, वी 8, का उपयोग JIT मशीन कोड [विकिपीडिया देखें] के संकलन (http://en.wikipedia.org/wiki/List_of_ECMAScript_engines): Chacra (आईई), Spidermonkey (एफ इयरफ़ॉक्स), जावास्क्रिप्टकोर (सफारी), वी 8 (क्रोम) इत्यादि – OlliM

+0

@ ओलीआईएम, क्या इसका मतलब यह है कि अगर मान लें कि स्पाइडरमोन्की वीएम पर बाइटकोड निष्पादित करने के लिए वापस चला जाता है और मैंने वर्णित छोटी स्मृति प्रतिबंध नीति का उपयोग किया है, तो कोई संभावित जावास्क्रिप्ट शोषण नहीं होगा फ़ायरफ़ॉक्स के खिलाफ? http://www.piotrbania.com/all/articles/pbania-jit-mitigations2010.pdf: – EndangeringSpecies

+0

आपने इस रुचि के मिल सकता है। विशेष रूप से, भाग 2. – Amy

उत्तर

4

बस समय संकलन और JIT छिड़काव में अपने प्रश्न हम पहले परिभाषित करने की जरूरत, डाटा निष्पादन रोकथाम, उत्तर देने के लिए।

डेटा निष्पादन रोकथाम एक सुरक्षा सुविधा है जो कोड को निष्पादन योग्य स्मृति क्षेत्र से निष्पादित करने पर रोक लगाती है। डीईपी को हार्डवेयर तंत्र जैसे एनएक्स बिट और/या रनटाइम चेक जोड़कर सॉफ़्टवेयर तंत्र द्वारा कार्यान्वित किया जा सकता है।

बस समय (JIT) compilers में गतिशील compilers कि मशीन कोड को रन टाइम के दौरान बाइट कोड का अनुवाद कर रहे हैं। लक्ष्य व्याख्या कोड और संकलित कोड की गति के फायदे को जोड़ना है। इसे केवल तभी संकलित करना चाहिए जब संकलन में बिताए गए अतिरिक्त समय को संकलित कोड से अपेक्षित प्रदर्शन लाभ से बढ़ाया जा सके। [1]

JIT छिड़काव JIT इंजन सन्निहित shellcode के साथ कई निष्पादन पृष्ठ लिखने की coercing की प्रक्रिया है।

[....]

उदाहरण के लिए, इस तरह के रूप में एक जावास्क्रिप्ट बयान "var x = 0x41414141 + 0x42424242," निष्पादन योग्य छवि में दो 4 बाइट स्थिरांक (उदाहरण के लिए शामिल करने के लिए संकलित किया जा सकता है, "mov ईएक्स, 0x41414141; mov ecx, 0x42424242; ईएक्स, ecx जोड़ें ")। इन स्थिरांक के बीच में निष्पादन शुरू करके, एक पूरी तरह से अलग निर्देश धारा प्रकट होती है।

[....]

कुंजी अंतर्दृष्टि है कि JIT उम्मीद के मुताबिक है और निष्पादन योग्य पृष्ठ पर कुछ स्थिरांक कॉपी चाहिए। एक समान बयान (जैसे कि लंबी राशि या कोई दोहराव पैटर्न) को देखते हुए, उन स्थिरांक छोटे निर्देशों को एन्कोड कर सकते हैं और फिर अगले स्थिर स्थान पर प्रवाह नियंत्रित कर सकते हैं। [2]

इस तकनीक के दायरे से परे उन्नत तकनीकों का उपयोग तब जेआईटी स्प्रेड ब्लॉक के पते को खोजने और शोषण को ट्रिगर करने के लिए किया जाना चाहिए।

अब यह स्पष्ट होना चाहिए कि हमलावर कोड JIT इंजन द्वारा उत्पन्न होता है

यदि यह भी निष्पादन योग्य क्षेत्र में निवास करेंगे। दूसरे शब्दों में, डीईपी JIT कम्पाइलर द्वारा उत्सर्जित कोड के संरक्षण में शामिल नहीं है। [3]

संदर्भ

[1] A Dynamic Optimization Framework for a Java Just-in-Time Compiler

[2] Interpreter Exploitation: Pointer Inference and JIT Spraying

[3] JIT spraying and mitigations

संबंधित मुद्दे