
استغلال نواة iOS 14 لثغرة CVE-2021-30807 يستهدف IOMobileFramebuffer، مع تخصيص ذاكرة قابل للضبط لتطوير الجيلبريك على أجهزة A11+.
الشرح الكامل هنا: https://jsherman212.github.io/2021/11/28/popping_ios14_with_iomfb.html
استغلال لـ CVE-2021-30807. إذا كنت تريد حقًا بناء جيلبريك منه، فسيتطلب ضبطًا لجهازك وإصدار iOS لأنني لا أملك أي تسريب معلومات أستخدمه لهذا الغرض.
للضبط على A11 وما دونه، استخدم pongo لتحميل xnuspy وقم بالبناء باستخدام 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 توجد عدة عينات قمت بالفعل بتشغيلها لهواتفي. يحسب متوسط جميع متوسطات كل نطاق. أنشئ «قائمة عينات» لجهازك وأضف النطاق إليها. كرر الاختبار عدة مرات حتى تحصل على 5-10 إدخالات في تلك القائمة. سيُبلغ alloc_averager.py عن معدل نجاح للتخمين الذي يولّده بناءً على القائمة. إذا أعجبك معدل النجاح، خذ التخمين واستبدل به قيمة GUESSED_OSDATA_BUFFER_PTR في أعلى IOMobileFramebufferUserClient.c.
من المهم جدًا عدم تضمين القيم الشاذة في هذه القائمة. بعد تشغيل الاختبار عدة مرات، ستصادف على الأرجح نطاقًا يبرز عن بقية النطاقات التي لديك بالفعل.
ستحتاج إلى إيجاد الإزاحات الخاصة بجهازك/إصدارك لتشغيل هذا الاختبار.
أولًا، للعثور على kernel_memory_allocate، ما عليك سوى عمل مرجع متقاطع (xref) للنص kernel_memory_allocate: VM is not ready. عندما تحصل على الإزاحة، عيّن قيمة kma إليها داخل install_kernel_memory_alloc_hook.
ثانيًا، لعزل الاختبار عن التخصيصات الأخرى التي يقوم بها XNU، أختبر عنوان عودة محددًا. هذا العنوان موجود داخل OSData::initWithCapacity. يمكنك بسهولة العثور على جدول الدوال الافتراضية (vtable) لـ OSData عن طريق عمل xref للسلسلة "OSData". أول xref لتلك السلسلة سيكون في دالة تحتوي على xref إلى vtable الخاصة بـ OSData::MetaClass. مباشرة فوق ذلك الـ vtable يوجد vtable الخاص بـ OSData، وOSData::initWithCapacity عند +0x78.
بمجرد حصولك على OSData::initWithCapacity، ابحث عن تعليمة BL الوحيدة إلى kernel_memory_allocate وخذ إزاحة التعليمات التي تليها مباشرة. داخل kernel_hooks.c، استخدم تلك الإزاحة في جملة if الوحيدة داخل الدالة الوحيدة في ذلك الملف.
أجهزة A12+ ستحتاج إلى استخدام شيء مثل Correlium.