
# CVE-2026-64788 PoC — استغلال Use-After-Free في IOGPUFamily (iOS 26.6 / 23G71)
المكوّن: امتداد نواة IOGPUFamily (com.apple.iokit.IOGPUFamily)
المتأثر: iOS / iPadOS 26.6 (23G71) والإصدارات الأقدم
تم الإصلاح في: iOS / iPadOS 26.6.1 (23G83)
النوع: استخدام بعد التحرير في IOGPUDevice::create_resource_iosurface
الأثر: تلف في ذاكرة النواة؛ تم تأكيد إلغاء مرجع UAF على A14 (iPhone 12)
اكتشفه: f00l (@PPPF00L)، 3ndy1 (@_3ndy1)، Minghao Lin (@Y1nkoc)، 云散花折، Arjanit Isufi
(وفق نشرة أمان Apple — iOS 26.6.1)
IOGPUDevice::create_resource_iosurface يخصص كائن IOGPUSysMemory (~0x100 بايت، منطقة kalloc.256) ويسجّله في جدول موارد IOSurface الخاص بالجهاز. قبل الإرجاع، يتم تشغيل فحص تجاوز الأبعاد عبر . مسار التجاوز يتفرّع إلى إرجاع خطأ ، تاركًا إدخالًا نشطًا في جدول الموارد يشير إلى ذاكرة محرّرة.
ADDS width+height → b.hscreate_resource_iosurface:
kalloc(0x100) → obj ; IOGPUSysMemory تم تخصيصه
table[new_id] = obj ; تم تسجيله بمرجع
ADDS w_result, w_width, w_height
b.hs error_path ; ← تجاوز: يقفز إلى هنا
error_path:
; الكائن لم يُحرَّر، إدخال الجدول لم يُمسح
return kIOReturnInvalid
يبقى إدخال الجدول القديم حتى يُعاد استخدام نفس معرّف المورد أو يُغلق الجهاز.
IOGPUDevice::set_resource_purgeable(id) يبحث عن المعرّف القديم عبر get_resource_by_id()، ويجد الإدخال المعلّق، ويصل إليه بشكل غير افتراضي:
| الإزاحة | العملية | الوصف |
|---|---|---|
+0x010c | ldaddl w9(-4), w8, [obj+0x24] | إنقاص ذرّي لـ [obj+0x24]؛ القيمة القديمة → w8 |
+0x0128 | cbz w8, skip; ldr x1, [obj+0x28] | إذا كانت القيمة القديمة [+0x24] != 0: تحميل [obj+0x28] كوسيط لـ IOGPUMemory::setAllocation |
+0x0134 | ldr x0, [obj+0x10] | تحميل [obj+0x10] كوسيط IOCommandGate؛ cbz → skip إذا كانت 0 |
يُطلق إثبات المفهوم UAF باستخدام newTextureWithDescriptor:iosurface:plane: من Metal مع أبعاد تجاوز مصمّمة. قبل إلغاء مرجع UAF:
kalloc.256 المحرّرة[+0x10]=0، [+0x24]=0، [+0x28]=0 → يتم تخطّي Call2 وCall3 بأمانكشف التشغيل: set_resource_purgeable على مورد غير موجود يُرجع 0xe00002c2. بعد UAF + استعادة الرش للفتحة، يُرجع نفس الاستدعاء 0xe0002be (تم العثور على المورد، تم تشغيل Call1) — مما يؤكد أن الإدخال القديم تتم معالجته ببيانات الرش الخاصة بنا.
عزل المناطق في iOS 26 يعيد كائنات IOGPUSysMemory المحرّرة إلى قائمة حرة مستقرة النوع. كل من [obj+0x10] (IOMemoryDescriptor) و[obj+0x18] (IOGPUDevice) يحملان عدد مراجع خارجي ويبقيان نشطين بعد تحرير الكائن. ونتيجة لذلك، يتم تنفيذ completeMemory() دائمًا على بيانات ivar صالحة — تم تأكيد إلغاء مرجع UAF لكن بدائية قراءة/كتابة للنواة عبر هذا المسار وحده محجوبة على iOS 26 دون بدائية ثانوية لكسر عزل المناطق.
clang -arch arm64 -framework Metal -framework IOSurface \
-framework IOKit -framework Foundation \
-o poc poc/poc_iogpu_uaf.m
أو افتح في Xcode، وحدد فريق توقيع صالحًا، وشغّله على الجهاز.
| التاريخ | الحدث |
|---|---|
| 2026-08-17 | إصدار iOS 26.6.1 مع الإصلاح |
| 2026-08-17 | نشر اعتمادات Apple في نشرة الأمان |