
معلومات وPoC لثغرة CVE-2024-45200، ثغرة تجاوز سعة المخزن المؤقت "KartLANPwn" في لعبة Mario Kart 8 Deluxe
معلومات وإثبات المفهوم لثغرة تجاوز سعة المخزن المؤقت المستندة إلى المكدس "KartLANPwn" في لعبة Mario Kart 8 Deluxe
كتبها Chad Hyatt
KartLANPwn هي ثغرة في الاستخدام الخاطئ من لعبة Mario Kart 8 Deluxe لمكتبة الشبكات من نظير إلى نظير Pia، حيث يتم أحيانًا استدعاء التطبيقات الفردية لـ "CopyAppData" مع outBufSize أكبر من المخزن المؤقت out نفسه. يمكن أن يؤدي هذا إلى تنفيذ كود عن بُعد (RCE) في وضع المستخدم على أجهزة الأقران إذا تم ربطه بتسريب معلومات. تؤثر KartLANPwn على استخدام تطبيقات Pia للعب الجماعي LAN/LDN واللعب الجماعي عبر الإنترنت NEX.
تؤثر هذه الثغرة على جميع إصدارات Mario Kart 8 Deluxe حتى v3.0.1 (v3.0.2 للصين/Tencent)، وقد تم عرضها تحديدًا عبر ميزة "LAN Play" في الإصدار التجاري v3.0.1 من MK8DX.
اعتبارًا من 2024/09/11، نشرت Nintendo إصلاحًا لـ KartLANPwn إلى جانب v3.0.3 لجميع المناطق، باستثناء الصين. اعتبارًا من 2024/09/27، تم إصدار v3.0.3 الآن أيضًا للصين. لقد كشفنا عن هذه المعلومات بأمان بعد الحصول على إذن من Nintendo.
تُستخدم مكتبة الشبكات الاحتكارية Pia في ألعاب Nintendo Switch من الطرف الأول التي تدعم اللعب المحلي أو عبر الإنترنت لتوفير تطبيقات كود شبكة من نظير إلى نظير لبروتوكول LAN/LDN (اللعب الجماعي المحلي) وبروتوكول NEX، المستخدم للعب الجماعي عبر الإنترنت.
لأغراض العرض التوضيحي، سنركز تحديدًا على بروتوكول LAN الخاص بـ Pia. يفتح جهاز مضيف الغرفة مقبس UDP "اكتشاف" على :30000 على عنوان بث محلي (255.255.255.255) ومن المفترض أن تقوم الأجهزة الأخرى على نفس الشبكة بالإعلان عن "طلبات استعراض" من المقبس الخاص بها (أيضًا على :30000) إلى جهاز التوجيه لإعادة توجيهها إلى الأجهزة الأخرى على نفس الشبكة.
يرسل مضيف الغرفة (خادمنا) رد "استعراض" أوليًا من المفترض أن يحتوي على معلومات حول الغرفة (اسم عرض المضيف، بيانات Mii، عدد اللاعبين، إلخ). داخل حزمة الرد على الاستعراض، يمكن التحكم في طول بيانات التطبيق التي سيتم نسخها إلى المخزن المؤقت out بقيمة تصل إلى 150، على الرغم من أن out يبلغ عرضه 128 بايت فقط. وهذا يسمح بتجاوز القيم في إطار المكدس (في هذه الحالة تحديدًا، من أجل pop {r4-r8, pc}).
على الأقل في حالة إصدار Pia الذي تستخدمه MK8DX، بالنسبة لما نركز عليه، يتم إنشاء حزم الرد على الاستعراض لـ LAN على النحو التالي:
(جميع أنواع الأعداد الصحيحة مُرمّزة بنمط big-endian)
يتبع باقي معلومات الجلسة، على الرغم من أنها غير مهمة لصنع حزمة لـ KartLANPwn
LAN_CopyAppData" كود شبه رمزيلأغراض العرض التوضيحي، فيما يلي كود شبه رمزي تقريبي من تطبيق LAN لـ "CopyAppData". على الرغم من عدم وجود خطأ جوهري في هذه الوظيفة بمفردها، فإن الاستخدام غير الصحيح (في حالة MK8DX) يمكن أن يسمح بالكتابة فوق إطار المكدس بواسطة بيانات التطبيق المُدخلة في packet.
(الوظيفة موجودة على @ +0xA0F8C0 في main لإصدار MK8DX v3.0.1)
void LAN_CopyAppData(int* r0, int packet, int out, uint outBufSize) {
int u1 = 68612;
if (out != NULL) {
// The actual length to read from the `packet` buffer at the start of our
// application data (which our 'server' controls)
uint appDataLength = *(uint *)(packet + 432);
// In some cases, outBufSize is input as a larger number than the bounds of the
// `out` buffer, which allows a stack buffer overflow (in our specific case, `*out`
// is 128 bytes long, and outBufSize is 150!)
if (appDataLength <= outBufSize) {
memcpy(out, packet + 48, outBufSize); // packet[47], start of application data
u1 = 0;
}
*r0 = u1;
return;
}
*r0 = 68615;
return;
}
انظر kartlanpwn-poc.py
لقد قدمنا نصًا برمجيًا بسيطًا لإثبات المفهوم مكتوبًا بلغة Python، يعمل كمضيف غرفة مزيف يرد على أجهزة الأقران بحزمة "رد استعراض" مصممة خصيصًا ستُعطّل عملية اللعبة عند فتح قائمة "LAN Play" في MK8DX من جهاز على نفس الشبكة التي يعمل عليها الكمبيوتر الذي يشغّل النص البرمجي.
إما تنزيل ملف zip للمستودع مباشرة من GitHub، أو الاستنساخ باستخدام git:
git clone https://github.com/latte-soft/kartlanpwn.git && cd kartlanpwn
python3 kartlanpwn-poc.py
شاهد العرض التوضيحي بالفيديو (YouTube):
وللمهووسين بمعمارية ARM، إليكم لقطة شاشة من GDB لتعطل العملية الناتج:

