
Chrome pwning और v8 pwning के साथ शुरुआत करने के लिए एक उचित, सुव्यवस्थित दस्तावेज़ीकरण
Chrome pwning और v8 pwning के साथ शुरुआत करने के लिए एक उचित, सुव्यवस्थित दस्तावेज़
यह दस्तावेज़ कैसे व्यवस्थित है
ब्राउज़र आज की सबसे अधिक उपयोग होने वाली तकनीकों में से एक हैं। हर रेडी-मेड कंप्यूटर पर, अगर हम बस प्लग एंड प्ले करें, तो हमें एक ब्राउज़र इंस्टॉल दिखेगा। इसीलिए एक हमलावर के दृष्टिकोण और थ्रेट मॉडल के दृष्टिकोण से यह बहुत फायदेमंद है अगर हमलावर एक दुर्भावनापूर्ण पेज के माध्यम से ब्राउज़र से समझौता करने में सक्षम हो। उपरोक्त तर्कों को देखते हुए मैंने Google के Javascript Engine, विशेष रूप से v8 का अध्ययन करना चुना।
v8 प्रोजेक्ट की विशाल प्रकृति को देखते हुए, मैंने इंटरप्रेटर, अर्थात् d8 को शुरुआती बिंदु के रूप में चुना। हालाँकि d8 पर पहले से ही काफी शोध हो चुका है, हमें उम्मीद है कि कम से कम एक बग मिल जाएगा और अगर नहीं मिलता है, तो हम ब्राउज़र exploitation पर शोध आगे बढ़ाने में सक्षम होंगे, क्योंकि v8 ब्राउज़र exploitation में उपयोग की जाने वाली बुनियादी exploit development रणनीतियों के लिए प्रवेश क्षेत्र प्रदान करता है।
v8 को टारगेट चुनने का एक और कारण यह है कि यह कई ब्राउज़रों में उपयोग होता है।
अगर हम हुड के नीचे देखें, तो हम देख सकते हैं कि यह इंजन MicrosoftEdge में भी उपयोग होता है, इसलिए कई bug bounty पुरस्कार पाने का मौका है। अंतर्निहित ऑपरेटिंग सिस्टम के लिए, शोधकर्ता windows और linux का मिश्रण उपयोग करेगा, क्योंकि shell प्राप्त करने के मामले में कोई प्रतिबंध नहीं है, क्योंकि v8 बग wasm पेजों के माध्यम से कोड निष्पादन की अनुमति देते हैं और यह किसी विशेष प्लेटफ़ॉर्म से बंधा नहीं है।
दुर्भाग्य से, जबकि v8 में एक शोषित बग के परिणामस्वरूप कोड निष्पादन होगा, हम सैंडबॉक्स के कारण कोई कोड निष्पादित नहीं कर पाएंगे, और इस तरह हमें renderer के संदर्भ में कोड निष्पादन मिलेगा, जो हमें मशीन पर कोड निष्पादित करने की अनुमति नहीं देगा। उसके लिए हमें सैंडबॉक्स के लिए एक और exploit की आवश्यकता होगी, इस प्रकार सिस्टम को exploit करने के लिए हमें एक पूरी chain की आवश्यकता होगी।
और इस प्रकार हम ब्राउज़र हैकिंग के साथ शुरुआत करने के लिए निम्नलिखित लक्ष्यों को परिभाषित करते हैं:
परियोजना के पहले चरण में Chrome आर्किटेक्चर के बारे में और यह जानने की आवश्यकता है कि प्रत्येक घटक एक-दूसरे के साथ कैसे इंटरैक्ट करता है। इसे बेहतर ढंग से समझने के लिए हमें Chromium प्रोजेक्ट को कई उप-घटकों में विभाजित करने की आवश्यकता है, ताकि हम सब कुछ अलग कर सकें और ठीक से विश्लेषण कर सकें। अधिक सटीक रूप से, निम्नलिखित प्रत्येक घटक कितने उप-घटकों में टूटता है:
अब पहले कदम के लिए सबसे तार्किक कदम chromium आर्किटेक्चर को समझना है। तो ठीक है, हम ब्राउज़र को exploit करना चाहते हैं, लेकिन जब हम पहली बार ब्राउज़र शुरू करते हैं तो क्या होता है? chromium executable पर क्लिक करने के बाद, executable कुछ प्रक्रियाएँ शुरू करता है।
उनका क्रम और नाम इस प्रकार है:
पहली प्रक्रिया content process कहलाती है। यह प्रक्रिया क्या करती है?
अब जब हम संक्षेप में जान गए हैं कि यह क्या करता है, तो इस पर अधिक गहराई से जाने का समय है:
।chrome_exe_main_win.cc से लिया गया है और यदि आप पूरा कोड पढ़ने के लिए उत्सुक हैं, तो यह chromium/src/chrome/app पर स्थित है। ठीक है, निष्पादन के साथ आगे बढ़ते हुए हम देख सकते हैं कि यह dll लोडेड क्लास को कॉल करने के लिए MakeMainDllLoader() को कॉल करता है, उसके बाद यह "loader" लॉन्च करता है, यानी यह chrome.dll लोड करता है और यदि आवश्यक हो तो आवश्यक command lines के साथ इसे पुनः आरंभ करता है। Loader का आगे विश्लेषण करने के लिए हमें इसका कोड समझने की आवश्यकता है, जो उसी निर्देशिका में mail_dll_loader_win.cc फ़ाइल में है। फ़ाइल के अंत तक स्क्रॉल करने पर हम MakeMainDllLoader का कॉल देख सकते हैं, जो आपके पास मौजूद संस्करण के आधार पर ChromeDllLoader या ChromiumDllLoader को कॉल करता है।
ChromiumDllLoader एक class है जो MainDllLoader से inherit करती है। हम definition से देख सकते हैं कि यह class केवल cmdline और process type को दिए गए arguments के आधार पर dll लोड करती है।
।
।--no-sandbox पास किया गया था, जो मूल रूप से binary को बताता है कि sandbox में न चलें। यह जाँचता है कि क्या इनमें से कोई भी सेट था और यदि कोई सत्य है, तो यह sandbox को संबंधित विकल्पों के साथ कॉल करता है। फिर अंत में हम वहाँ पहुँचते हैं
chrome_main को कॉल करने के लिए wrapper को दर्शाता है।