توثيق وكود إثبات المفهوم لـ CVE-2022-24125 وCVE-2022-24126.
تم إصدار تحديث جديد للعبة Dark Souls III، وهو 1.15.1، في 2022/08/25، مع استعادة الخدمات عبر الإنترنت. أصلح هذا التحديث كلاً من CVE-2022-24125 وCVE-2022-24126، إلى جانب مجموعة واسعة من الثغرات الأمنية المحتملة الأخرى الموجودة في شبكات P2P الخاصة باللعبة (قراءات/كتابات خارج النطاق). علاوةً على ذلك، تم إصلاح جميع الاستغلالات المعروفة التي تسمح بإفساد ملفات الحفظ الخاصة بلاعبين آخرين. كما تم تصحيح العديد من الغشاشات التافهة الشائعة (مثل "سكين اللعنة") التي قد تصادفها غالبًا أثناء اللعب الجماعي عبر الإنترنت.
يحتوي هذا المستودع على كود إثبات المفهوم والوثائق الخاصة بأحدث ثغرة RCE تؤثر على ألعاب FROM SOFTWARE، وهي CVE-2022-24126. ورغم أن ذلك ممكن نظريًا في ألعاب أخرى، فإن التركيز ينصب على Dark Souls III لأنها اللعبة التي أجريت عليها أبحاثي. حاليًا، يوجد كود إثبات المفهوم لـ Dark Souls III فقط، وقد تم تأكيد وجود الثغرة في:
الكود القابل للاستغلال موجود أيضًا في Sekiro (الفضل: LukeYui)، على الرغم من عدم وجود طريقة لتفعيله. لم يتم تأكيد وجوده في Demon's Souls لكنه مرجح جدًا. بينما تأثر اختبار الشبكة المغلق بهذا، فإن نسخة الإصدار من Elden Ring غير متأثرة. في الواقع، تم تصحيح قائمة ضخمة من أعطال الشبكة، والقراءات/الكتابات خارج النطاق، والاستغلالات التي تسمح للاعبين بتعديل بيانات اللعبة الخاصة بأقرانهم، والتي كانت موجودة في Dark Souls III، داخل Elden Ring. الشكر موصول لـ LukeYui على تجميع هذه القائمة، ولـ FROM SOFTWARE على التصرف السريع! يسعدني أن أقول إن Elden Ring هي بلا منازع أكثر ألعاب FROM SOFTWARE أمانًا عندما يتعلق الأمر بمدى الضرر الذي يمكن أن يلحقه القراصنة.
خلافًا للاعتقاد الشائع، هذه ليست ثغرة استغلال شبكات نظير-لنظير (P2P). إنها مرتبطة بخادم المطابقة (matchmaking) وبالتالي فهي أكثر خطورة بكثير، لأنك لست بحاجة إلى المشاركة في أي نشاط متعدد اللاعبين لتكون عرضة للخطر بسبب ثغرة أخرى في خادم المطابقة (CVE-2022-24125).
مع وجود متوسط قاعدة لاعبين متزامنين يبلغ حوالي 20,000 لاعب في الأشهر التي سبقت إغلاق الخادم، كانت هذه مشكلة تتطلب إصلاحًا فوريًا، خاصة مع احتمال وجودها في Elden Ring. وبما أن FROM SOFTWARE لم تتحرك بعد أكثر من 40 يومًا من تقريري الأولي الذي تضمن مقاطع فيديو لإثبات المفهوم ووثائق تفصيلية للاستغلال (والتي يعتمد جزء كبير من هذا الملف على أساسها)، قررت إثبات وجود الثغرة علنًا بطريقة غير ضارة على أمل لفت الانتباه لمعالجتها من قبل المطورين، وقد نجح الأمر.
يسمح الفحص غير السليم لحدود المخزن المؤقت في المكدس وحقل حجم البيانات أثناء تحليل بيانات المطابقة NRSessionSearchResult للمهاجم بتنفيذ تعليمات برمجية عشوائية. يتيح تجاوز سعة المكدس (stack overflow) الكتابة فوق البايتين السفليين من vftable_ptr لكائن DLMemoryInputStream المستخدم داخليًا بواسطة قارئ التدفق، مما يعيد توجيه التنفيذ إلى تعليمات برمجية مجاورة مختارة بعناية. بعد ذلك، يسمح الاستغلال الذكي لبنية كائن DLMemoryInputStream وحقل حجم البيانات بتحقيق إعادة توجيه تعليمات برمجية عشوائية، بحيث يشير RCX إلى عنوان حزمتنا. ومن هناك، يمكن استخدام سلسلة من عمليات إعادة توجيه التعليمات البرمجية عبر استدعاءات افتراضية بإزاحات مختلفة (والتي ستقفز الآن إلى أي عناوين كتبناها في مخزن الحزمة) لتحقيق تنفيذ تعليمات برمجية عشوائية.
نواقل التوزيع هي ما يجعل هذه الثغرة تحديدًا خطيرة جدًا (بالإضافة إلى كونها أصلًا RCE). تنتقل الثغرة عبر طلبات دفع المطابقة (matchmaking push requests) التي تحتوي على معلومات NRSessionSearchResult. وهذا يعني أن المهاجم يمكنه استهداف أي شخص ينضم إلى جلسته عبر الإنترنت. على وجه الخصوص، بالنسبة لـ DS3:
PushRequestSummonSign)PushRequestAllowBreakInTarget)PushRequestVisit)PushRequestAcceptQuickMatch)هذا بالفعل سيئ جدًا، لكن الإمكانات الحقيقية تتحقق عبر طلب RequestSendMessageToPlayers:
message RequestSendMessageToPlayers {
repeated uint32 player_ids = 1;
required bytes push_message = 2;
}
يستخدم المضيف هذا الطلب لإرسال رسالة الدفع PushRequestAllowBreakInTarget مباشرة إلى الغزاة حتى يتمكنوا من الحصول على إحداثيات الظهور والانضمام إلى جلسة P2P الخاصة به. هذا كل شيء. هذه هي الطريقة الوحيدة التي تستخدم بها اللعبة هذا الطلب.
لا أستطيع التأكيد بما فيه الكفاية على مدى خطورة هذا الأمر. يمكن لأي لاعب في الأساس انتحال شخصية خادم المطابقة. باستخدام هذا الطلب لإرسال الثغرة عبر PushRequestVisit، يمكن للمهاجم استهداف أي لاعب متصل عن بُعد طالما أن معرف اللاعب الخاص به معروف. يمكن للمهاجم أيضًا إرسال الثغرة إلى قاعدة اللاعبين المتصلين بالكامل بسرعة كبيرة عن طريق إرسال طلبات متعددة، يحتوي كل منها على شريحة كبيرة من معرفات اللاعبين المحتملة.
في حين أن ثغرة RCE لا تُنقل بالضبط إلى كل لعبة، فإن الفكرة الأساسية للاستغلال التي تمنح المهاجم إعادة توجيه تعليمات برمجية عشوائية هي نفسها. إذا أمكن تحقيق ذلك، فمن المرجح جدًا العثور على سلسلة استدعاءات افتراضية أو سلسلة ROP خاصة باللعبة. تستخدم هذه "الخطوة الأولى" الثغرات التالية:
تقوم طلبات دفع المطابقة التي تحتوي على معلومات الانضمام إلى الجلسة بتخزين هذه المعلومات في تنسيق ثنائي مخصص يتكون من سلسلة من إدخالات البيانات المحددة بالطول. لكل إدخال التنسيق التالي:
struct Entry
{
uint32_t type_or_id; // not sure, but probably a type (fixed length = 2, variable length = 1 ?)
uint32_t size;
uint8_t data[size];
}
دالة اللعبة المسؤولة عن نسخ بيانات هذه الإدخالات تثق بشكل أعمى في حقل الحجم، مما يؤدي إلى قراءة خارج النطاق. يمكن استغلال ذلك من قبل عميل خبيث عن طريق تعيين حقل الحجم إلى قيم مثل 0x7FFFFFFF، مما يتسبب في فشل تخصيص الذاكرة وانهيار لعبة الضحية. لاحقًا، يُمرَّر هذا الحجم أيضًا إلى مُنشئ DLMemoryInputSteam، وهو جزء أساسي من الاستغلال.