
مخطط يدوي لبرنامج تشغيل النواة لنظام Windows x64 يستغل CVE-2025-8061 في LnvMSRIO.sys الخاص بشركة Lenovo لتنفيذ هجوم BYOVD، مع تعيين برامج تشغيل PE64 في الحلقة 0.
BYOVD Manual Mapper for Windows x64 · CVE-2025-8061
MSRMapper هو أداة تعيين يدوي لبرامج تشغيل النواة (kernel driver mapper) لنظام Windows x64 تستغل CVE-2025-8061 في برنامج التشغيل Lenovo الضعيف LnvMSRIO.sys لتنفيذ هجوم BYOVD (Bring Your Own Vulnerable Driver).
يقوم المشروع بتعيين برنامج تشغيل PE64 مباشرة في ذاكرة النواة دون استخدام sc create أو خدمة، وينفذ DriverEntry الخاص به في الحلقة 0 (ring 0). تعتمد العملية بأكملها على:
LnvMSRIO.sys.SuperfetchPfnQuery في NtQuerySystemInformation.LSTAR لتنفيذ شيفرة شل (shellcode) في الحلقة 0.NtAddAtom لاستدعاء دوال النواة مثل ExAllocatePoolWithTag و RtlCopyMemory و DriverEntry.الحالة: تم الاختبار على Windows 10 22H2 (OS Build 19045.6466). يتم تعيين برنامج التشغيل بنجاح ويُرجع
DriverEntryالقيمةSTATUS_SUCCESS(0x0).
ExAllocatePoolWithTag.KiSystemCall64، NtAddAtom، إلخ) عن طريق تنزيل ملفات PDB من Microsoft Symbol Server.NtQuerySystemInformation 0x4F)، دون الحاجة إلى متتبع جداول صفحات مخصص.LSTAR، FMASK) والذاكرة الفيزيائية من خلال LnvMSRIO.sys.LSTAR الأصلي.MmGetPhysicalAddress للحصول على PA الخاص بـ NtAddAtom.swapgs; sysret.NtAddAtom (12 بايت ) لاستدعاء دوال نواة عشوائية.\\.\WinMsrDev (الخدمة التي يوفرها LnvMSRIO.sys).ntoskrnl عبر EnumDeviceDrivers ويتحقق منها باستخدام LSTAR.PdbResolver لاستخراج RVAs لرموز النواة.NtAddAtomLSTAR.swapgs; iretq في LSTAR.PrepareStack ويمكّن AC=1 في وضع المستخدم عبر EnableACUserMode.syscall، يقفز المعالج إلى gadget، ويشغل شيفرة الشل، ويستدعي MmGetPhysicalAddress(NtAddAtom)، ويخزن PA في مخزن مؤقت للمستخدم.LSTAR وتعود إلى وضع المستخدم باستخدام swapgs; sysret.ExAllocatePoolWithTag (يُستدعى عبر اعتراض NtAddAtom المؤقت).RtlCopyMemory.DriverEntry مع DriverObject = NULL و RegistryPath = NULL.NtAddAtom..asm.LnvMSRIO.sys الضعيف (CVE-2025-8061) مثبتًا وخدمة WinMsrDev قيد التشغيل.C:\Symbols.يستخدم هذا المشروع CMake. للبناء من سطر الأوامر:
أنشئ حل Visual Studio 2022:
cmake -B build -G "Visual Studio 17 2022" -A x64
ابنِ في وضع Release:
cmake --build build --config Release
ستكون الملفات التنفيذية الناتجة في build/bin/Release/ (أو مسار مشابه حسب إعدادات CMake).
بدلاً من ذلك، يمكنك فتح build/KernelLoader.sln الناتج في Visual Studio 2022 والبناء من هناك.
تأكد من تجميع ShellcodeAsm.asm و EnableAC.asm باستخدام MASM. يتولى CMakeLists.txt المرفق ذلك تلقائيًا.
إذا كنت بحاجة لتعديل إعدادات البناء، فحرر CMakeLists.txt.
ثبّت وابدأ خدمة LnvMSRIO.sys:
sc create WinMsrDev type= kernel binPath= C:\path\to\LnvMSRIO.sys
sc start WinMsrDev
شغّل KernelLoader.exe كمسؤول (Administrator):
KernelLoader.exe
لرؤية مخرجات DbgPrint لبرنامج التشغيل المعيَّن، استخدم DebugView (من Sysinternals) كمسؤول مع:
Capture → Capture KernelOptions → Enable Verbose Kernel OutputHKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter
DWORD باسم Default بقيمة .DBGHELP: ... - unmatched التي تظهر في بعض سجلات PdbResolver هي شكلية. يتم تحميل PDB على قاعدة افتراضية مصطنعة ولا يزال SymFromName يعمل بشكل صحيح. لا تؤثر على استخراج الرموز.EnumDeviceDrivers قاعدة غير صحيحة. يحسب هذا المشروع القاعدة الحقيقية باستخدام LSTAR - KiSystemCall64.NtAddAtom مؤقت ويُستعاد بعد كل استدعاء. ومع ذلك، استخدم هذا فقط في بيئات محكومة.SMEP/SMAP ممكّنة. يتم تعطيلها مؤقتًا عبر CR4 واستعادتها قبل العودة إلى وضع المستخدم.jmp raxEnumDeviceDrivers قاعدة غير صحيحة؛ يتم حساب قاعدة النواة الحقيقية باستخدام LSTAR - KiSystemCall64.0xFFFFFFFF