फिर से नमस्कार! कल हम
"रिवर्स इंजीनियरिंग" पाठ्यक्रम पर एक नए समूह में कक्षाएं शुरू करेंगे। परंपरागत रूप से हम आपके साथ विषय पर उपयोगी सामग्री का अनुवाद साझा करते हैं। चलो चलते हैं!
कुछ हमलावरों के लिए यह महत्वपूर्ण है कि शोषण अत्यंत विश्वसनीय हो। यह हमेशा एक ज्ञात प्लेटफॉर्म और फ्लैश के संस्करण के साथ एक सिस्टम पर लॉन्च होने पर कोड निष्पादन का नेतृत्व करना चाहिए। इसे बनाने के लिए, आप विशेष रूप से उच्च-गुणवत्ता वाले बग का उपयोग कर सकते हैं। यह लेख इन बगों में से एक के उपयोग के साथ-साथ उन कारकों का वर्णन करता है जो इसे विश्वसनीय संचालन के लिए विशेष रूप से उपयुक्त बनाते हैं।
बगCVE-2015-3077 - Adobe Flash
Button और
MovieClip फ़िल्टर सेटर्स में टाइप
कन्फ्यूजन की समस्या, जो आपको किसी अन्य के साथ किसी भी
प्रकार के फ़िल्टर को भ्रमित करने की अनुमति देती है। मैंने इसे दिसंबर 2015 की शुरुआत में रिपोर्ट किया और मई में इसे ठीक कर लिया गया। बग इसलिए होता है क्योंकि पटाखा फ़िल्टर ऑब्जेक्ट को इनिशियलाइज़ करने के लिए इस्तेमाल किए गए कंस्ट्रक्टर को ओवरराइट कर सकता है। समस्या को प्रस्तुत करने वाला नमूना कोड नीचे प्रस्तुत किया गया है:

यह कोड [] ऑपरेटर के उपयोग के कारण कुछ हद तक भ्रामक है, जो फ़्लैश सीएस में संकलन के लिए आवश्यक है। तार्किक रूप से समतुल्य कोड (जो कि एक तथ्य नहीं है कि संकलन) नीचे दिया गया है:

यह कोड ऑब्जेक्ट के फ़िल्टर फ़ील्ड को सेट करता है: बटन या मूवीक्लिप टू ब्लरफिल्टर, जो बाद में सीधे फ्लैश में संग्रहीत होता है। BlurFilter कंस्ट्रक्टर तब ConvolutionFilter कंस्ट्रक्टर द्वारा अधिलेखित है। उसके बाद, गेट्टर कहा जाता है और मूल ब्लरफिल्टर को स्टोर करने के लिए एक एक्शनस्क्रिप्ट ऑब्जेक्ट बनाया जाता है। हालांकि, कंस्ट्रक्टर को पहले ही अधिलेखित कर दिया गया है, इसलिए कन्वेंशनफिल्टर कहा जाता है। यह मूल ब्लूफ़िल्टर की वापसी द्वारा समर्थित प्रकार कन्वेंशन फ़िल्टर की एक वस्तु का उत्पादन करता है।
अंततः, कन्वर्जेंसफिल्टर फ़ील्ड को एक्सेस किया जा सकता है (पढ़ें और लिखें) जैसे कि वे ब्लरफिल्टर के थे। इसी प्रकार किसी अन्य प्रकार के फ़िल्टर के लिए। यह शोषण के लिए उपयोगी जोड़तोड़ की एक विस्तृत श्रृंखला को खोलता है।
नीचे दिया गया आरेख स्मृति में मूल वस्तुओं के स्थान को दर्शाता है जो संभवतः 64-बिट लिनक्स में इस भेद्यता का उपयोग करके भ्रमित हो सकते हैं।

