
CVE-2021-30807 हेतु iOS 14 कर्नेल एक्सप्लॉइट, जो IOMobileFramebuffer को लक्षित करता है, A11+ डिवाइसों पर जेलब्रेक विकास के लिए समायोज्य मेमोरी आवंटन के साथ।
विवरण यहाँ है: https://jsherman212.github.io/2021/11/28/popping_ios14_with_iomfb.html
CVE-2021-30807 के लिए एक्सप्लॉइट। यदि आप वास्तव में इससे जेलब्रेक बनाना चाहते हैं, तो इसके लिए आपके डिवाइस और iOS संस्करण के अनुसार ट्यूनिंग की आवश्यकता होगी, क्योंकि मेरे पास इसके लिए उपयोग करने हेतु कोई info leak नहीं है।
A11 और उससे नीचे के लिए ट्यून करने हेतु, xnuspy लोड करने के लिए pongo का उपयोग करें और SAMPLING_MEMORY=1 make -B के साथ बिल्ड करें। यह एक टेस्ट सक्षम करेगा जो kernel_memory_allocate द्वारा लौटाई गई मेमोरी को एकत्र करता है, उन पॉइंटर्स को सॉर्ट करता है, और फिर एक रेंज आउटपुट करता है। आपको कुछ इस तरह दिखेगा:
sample_kernel_map: 0xffffffe8ebe9c000 [0x10000 bytes from behind]
sample_kernel_map: to add to alloc_averager:
[0xffffffe8ce934000, 0xffffffe8ebf98000],
(बस इसके द्वारा दिखाई गई चेतावनियों को अनदेखा करें)
इस टेस्ट को डिवाइस के बूट होने के 30 सेकंड बाद चलाया जाना है।
alloc_averager.py के अंदर कुछ सैंपल हैं जो मैंने पहले ही अपने फोन के लिए चलाए थे। यह प्रत्येक रेंज के सभी औसतों का औसत निकालता है। अपने डिवाइस के लिए एक "samples list" बनाएं और उसमें रेंज जोड़ें। इस टेस्ट को कुछ बार दोहराएं जब तक कि उस सूची में 5-10 प्रविष्टियाँ न हो जाएँ। alloc_averager.py सूची के आधार पर उत्पन्न अनुमान के लिए सफलता दर की रिपोर्ट देगा। यदि सफलता दर आपको पसंद आती है, तो उस अनुमान को लें और IOMobileFramebufferUserClient.c के शीर्ष पर GUESSED_OSDATA_BUFFER_PTR के मान को इससे बदल दें।
इस सूची में outliers (असामान्य मान) शामिल न करना बहुत महत्वपूर्ण है। टेस्ट को कुछ बार चलाने के बाद आपको संभवतः एक ऐसी रेंज मिलेगी जो आपके पास पहले से मौजूद बाकी रेंजों से अलग हटकर दिखती है।
इस टेस्ट को चलाने के लिए आपको अपने डिवाइस/संस्करण के लिए offsets खोजने होंगे।
पहले, kernel_memory_allocate खोजने के लिए, बस kernel_memory_allocate: VM is not ready का xref करें। जब आपके पास offset हो, तो install_kernel_memory_alloc_hook के अंदर kma का मान उस पर सेट करें।
दूसरे, टेस्ट को XNU द्वारा की जाने वाली अन्य allocations से अलग करने के लिए, मैं एक विशिष्ट रिटर्न एड्रेस के लिए जाँच करता हूँ। वह एड्रेस OSData::initWithCapacity के अंदर है। आप स्ट्रिंग "OSData" का xref करके OSData का vtable आसानी से पा सकते हैं। उस स्ट्रिंग का पहला xref एक ऐसे फ़ंक्शन में होगा जिसमें OSData::MetaClass के vtable का xref है। उस vtable के ठीक ऊपर OSData का vtable है, और OSData::initWithCapacity +0x78 पर है।
एक बार जब आपके पास OSData::initWithCapacity हो, तो kernel_memory_allocate का एकमात्र BL खोजें और उसके ठीक नीचे वाले निर्देश का offset लें। kernel_hooks.c के अंदर, उस फ़ाइल के एकमात्र फ़ंक्शन में मौजूद एकमात्र if स्टेटमेंट में उस offset का उपयोग करें।
A12+ के लिए Correlium जैसी किसी चीज़ का उपयोग करना होगा।