
إثبات مفهوم لتصعيد الصلاحيات المحلية لخادم وسائط Plex - CVE-2021-42835
خادم Plex Media لنظام Windows قبل الإصدار 1.25.0.5282، معرض لثغرة وقت الفحص وقت الاستخدام (TOCTOU) التي تتيح للمستخدمين ذوي الامتيازات المنخفضة الحصول على امتيازات SYSTEM.
تومر بيلد، نتانيل كوهين، وأمير شين، باحثون أمنيون من BugSec.
يستخدم Plex لنظام Windows الخدمة PlexUpdateService.exe لتثبيت التحديثات الجديدة. تعمل الخدمة في سياق SYSTEM. عند تثبيت تحديث، تتحقق الخدمة أولاً من سلامة الملف والتوقيع الرقمي، وعند نجاح الفحوصات فقط يتم تثبيت التحديث.
في هذه العملية، بعد التحقق من السلامة والتوقيع، كان هناك خلل تصميمي في معالجة ملف التحديث بشكل غير صحيح. تم إغلاق الملف ثم إعادة فتحه لاحقاً للتثبيت.
يسمح هذا العيب للمهاجم باستبدال ملف التحديث بملف ضار بمجرد انتهاء الخدمة من التحقق من السلامة والتوقيع، مما يؤدي إلى تنفيذ كود في سياق SYSTEM.
يستخدم هذا الإثبات المفاهيمي (POC) أدوات طورها جيمس فورشو مع تعديلات طفيفة. يمكن العثور على الأصل هنا - https://github.com/googleprojectzero/symboliclink-testing-tools
لتحقيق ما سبق استخدمنا مجلد Junction يشير أولاً إلى مجلد يحتوي على ملف تحديث صالح ثم يتم التبديل إلى مجلد يحتوي على الملف الضار.
وجدنا أن ترتيب الوصول إلى الملفات كان كالتالي:
أنشأنا نقطة تحميل (mount point) على مجلد junction للإشارة إلى مجلد يحتوي على ملف التحديث الصالح. قمنا بتعيين opLock على cacert.pem مع دالة استدعاء، وبمجرد الوصول إليه نقوم بتغيير نقطة التحميل إلى المجلد الضار.
بالإضافة إلى ذلك، قمنا بإنشاء عميل RPC يقوم بتشغيل التحديث.
في PlexClient/PlexClient.cpp استبدل ROOTDIR بمسارك.
const wchar_t* pszString = L"<ROOTDIR>\\PlEXcalaison\\TOCTOU\\junction\\plex.exe"; // المسار إلى ملف التحديث.
في PlEXcalaison/BaitAndSwitch/BaitAndSwitch.cpp استبدل ROOTDIR بمسارك.
static LPCWSTR junction = L"<ROOTDIR>\\PlEXcalaison\\TOCTOU\\junction"; // المسار إلى مجلد junction، تأكد من أنه فارغ!
static LPCWSTR target1 = L"<ROOTDIR>\\PlEXcalaison\\TOCTOU\\valid"; // المسار إلى المجلد الذي يحتوي على ملف التحديث الصالح.
static LPCWSTR target2 = L"<ROOTDIR>\\PlEXcalaison\\TOCTOU\\malicious"; // المسار إلى المجلد الذي يحتوي على الملف الضار - يجب أن يكون بنفس اسم ملف التحديث.
static LPCWSTR cacert = L"C:\\Program Files (x86)\\Plex\\Plex Media Server\\Resources\\cacert.pem"; // المسار إلى cacert.pem - يمكن العثور عليه في دليل Plex.
https://ir-on.io/2021/12/02/local-privilege-plexcalation/
https://forums.plex.tv/t/security-regarding-cve-2021-42835/761510