दो मामलों में, पॉइंटर्स पूर्णांकों और फ्लोटिंग-पॉइंट नंबरों के लिए तुलनीय होते हैं जिन्हें जोड़-तोड़ किया जा सकता है। इसका मतलब है कि पॉइंटर्स को सीधे पढ़ा और लिखा जा सकता है। इसके अलावा, चूंकि वस्तुओं की फ़ील्ड्स को वर्ग परिभाषा के अनुसार आकार के अनुसार क्रमबद्ध और क्रमबद्ध किया जाता है, वे हमेशा पूर्वानुमान योग्य स्थानों में होते हैं, ताकि लिखना और पढ़ना विफल न हो। ये गुण शोषण की विश्वसनीयता सुनिश्चित करने के लिए महत्वपूर्ण हैं।
शोषणचूंकि इस समस्या का दोहन करने के लिए बार-बार चलने वाले प्रकार के भ्रम की आवश्यकता होती है, इसलिए मैंने टाइप भ्रम,
FilterConfuse.confuse के लिए एक उपयोगिता फ़ंक्शन बनाकर शुरू किया। यह चीजों को भी बताता है: यह ActionScript फ़िल्टर कंस्ट्रक्टर्स को उनके सामान्य स्थिति में वापस लाता है, जो फ़ंक्शन के बाहर ActionScript के व्यवहार को प्रभावित किए बिना बार-बार एक असुरक्षित फ़ंक्शन को कॉल करता है।
वर्चुअल फंक्शन टेबल (संक्षेप में व्यवहार्य) के पते को परिभाषित करके एएसएलआर को बायपास करने के लिए पहला कदम था। इसके लिए आदर्श तरीका यह है कि किसी वस्तु के साथ किसी वॉयटेबल के साथ किसी ऑब्जेक्ट को भ्रमित किया जाए जिसमें एक ऐसा वॉयलेट ओवरलैप करने वाला तत्व होता है जिसे हेरफेर किया जा सकता है। लेकिन सभी फ़िल्टर ऑब्जेक्ट्स की व्यवहार्यता में एक ही ऑफसेट होता है। इसके बजाय, मैंने व्यवहार्यता पते को निर्धारित करने के लिए DisplacementMapFilter में
BitmapData ऑब्जेक्ट का उपयोग किया।
ऑब्जेक्ट की बिटमैपडेटा मेमोरी में स्थान निर्धारित करने के लिए, मैंने बेवेलफिल्टर के साथ डिस्कप्लेसमेंटफिल्टर को भ्रमित किया। इसने BeplaceFilter रंग संपत्तियों (
ShadowColor ,
shadowAlpha ,
highlightColor और
highlightAlpha ) के साथ DisplacementMapFilter संरेखित में संग्रहीत बिटमैपडाटा सूचक बनाया। इन गुणों को दो 32-बिट पूर्णांकों द्वारा समर्थित किया गया है (ऊपर और नीचे स्कोलर और होल्कर के रूप में दिखाया गया है), और रंग गुण प्रत्येक पूर्णांक के 24 बिट्स तक पहुंचते हैं, जबकि अल्फा गुण ऊपरी 8 बिट्स तक पहुंचते हैं। यदि आप इन गुणों को पढ़ते हैं और बिट अंकगणितीय का उपयोग करके उन्हें जोड़ते हैं, तो आप ऑब्जेक्ट के तत्काल बिटमैपडेटा पते को निकाल सकते हैं।

फिर, आपको बिटमैपडेटा ऑब्जेक्ट के शीर्ष से व्यवहार्यता को पढ़ने की आवश्यकता है। इसके लिए, मैंने कन्वर्टरफिल्टर ऑब्जेक्ट की
मैट्रिक्स संपत्ति का उपयोग किया। इसे एक पॉइंटर के रूप में फ्लोटिंग पॉइंट नंबरों की एक सरणी में संग्रहीत किया जाता है, जिसके तहत प्रॉपर्टी सेट करते समय मेमोरी आवंटित की जाती है, और प्रॉपर्टी प्राप्त होने पर इन नंबरों वाले एक्शनस्क्रिप्ट सरणी को वापस कर दिया जाता है। मैट्रिक्स पॉइंटर को एक बिटमैपडेटा ऑब्जेक्ट पर सेट करके, आप इस ऑब्जेक्ट की सामग्री को फ़्लोटिंग-पॉइंट संख्याओं की एक सरणी के रूप में मेमोरी से पढ़ सकते हैं।
पॉइंटर सेट करने के लिए, मैंने
डिस्कप्लेमेंट मैपफ़िल्टर ऑब्जेक्ट के साथ
कन्वर्सेशन फ़िल्टर ऑब्जेक्ट को भ्रमित किया (ऊपर इस्तेमाल किया गया समान
डिसप्लेमेंट मैप फ़िल्टर नहीं!) और
मैपिंग प्रॉपर्टी में ऑब्जेक्ट के
बिटमैपडैटा का स्थान सेट करें। MapPoint गुण पूर्णांक के साथ एक बिंदु है जो x और y (नीचे की आकृति में p_x और p_y) को दर्शाता है, जो कि ConvolutionFilter में मैट्रिक्स पॉइंटर के अनुरूप है, जिससे यह मान सेट करना आसान हो गया। उसके बाद, कन्वेंशनफिल्टर ऑब्जेक्ट से मैट्रिक्स सरणी का उपयोग करके बिटमैपडैटा ऑब्जेक्ट से व्यवहार्य पढ़ना संभव हो गया (यह ध्यान देने योग्य है कि इसके लिए ऑब्जेक्ट को विस्थापनबिटमैपफ़िल्टर के साथ भ्रमित करना पड़ा, और फिर कन्वर्सेफ़िल्टर के साथ वापस भ्रमित होना पड़ा)।

