
CVE-2026-20687: ثغرة أمنية في AppleJPEGDriver startDecoder Timeout UAF — ثغرة في نواة iOS/macOS تؤدي إلى تعطل مؤجل (A19 Pro، iOS 26.3 RC)
CVE-2026-20687 · Enfilade · enfilade.io
المكوّن: Kernel
التأثير: قد يتمكن تطبيق من التسبب في إنهاء غير متوقع للنظام أو كتابة في ذاكرة kernel.
الوصف: تمت معالجة مشكلة استخدام بعد التحرير (use after free) من خلال تحسين إدارة الذاكرة.
| iOS | 26.3 (23D125) (تم اختباره) |
| macOS | — |
| المكوّن | AppleJPEGDriver |
| الإصدار المُصحَّح | iOS 26.4 / iPadOS 26.4 |
| العتاد | iPhone18,2 (iPhone 17 Pro Max, A19 Pro) |
سيؤدي تشغيل PoC إلى انهيار kernel للجهاز. احفظ عملك قبل التشغيل. قد تتسبب حالات الانهيار المتكررة في تلف نظام الملفات. لأغراض البحث الأمني فقط.
يقوم مسار المهلة في startDecoder_sync بتحرير طلب ولكنه يترك مؤشر العقدة المضمّن في قائمة الانتظار داخل المتجه الخاص بكل برنامج ترميز. لاحقًا، يقوم اجتياز قائمة الانتظار بإلغاء الإشارة إلى العقدة القديمة وينهار kernel تحت فرض فحص علامات MTE. عادةً ما يتم تأجيل الانهيار حتى يتم تنفيذ فك ترميز JPEG متزامن لاحق — على iPhone يحدث هذا بشكل موثوق عند فتح تطبيق الكاميرا.
// يُهيئ برنامج التشغيل؛ عادةً ما يتم تأجيل الانهيار حتى فتح الكاميرا.
IOServiceOpen("AppleJPEGDriver");
for (int i = 0; i < N; i++) {
startDecoder_async(); // queue_io_gated: vector.push(req + 0x78)
}
IOServiceClose(conn);
// لاحقًا، يؤدي فتح الكاميرا إلى تشغيل:
startDecoder_sync();
queue_io_gated: vector.push(req + 0x78);
wait(10s) -> TIMEOUT;
pool_free(req); // BUG: لا يُزيل من قائمة الانتظار (req + 0x78)
// لاحقًا أيضًا (finish_io_gated):
fullSpeedRequestExist():
node_ptr = vector[i]; // قديم: node_ptr == (freed req + 0x78)
req2 = *(node_ptr + 0x8); // قراءة UAF -> خطأ علامة MTE -> انهيار
ios-app/Test.xcodeproj في Xcode.انظر LICENSE.