
PoC CVE-2023-28205: ثغرة استخدام بعد التحرير في Apple WebKit
تؤثر هذه الثغرة على Apple WebKit ويمكن استغلالها عبر محتوى ويب مُصمم بشكل خبيث، مما قد يسمح بتنفيذ تعليمات برمجية عشوائية في سياق عملية WebKit.
إصدار WebKit المتأثر الذي تم تحليله في هذا المستودع مبني على WebKit-613.1.17.1 (سلالة PlayStation / Safari 15.4).
إثبات المفهوم يُطلق حالة استخدام بعد التحرير (UAF) عن طريق تأخير متعمد لتسجيل كائنات JavaScript مثل Map وDate أثناء عمليات الاستنساخ المهيكل.
نافذة التوقيت هذه تسمح لـ جامع القمامة في JavaScriptCore (GC) باستعادة كائنات لا تزال قيد الاستخدام منطقيًا، مما يؤدي إلى إلغاء الإشارة إلى مؤشرات قديمة أثناء استمرار التنفيذ.
SerializedScriptValueCloneDeserializer::deserialize()تكمُن الثغرة في منطق إلغاء تسلسل الاستنساخ المهيكل، وتحديدًا في كيفية تتبع كائنات JavaScript المنشأة حديثًا أثناء إلغاء التسلسل الاسترجاعي.
في SerializedScriptValue.cpp، يستخدم مُلغي التسلسل حاويات WebKit القياسية مثل:
Vector<JSObject*, 32> outputObjectStack;
Vector<JSMap*, 4> mapStack;
Vector<JSSet*, 4> setStack;
حاويات Vector هذه لا يتم فحصها بواسطة جامع القمامة. إذا تم تشغيل دورة جمع قمامة أثناء إلغاء التسلسل (على سبيل المثال عبر ضغط الذاكرة أو تنفيذ JS مُعاد الدخول)، فقد يتم جمع الكائنات المشار إليها فقط بواسطة هذه الحاويات بشكل غير صحيح.
ومع ذلك، يستمر مُلغي التسلسل في استخدام هذه المؤشرات المعلقة، مما يؤدي إلى حالة استخدام بعد التحرير.
التصحيح الأمني الرسمي لـ WebKit (commit c9880de) يستبدل هذه الحاويات بـ MarkedVector، وهي بنية مدركة لجامع القمامة تسجّل محتوياتها بشكل صحيح كجذور GC.
في الإصدار الذي تم تحليله:
MarkedVector غير مُنفّذCloneDeserializer لا يزال يستخدم Vectorهذا يؤكد أن الإصدار عُرضة بالكامل لـ CVE-2023-28205.
الانهيار التالي تم تشغيله بشكل موثوق بواسطة إثبات المفهوم ويتوافق مع إلغاء إشارة لمؤشر قديم بعد جمع القمامة (GC).
SIGSEGV (11)0x0000000000000068SceNKWebProcesslibSceNKWebKit.sprxعنوان الخطأ 0x68 يشير إلى إلغاء إشارة لمؤشر قاعدة NULL مع إزاحة حقل كائن، وهو توقيع كلاسيكي للوصول إلى كائن JavaScript محرّر.
حالة المسجلات تؤكد:
RAX = 0x0 (قاعدة كائن NULL)سلوك الانهيار هذا هو مظهر مباشر لثغرة الاستخدام بعد التحرير (UAF) في CloneDeserializer الموصوفة أعلاه.