इस बिंदु पर, फ्लोटिंग पॉइंट नंबरों के उपयोग के कारण शोषण की विश्वसनीयता बनाए रखना अधिक कठिन हो जाता है। मान vtable_low और vtable_high को कन्वेंशन फ़िल्टर मैट्रिक्स से फ्लोटिंग-पॉइंट संख्याओं के रूप में पढ़ा जाता है, क्योंकि यह एक सरणी प्रकार है। लेकिन, दुर्भाग्य से, प्रत्येक वैध पॉइंटर मूल्य एक वैध फ्लोटिंग पॉइंट संख्या नहीं है। इसका मतलब यह है कि मूल्य पढ़ना NaN, या इससे भी बदतर, पूर्ण रूप से संख्यात्मक मान को वापस कर देगा।
आदर्श रूप से, इस समस्या को हल करने के लिए, आपको एक गेट्टर के माध्यम से vtable_low और vtable_high तक पहुंचने की आवश्यकता है, जो उन्हें पूर्णांक के रूप में व्याख्या करता है, लेकिन ऐसा इसलिए नहीं है क्योंकि फ़िल्टर तत्व आमतौर पर उनकी कार्यक्षमता के कारण फ्लोट होते हैं।
सौभाग्य से, AS2 वर्चुअल मशीन अस्थायी बिंदु संख्याओं की व्याख्या करने के लिए पर्याप्त आलसी है - यह केवल एक फ्लोट के लिए एक मान को धर्मान्तरित करता है जब ActionScript में इस पर एक ऑपरेशन किया जाता है। मूल संचालन को आमतौर पर व्याख्या की आवश्यकता नहीं होती है, सिवाय अंकगणित जैसे विशेष लोगों के। इसका मतलब यह है कि जब मैट्रिक्स सरणी से vtable_low या vtable_high तक एक फ्लोटिंग-पॉइंट नंबर की प्रतिलिपि बनाते हैं, तो यह मेमोरी में इसके मूल्य को बनाए रखेगा, भले ही यह फ्लोट के लिए अमान्य हो, जबकि जिस वेरिएबल में इसे कॉपी किया गया था, उसका उपयोग ActionScript में या मूल में अरिथमेटिक ऑपरेशन करने के लिए नहीं किया गया है कोड। इस प्रकार, यदि एक चर का मान दूसरे प्रकार के साथ तुरंत भ्रमित हो जाता है, जो 32-बिट मानों की पूरी श्रृंखला का समर्थन करता है, उदाहरण के लिए, यह मैट्रिक्स सरणी की स्मृति में मूल मूल्य के समान होने की गारंटी है। इसलिए, शोषण में अविश्वसनीयता से बचने के लिए, एक्शनस्क्रिप्ट में फ़्लोट्स में हेरफेर करने से पहले टाइप कन्फ्यूजन करना महत्वपूर्ण है।
ऐसा करने के लिए, मैंने पूर्णांक-से-फ़्लोट और फ़्लोट-टू-पूर्णांक फ़ंक्शंस को लागू करने के लिए फ़िल्टर में भ्रम की स्थिति का उपयोग करके एक रूपांतरण वर्ग,
फ़्लोटकॉन्सेसर लिखा। यह
मैट्रिक्स संपत्ति को भ्रमित करता है ColorMatrixFilter (इसे मैट्रिक्स संपत्ति ConvolutionFilter के साथ भ्रमित न करें), जो कि बिल्ट-इन फ्लोट्स का एक सेट है, जिसमें GlowFilter
रंग और
अल्फा गुण होते हैं, जो अलग-अलग इंट में प्रवेश करते हैं।

इस तरह आप फ्लोट के एक विश्वसनीय रूपांतरण को एक इंट में लागू कर सकते हैं, लेकिन, दुर्भाग्य से, यह विपरीत दिशा में मज़बूती से काम नहीं करता है। ActionScript में ColorMatrix में कलर ऐरे को एक्सेस करने के लिए, पूरे एरे को कॉपी किया जाता है, भले ही आप उनमें से केवल पहले एक्सेस करते हों। किसी सरणी की प्रतिलिपि बनाते समय, प्रत्येक तत्व को संख्या में परिवर्तित किया जाता है, जिसमें कॉल टू पॉइंटर्स शामिल हैं (उदाहरण के लिए, किसी ऑब्जेक्ट के मान को कॉल करना)। चूंकि रंग सरणी पूरे GlowFilter वर्ग की सबसे लंबी है, इसलिए GlowFilter के साथ भ्रमित होने पर यह ठीक हो जाता है। इसका मतलब यह है कि इस ढेर से अज्ञात मूल्यों का रूपांतरण हो सकता है, जो संख्या में परिवर्तित होने पर अमान्य पॉइंटर्स को संदर्भित करने पर दुर्घटना का कारण बन जाएगा। इसलिए, इंट-टू-फ्लोट के लिए, मैंने एक और भ्रम के समाधान के लिए एक फ्लोट कनवर्टर लागू किया है कॉनफोल्यूशनफिल्टर और डिसप्लेमेंटमैपफिल्टर, जो एक सीधा कलाकार है और ढेर से अज्ञात मूल्यों का कारण नहीं है।

