
# استغلال desc_race لنظام iOS 15.0 - 15.1.1 (مع بدائيات قراءة/كتابة مستقرة للنواة) (CVE-2021-30955)
استغلال "desc_race" (CVE-2021-30955) لنظام iOS 15.0 - 15.1.1 (مع بدائيات قراءة/كتابة مستقرة للنواة)
قم بزيادة سعة مصفوفة IOSurfaceClient إلى 0x2000، والهدف هو كتابة مؤشر يكون محتواه تحت السيطرة الكاملة ثم استخدام واجهات IOSurfaceRootUserClient لتحقيق قراءة/كتابة النواة. حجم المصفوفة هو 0x2000 * 8 بايت وبالتالي تقع في الخريطة الكبيرة لـ KHEAP_KEXT وهي نفسها KHEAP_DEFAULT.
ثم قم بتخصيص مخزن مؤقت للنواة بحجم 0x4000 بايت باستخدام رسالة مساعدة kmsg مع واصف ool بحجم 0x4000 بايت والذي سيتم استبداله من الخلف. ثم قم بتشغيل الخطأ مع الرسالة المخصصة، المسماة double copyin kmsg، الموضوعة خلف المخزن المؤقت المساعد للنواة مباشرة. وهذه الرسالة تحتوي على واصف منافذ ool الذي عدده 0x2000 وبالتالي سيكون قريبًا جدًا من مصفوفة IOSurfaceClient.
ثم يجب أن تستلم الرسالة المساعدة. إذا نجح السباق، سيتم كشف واصف منافذ ool و يمكننا تحديد عنوان مصفوفة IOSurfaceClient.
ثم قم بتخصيص مخزن مؤقت للنواة بحجم 0x4000 بايت مرة أخرى، وهذا سيشغل المخزن المؤقت المذكور أعلاه. هذه المرة أقوم ببناء رأس kmsg مزيف مع جسم مناسب. ثم أقوم بتدمير رسالة double copyin kmsg، وستبدأ النواة مع رأسنا المزيف. أستخدم واصف mach_msg_ool_descriotpor_t مزيفًا وأقوم بتشغيل
vm_copy_discard() مع نسخة تحت السيطرة الكاملة. أثناء تدمير النسخة، فإن الأسطر الأكثر قيمة توجد في _vm_map_entry_unlink_ll:
1
2
3
4
5
6
#define _vm_map_entry_unlink_ll(hdr, entry) \
MACRO_BEGIN \
(hdr)->nentries--; \
(entry)->vme_next->vme_prev = (entry)->vme_prev; \
(entry)->vme_prev->vme_next = (entry)->vme_next; \
MACRO_END
إن entry تحت سيطرتنا، وهذا يمنحنا بدائية قراءة/كتابة مثالية. أستخدم هذا لكتابة مؤشر متحكم به إلى مصفوفة IOSurfaceClient، ثم أحقق قراءة/كتابة النواة مقترنة بواجهات IOSurfaceRootUserClient.
لقد قرأت منشور bazad "One byte to rule them all" مرارًا وتكرارًا أثناء تطوير هذا الاستغلال، واستخدمت نفس التقنية، تزييف vm_copy_t، في استغلاله. ولكن هناك بعض النقاط المختلفة.
تقوم XNU بتوقيع الرسالة ولم يعد بإمكاننا استلام kmsg تالف.
في إجراء التدمير، قمت بتعيين mapping_in_progress لكائن vm_object لجعل النواة تدور وبالتالي لن تتعطل بسبب فحص المنطقة.
شكر كبير لـ bazad على منشوره الرائع، وWangTielei على إعلامي بأن واجهات IOSurfaceClient أصبحت الآن غير صالحة لبدائية القراءة/الكتابة، وpedantcoder على لطفه.