
استغلال ثغرة في النواة يعتمد على WebKit وكسر حماية (Jailbreak) لجهاز PS5
يحتوي هذا المستودع على استغلال WebKit ROP لـ ثغرة سباق الاستخدام بعد التحرير في UMTX (CVE-2024-43102) التي أبلغت عنها Synacktiv. إنه في الأساس منقول من استراتيجية استغلال fail0verflow وflatz. إنه يسيء استغلال ثغرة الاستخدام بعد التحرير (UAF) للحصول على تعيين قراءة/كتابة في مكدس خيط kernel، ويستفيد من عمليات القراءة والكتابة عبر الأنابيب (pipe) لإنشاء أولية قراءة/كتابة عشوائية في kernel (ليست مثالية تمامًا). ثم تُرقّى هذه القراءة/الكتابة إلى أداة أفضل تستفيد من زوج مقابس ipv6 وزوج أنابيب للحصول على قراءة/كتابة مستقرة يمكن تمريرها إلى الحمولات بنفس الطريقة التي كانت ممكنة مع استغلال نواة PS5 عبر IPV6 السابق.
الصفحة نفسها هي نسخة منزوعة ومعدلة من مضيف استغلال PS5 الخاص بـ idlesauce لأنها قامت بالفعل بعمل ربط psfree بأسلوب الكود الذي استخدمته سابقًا. هذا المضيف هو أيضًا خياري الشخصي لتشغيل الأشياء لأنه سلس جدًا ويدمج حمولات مفيدة، وآمل أن يتم تحديثه لدعم هذا الاستغلال في المستقبل القريب <3.
في النهاية، سيتم تشغيل محمّل حمولات للاستماع إلى ملفات ELF الخاصة بالحمولات على المنفذ 9021. أوصي بـ PS5 Payload Dev SDK حيث يجب أن يكون متوافقًا تمامًا مع هذا المحمّل عند إضافة إزاحات kernel.
تؤثر هذه الثغرة على البرامج الثابتة من الإصدار 1.00 إلى 7.61، ومع ذلك يبدو أن FW >= 3.00 لديها تدابير تخفيف إضافية تتطلب تعديل الاستغلال حتى يعمل. وبما أنني مهتم في الغالب بالبرامج الثابتة الأقدم فقط، فإن هذا الاستغلال لا يدعم FW >= 3.00 حتى الآن. علاوة على ذلك، تم إصلاح ثغرة WebKit التي نربطها بهذه الثغرة في الإصدار 6.00، لذا ستكون هناك حاجة إلى استغلال WebKit آخر يحقق قراءة/كتابة في مساحة المستخدم (userland) لهذه الأنظمة. مرة أخرى، نظرًا لأنني لا أركز على البرامج الثابتة الأحدث، فقد تُرك هذا غير مكتمل في الوقت الحالي.
ملاحظات مهمة
البرامج الثابتة التالية مدعومة حاليًا:
dns.conf لتوجيه manuals.playstation.net إلى عنوان IP لجهاز الكمبيوتر الخاص بكpython fakedns.py -c dns.confpython host.py0.0.0.0
exploit.js).لاستخدام محمّل ELF، قم بتشغيل الاستغلال حتى الاكتمال. عند الاكتمال، سيتم تشغيل خادم على المنفذ :9021. اتصل وأرسل ملف ELF الخاص بك إلى PS5 عبر TCP وسيقوم بتشغيله. يجب أن يستمر هذا المحمّل في استقبال الحمولات وتنفيذها حتى بعد الخروج من المتصفح.
التحرير المزدوج الأولي
تعتمد استراتيجية هذا الاستغلال إلى حد كبير على fail0verflow وflatz. راجع شرح chris@accessvector لمزيد من المعلومات حول الثغرة. عند استغلالها، تمنحنا فعليًا تحريرًا مزدوجًا. يمكننا استخدام هذا لتداخل vmobject الخاص بمكدس kernel مع تعيين mmap للحصول على نافذة على مكدس خيط kernel. هذه الإمكانية القوية جدًا تتيح لنا القراءة/الكتابة إلى مؤشرات kernel عشوائية على المكدس، مما يحقق كسر ASLR والقدرة على إنشاء الأوليات (primitives). الخيط الذي لدينا إمكانية الوصول إلى مكدسه سنسميه خيط الضحية.
الحصول على قراءة/كتابة عشوائية
من خلال إنشاء أنبوب (pipe) وملء مخزن الأنبوب على الخيط الرئيسي، ثم محاولة الكتابة إليه باستخدام خيط الضحية، سيتم حظر خيط الضحية في انتظار توفر مساحة في المخزن. خلال هذا الوقت، يمكننا استخدام نافذتنا على مكدس kernel لتغيير مؤشرات iovec إلى مؤشرات kernel وضبط العلامات (flags) لمعاملتها كعناوين kernel. بعد ذلك، بقراءة الأنبوب على الخيط الرئيسي، يمكننا الحصول على قراءة عشوائية من kernel.
وبالمثل، من خلال جعل خيط الضحية يقرأ من الأنبوب، سيتم حظره في انتظار البيانات الواردة. يمكننا بعد ذلك، مرة أخرى، الكتابة فوق مؤشرات iovec وجعلها مؤشرات kernel، وكتابة البيانات على الخيط الرئيسي للحصول على كتابة عشوائية في kernel.
ترقية القراءة/الكتابة العشوائية
في هذه المرحلة، لدينا قراءة/كتابة عشوائية بدون قيود حقيقية، لكننا مقيدون باستخدام تعدد الخيوط والحظر لكي تعمل، وهذا ليس مثاليًا. ثم نستخدم القراءة/الكتابة للتكرار على جدول واصفات الملفات (FD) الخاص بالعملية وتداخل pktopts لمقبسي IPV6. يمكننا بعد ذلك إنشاء قراءة/كتابة عشوائية أخرى عبر خيار المقبس IPV6_PKTINFO. أولية القراءة/الكتابة هذه ليست مثالية أيضًا لأنها مقيدة في الحجم والمحتوى بسبب خيار المقبس الأساسي. نحتفظ بهذه الخطوة في الغالب لمحاكاة سيناريو استغلال IPV6، الذي بُنيت عليه معظم الحمولات وما شابه ذلك.
يمكننا الحصول على قراءة/كتابة أفضل عبر الأنابيب. من خلال التكرار مرة أخرى على جدول واصفات الملفات الخاص بالعملية وتعديل كائنات مخزن pipemap، يمكننا إنشاء قراءة/كتابة. يُستخدم زوج مقابس IPV6 كآلية للتحكم في مخزن pipemap.
إصلاح/تجاوز التلف
إذا تركت الأمور كما هي وحاولت إغلاق المتصفح، فسينهار النظام. وذلك لأن تنظيف العملية سيحاول تحرير مكدس kernel الذي تم تحريره بالفعل. لتجنب ذلك، نقوم بأمرين:
td_kstack لخيط الضحية في قائمة خيوط العملية.على إصدارات FW < 3.00، يكون هذا الاستغلال مستقرًا جدًا. نقطة الفشل الحرجة الوحيدة هي الفشل في تداخل vmobjects. على البرامج الثابتة الأحدث، يكون تحقيق هذا التداخل أصعب بسبب تدابير تخفيف مزعومة على مستوى مُخصِّص الصفحات/الكومة (heap allocator).
يمكن للمهتمين بالمساهمة في أبحاث/تطوير PS5 الانضمام إلى خادم ديسكورد الذي أنشأته هنا.