यह ढेर से अपरिचित मूल्यों तक पहुँचने के कारण क्रैश की समस्या को हल करता है, लेकिन, दुर्भाग्य से, इस शोषण में फ़्लोट्स से जुड़ी एक और विश्वसनीयता की समस्या है। यह कन्वर्जेंसफिल्टर मैट्रिक्स गेट्टर के कार्यान्वयन के कारण है। ActionScript 2 में सभी संख्यात्मक मान टाइप संख्या के होते हैं, जो एक पूर्णांक और एक डबल संख्या में एक पॉइंटर का संघ होता है। मूल ConvolutionFilter मैट्रिक्स को फ़्लोटिंग पॉइंट नंबरों की एक सरणी के रूप में संग्रहीत किया जाता है, लेकिन मैट्रिक्स गाइटर को कॉल करने के लिए एक्सेस को संरक्षित करने के लिए एक्शनस्क्रिप्ट सरणी में कॉपी किया जाता है, और इस प्रक्रिया में मूल्यों को डबल में बदल दिया जाता है। फिर, फ्लोट कनवर्टर को कॉल करते समय, उन्हें फ़्लोटिंग पॉइंट नंबरों में बदल दिया जाता है।
फ्लोटिंग-पॉइंट नंबर को एक डबल-सटीक संख्या में कास्टिंग करना और इसके विपरीत आमतौर पर इसके मूल्य को बचाता है, लेकिन यह नहीं कि फ्लोट का मूल्य SNaN है। फ़्लोटिंग पॉइंट विनिर्देश के अनुसार, दो प्रकार के NaN हैं: साइलेंट NaN (QNaN) और सिग्नल NaN (SNaN)। जब QNaN प्रकट होता है, तो कुछ भी नहीं होता है, लेकिन कुछ मामलों में SNaN एक अस्थायी-बिंदु अपवाद फेंकता है। X86 में, डबल फ्लोट में कनवर्ट करने से हमेशा QNaN में परिणाम होता है (भले ही डबल SNaN से आया हो) अप्रत्याशित अपवादों से बचने के लिए।
इसलिए, यदि पॉइंटर के निचले बिट्स SNaN हैं, तो इसे QNaN में बदल दिया जाएगा, जिसका अर्थ है कि पहला बिट (पहले मेंटिसा बिट, 22 बिट) सेट किया जाएगा जब यह नहीं होना चाहिए। व्यवहार्य पढ़ते समय इस समस्या से बचा जा सकता है - पहले बिट वाले पॉइंटर के तीसरे बाइट को वर्तमान मूल्य की पुष्टि करने के लिए संरेखण के बिना पढ़ा जा सकता है। तो कोड संरेखण के बिना पढ़ा जाएगा (बिटमैट पॉइंटर के साथ एक बार फिर से पढ़ने योग्य होने के बाद) और फ्लोट के एसएनएएन होने पर इंट वैल्यू को समायोजित करें।
ऊपर वर्णित फ्लोट कन्वर्टर्स का उपयोग करके, वाइबेट एड्रेस को पूर्णांक में परिवर्तित किया जा सकता है। अब आपको इस पते का उपयोग करके कोड निष्पादित करने की आवश्यकता है। निर्देश पॉइंटर को स्थानांतरित करने का एक आसान तरीका है वस्तु की व्यवहार्यता (या किसी वस्तु के लिए एक सूचक जो एक व्यवहार्य है) को अधिलेखित करना है। यह कन्वेलेशनफिल्टर मैट्रिक्स ऐरे और विस्थापनफिल्टर पॉइंटर के बिटमैपडेटा को भ्रमित करके किया जा सकता है।
पहले भाग का अंत। अनुवाद का दूसरा भाग थोड़ी देर बाद प्रकाशित किया जाएगा, और अब हम आपकी टिप्पणियों की प्रतीक्षा कर रहे हैं और हम सभी को OTUS
रिवर्स इंजीनियरिंग पाठ्यक्रम में आमंत्रित करते हैं।