استغرق الأمر بضعة أيام فقط لمعرفة تفاصيل الثغرة نفسها، لكن الاستفادة الفعلية من التجاوز؟ فتلك مسألة مختلفة ومعقدة تمامًا. وضع المستخدم في نواة Nintendo Switch لا يمزح؛ إنه صارم للغاية في كل زاوية يمكن أن يكون فيها. قضينا ساعات طويلة في تبادل والعبث بأفكار وخيوط مختلفة، دون جدوى في النهاية لتنفيذ كود حقيقي (عشوائي). في حالتنا تحديدًا، حتى استغلال ROP الموثوق لم يبدُ ممكنًا جدًا، نظرًا لأن جميع الوظائف المتعلقة بالشبكات تقريبًا كانت قائمة على الفئات، كما كان لدينا وصول كتابة مباشر فقط إلى r4-r8. (*_this حبيبي) بالإضافة إلى ذلك، بدون تسريب معلومات مسبق، ليس من السهل جدًا تخطي mov r4, r0 أو ما شابه ذلك للتحكم في مؤشر _this. أشياء ممتعة!
أما على صعيد التقرير، كانت العملية سلسة نسبيًا هذه المرة مع فرز Nintendo من وقت التقرير حتى الكشف. ورغم أن دفعة المكافأة البالغة $512 كانت أقل بكثير مما توقعت (أليست كذلك دائمًا؟)، فأي شيء أفضل من ظهور "نينجا Nintendo" عند بابي..
لقد تعلمت Nintendo بالتأكيد درسها مما كانت عليه الأيام الأبسط لأجهزة Wii و3DS وحتى Wii U. لقد أدّوا واجبهم؛ فنجاح أي استغلال يتجاوز تعطيل الخدمة (DoS) من وضع المستخدم على Switch يكاد يكون مستحيلًا. ASLR، والصفحات المفروضة غير القابلة للتنفيذ (لا يمكنك الكتابة مباشرة إلى صفحات الذاكرة القابلة للتنفيذ، تحتاج الألعاب إلى استخدام وحدة نظام مخصصة فقط من أجل JIT!)، وعدم القدرة على ROP، من بين نقاط الألم الأخرى. (بانتظار مجتمع التعديل ليدحض هذه الكلمات في أي وقت قريب..) من ناحية أخرى، في الأشهر القليلة الماضية، تعلمت الكثير عن منصة ومعمارية جديدة تمامًا (بالنسبة لي على أي حال) في فترة زمنية قصيرة جدًا، ناهيك عن الأشخاص الرائعين الذين تشرفت بالعمل معهم على KartLANPwn! (شكرًا Pablo وfishguy 😄)
KartLANPwn © 2024 مرخّص بموجب CC BY 4.0.
لعرض نسخة من هذا الترخيص، تفضل بزيارة https://creativecommons.org/licenses/by/4.0/
| الفهرس | النوع شبه الرمزي | الوصف |
|---|
| 0 | u8 | نوع الحزمة (0x1) |
| 1 | u32 | حجم جسم معلومات الجلسة (1266 في حالتنا) |
| 5 | (42 بايت) | حقول معلومات جلسة متنوعة، غير ذات صلة بنا |
| 47 | (0x180 بايت) | بداية مساحة بيانات التطبيق |
| 431 | u32 | طول بيانات التطبيق |
| التاريخ | المعلومات |
|---|
| 2024/07/18 | تم إرسال التقرير إلى Nintendo عبر HackerOne |
| 2024/07/31 | تم فرز التقرير داخليًا |
| 2024/09/11 | تم إصدار الإصلاح مع Mario Kart 8 Deluxe v3.0.3 لجميع المناطق، باستثناء الصين |
| 2024/09/12 | تم دفع المكافأة بواسطة Nintendo |
| 2024/09/12 | اكتشف باحثون آخرون بسرعة كبيرة الإصلاح لـ "ثغرة أمنية في كود شبكة اللعبة" في bindiff لإصدار v3.0.3 |
| 2024/09/27 | تم إصدار Mario Kart 8 Deluxe v3.0.3 لمنطقة الصين |
| 2024/09/29 | منحت Nintendo الإذن بالكشف، وتم جعل هذا المستودع عامًا |
| 2024/09/30 | تم نشر CVE-2024-45200 بواسطة NVD |