
بحث رسالة الماجستير حول CVE-2024-51324 (BYOVD). استغلال متقدم مع 4 أوضاع تشغيل (SCANNER, LOADER, KILLER, CLEANUP)، التحقق من برنامج التشغيل باستخدام SHA-256، وتوثيق أكاديمي كامل. تغطي قطعة المحفظة أمن برامج تشغيل نواة Windows، وهندسة عكسية لـ IOCTL، واستغلال Bring Your Own Vulnerable Driver.
إحضار برنامج تشغيل ضعيف خاص بك (BYOVD) — مضاد الفيروسات بايدو
BdApiUtil64.sys
ثلاث بدائيات نواة غير موثقة: إنهاء العمليات، حذف الملفات العشوائي،
وحذف الملفات قيد الاستخدام مع تجاوزSectionObjectPointer
المتأثر: مضاد الفيروسات بايدو الإصدار v5.2.3.116083 (BdApiUtil64.sys)
تحميل برنامج التشغيل الضعيف إلى النواة (وضع LOADER)
يحتوي هذا المستودع على بحث رسالة الماجستير الخاص بي حول CVE-2024-51324، وهو ثغرة من نوع إحضار برنامج تشغيل ضعيف خاص بك (BYOVD) في برنامج تشغيل النواة لمضاد الفيروسات بايدو BdApiUtil64.sys.
يسجل السجل الوطني للثغرات (NVD) درجة أساسية لـ CVSS v3.1 تبلغ 3.8 (منخفضة) مع المتجه AV:N/AC:L/PR:H/UI:N/S:U/C:L/I:L/A:N و CWE-269 (إدارة صلاحيات غير سليمة). لا تعكس هذه الدرة واقع الهجوم المحلي الموثق في هذا البحث: بمجرد تحميل برنامج التشغيل من قبل مسؤول (خطوة واحدة يمكن تحقيقها عبر الهندسة الاجتماعية أو أي تصعيد صلاحيات محلي)، يمكن لأي عملية لاحقة — بما في ذلك عمليات الصندوق الرملي أو عمليات المستخدم العادي — إرسال استدعاءات IOCTL دون فحوص صلاحيات إضافية. درجة CVSS v3.1 التي قدرها الباحث بـ 7.8 (عالية) مع المتجه AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H تلتقط بشكل أكثر دقة واقع الاستغلال بعد التحميل. تتم مناقشة كلتا الدرجتين في الوثائق الفنية.
يقوم برنامج التشغيل بإنشاء كائن الجهاز \Device\BdApiUtil مع SecurityDescriptor = NULL، مما يسمح لأي عملية بغض النظر عن مستوى التكامل بفتح مقبض وإرسال استدعاءات IOCTL. يكشف التحليل الثابت عبر Ghidra 11.0.3 أن الآلية الداخلية أكثر أهمية مما تم توثيقه سابقًا: يستخدم برنامج التشغيل PsLookupProcessByProcessId + ObOpenObjectByPointer(KernelMode) بدلاً من ZwOpenProcess، متجاوزًا SeAccessCheck بالكامل. تم توصيف ثلاث بدائيات IOCTL بالكامل، اثنتان منهما ليس لهما توثيق عام سابق.
CVE-2024-51324/
├── README.md
├── LICENSE
│
├── drivers/
│ └── BdApiUtil64.sys # برنامج التشغيل (غير موزع)
│
├── exploit/
│ ├── exploit-explanation.md
│ └── byovd_killer.py # الاستغلال الرئيسي — 4 أوضاع تشغيل
│
└── docs/
├── screenshots/
│ ├── 01-byovd-scan.png
│ ├── 02-byovd-scan-target.png
│ ├── 03-byovd-load.png
│ ├── 04-byovd-load-custom.png
│ ├── 05-kill-name.gif
│ ├── 06-kill-pid.gif
│ ├── 07-kill-limit.gif
│ ├── 08-dry-run.gif
│ └── 09-byovd-cleanup.png
│
└── analysis/
├── 01-root-cause.md
├── 02-driver-analysis.md # تحليل Ghidra كامل، ثلاث بدائيات، اختبار PPL
└── 03-timeline.md
BdApiUtil64.sys (SHA-256: 47EC51B5F0EDE1E70BD66F3F0152F9EB536D534565DBB7FCC3A05F542DBE4428)python exploit/byovd_killer.py --scan
python exploit/byovd_killer.py --scan --target lsass.exe
python exploit/byovd_killer.py --load
python exploit/byovd_killer.py --load --driver C:\path\to\BdApiUtil64.sys
python exploit/byovd_killer.py --load --service-name MyService
python exploit/byovd_killer.py --kill notepad.exe
python exploit/byovd_killer.py --pid 1234
python exploit/byovd_killer.py --kill notepad.exe --max-instances 2
python exploit/byovd_killer.py --kill notepad.exe --dry-run
python exploit/byovd_killer.py --cleanup
python exploit/byovd_killer.py --cleanup --service-name MyService









حددت الهندسة العكسية لـ BdApiUtil64.sys عبر Ghidra 11.0.3 سطح هجوم أوسع مما توثقه أي مصادر عامة سابقة:
0x800024B4)سلسلة الإرسال لها ثلاثة مستويات:
IOCTL 0x800024B4
└─ FUN_00028630 (موزع IRP_MJ_DEVICE_CONTROL)
└─ FUN_00015230 (غلاف: يتحقق من كود IOCTL وحجم المخزن المؤقت = 4 بايت)
└─ FUN_000152b0 (معالج القتل — موقع الثغرة)
المعالج المعاد بناؤه (Ghidra):
if ((param_1 != 0) && (param_1 != 4)) {
PsLookupProcessByProcessId(param_1, &local_res10);
ObOpenObjectByPointer(
local_res10,
0x200, // OBJ_KERNEL_HANDLE
0, // PassedAccessState: NULL
0x1fffff, // PROCESS_ALL_ACCESS
0, // ObjectType: NULL
0, // AccessMode: KernelMode ← يتجاوز SeAccessCheck
local_res18
);
ZwTerminateProcess(local_res18[0], 0);
}
لماذا يتجاوز KernelMode SeAccessCheck:
مسار ZwOpenProcess:
NtOpenProcess → ObOpenObjectByName → SeAccessCheck
(يتحقق من DACL، رمز المتصل، مستوى التكامل)
يمكن أن يعيد STATUS_ACCESS_DENIED
مسار ObOpenObjectByPointer(KernelMode):
SeAccessCheck ← لا يتم استدعاؤه
→ يتم منح مقبض PROCESS_ALL_ACCESS دون شروط
ZwOpenProcess غائب عن جدول استيراد برنامج التشغيل. الوصف المبني على ZwOpenProcess الموجود في المصادر السابقة غير صحيح تقنيًا.
0x80002648)يتلقى المعالج FUN_00013bb0 مسار Unicode، ويتحقق من InputBufferLength ≥ 0x208، ويفوض إلى FUN_00013c10. يفتح المعالج الفرعي الملف في وضع النواة (لا يوجد SeAccessCheck على رمز المتصل) ويرسل طلب IRP من نوع IRP_MJ_SET_INFORMATION مع FileInformationClass = 0xD (FileDispositionInformation)، مما يضع علامة على الملف للحذف. يمكن حذف أي ملف يمكن للنواة الوصول إليه بغض النظر عن أذونات NTFS.
0x8000264C)يصل المعالج FUN_000139d0 إلى FileObject->SectionObjectPointer (الإزاحة 0x28 في FILE_OBJECT) ويقوم مؤقتًا بتعيين حقلين إلى الصفر قبل إرسال طلب IRP للحذف:
plVar1 = FileObject->SectionObjectPointer;
plVar1[2] = 0; // DataSectionObject → NULL
plVar1[0] = 0; // ImageSectionObject → NULL
IofCallDriver(device, irp);
KeWaitForSingleObject(...);
// استعادة بعد الانتهاء
plVar1[2] = DataSectionObject_backup;
plVar1[0] = ImageSectionObject_backup;
يتحقق IopDeleteFile من هذه المؤشرات قبل الموافقة على FileDispositionInformation. بتعيينها إلى الصفر، يجعلها المعالج تظهر كما لو أن الملف غير معيّن في الذاكرة، متجاوزًا حماية الملفات قيد الاستخدام. يمكن لهذه البدائية حذف ملف ثنائي لعامل EDR قيد التشغيل من القرص دون إنهاء العملية أولاً.
سلسلة القضاء الكاملة على EDR:
1. إنهاء عملية EDR (IOCTL 0x800024B4)
2. حذف ثنائي EDR على القرص (IOCTL 0x8000264C) ← يعمل حتى إذا كان معيّنًا في الذاكرة
3. منع إعادة التشغيل ← الملف التنفيذي لم يعد موجودًا على القرص
PPL (العملية المحمية الخفيفة) هي التخفيف الوحيد في وقت التشغيل الذي يقاوم إنهاء العمليات القائم على ObOpenObjectByPointer(KernelMode) من هذا البرنامج التشغيل.
--cleanupمعرف الحدث 7045 هو الأثر الوحيد الذي يبقى بعد دورة هجوم كاملة مع التنظيف. يحتوي على اسم الخدمة، ImagePath (مسار الثنائي الكامل)، نوع الخدمة، وختم زمني للإنشاء.
تنفيذ wevtutil cl System لإزالة معرف الحدث 7045 يولد معرف الحدث 1102 في قناة الأمان، مسجلاً من قام بمسح السجل ومتى. هذا يجعل التلاعب بالسجل قابلاً للكشف حتى لو تم تدمير الأثر الأصلي.
| إجراء المهاجم | الأثر الناتج | القناة | الاستمرارية |
|---|---|---|---|
wevtutil cl System | تم حذف معرف الحدث 7045 |
title: BYOVD Attack via BdApiUtil64.sys (CVE-2024-51324)
id: a3f7c2e1-8b4d-4f9a-b6e3-2d1c9f8a7b5e
status: experimental
logsource:
product: windows
service: system
detection:
selection_eventid:
EventID: 7045
selection_driver:
- ServiceName|contains: 'BdApi'
- ImagePath|contains: 'BdApiUtil64.sys'
condition: selection_eventid and selection_driver
level: high
tags:
- attack.defense_evasion
- attack.t1562.001
- attack.privilege_escalation
- attack.t1068
قاعدة Sigma كاملة وتكوين Sysmon (معرف الحدث 6 حسب تجزئة SHA-256 + معرف الحدث 13 حسب مفتاح التسجيل) متوفرة في docs/detection/.
| المستند | الوصف |
|---|---|
| تحليل السبب الجذري |
هذا البحث جزء من رسالة الماجستير في الأمن السيبراني الخاصة بي (UCAM — Campus Internacional de Ciberseguridad)، بتحليل ثغرات N-Day عبر بيئات متعددة.
يمثل هذا CVE متجه برنامج تشغيل النواة في Windows / BYOVD ضمن الرسالة، مظهرًا:
ZwOpenProcess غائب؛ الآلية الفعلية هي ObOpenObjectByPointer(KernelMode))الكلمات المفتاحية: BYOVD · برنامج تشغيل النواة · IOCTL · Ghidra · إنهاء العملية ·
حذف الملفات · SectionObjectPointer · ObOpenObjectByPointer · التهرب الدفاعي ·
CVE-2024-51324
Annais Molina (devianntsec) — طالبة ماجستير في الأمن السيبراني
ترخيص MIT — انظر LICENSE
هذا المستودع مقدم لأغراض التعليم والبحث الأمني فقط،
كجزء من رسالة ماجستير أكاديمية. تم إجراء جميع الاختبارات على أجهزة افتراضية معزولة دون تعرض للشبكة. برنامج التشغيل الضعيف (BdApiUtil64.sys) غير موزع في هذا المستودع — يجب الحصول عليه بشكل مستقل. استخدم فقط على الأنظمة التي تمتلكها أو لديك إذن كتابي صريح لاختبارها. الاستخدام غير المصرح به ضد الأنظمة غير قانوني وقد يؤدي إلى محاكمة جنائية.
| الجانب | الوصف |
|---|
| تصحيح تقني | ZwOpenProcess غائب عن جدول الاستيراد؛ الآلية الفعلية هي PsLookupProcessByProcessId + ObOpenObjectByPointer(KernelMode)، والتي تتجاوز SeAccessCheck دون شروط |
| ثلاث بدائيات موثقة | إنهاء العملية (0x800024B4)، حذف الملفات العشوائي (0x80002648)، وحذف الملفات قيد الاستخدام مع تجاوز SectionObjectPointer (0x8000264C) — الأخيرتين ليس لهما توثيق عام سابق |
| أربعة أوضاع تشغيل | LOADER، KILLER، SCANNER، وCLEANUP — إدارة دورة حياة كاملة |
| التحقق من SHA-256 | يتم التحقق من تجزئة برنامج التشغيل قبل أي محاولة تحميل |
| اختبار تجريبي لـ PPL | 10 محاولات لكل فئة عملية تؤكد أن PPL هي التخفيف الوحيد في وقت التشغيل |
| تحليل جنائي | معرف الحدث 7045 يبقى بعد التنظيف؛ معرف الحدث 1102 كأثر سجل يفضح نفسه |
| قواعد الكشف | قاعدة Sigma وتكوين Sysmon (معرف الحدث 6 حسب التجزئة + معرف الحدث 13 حسب مفتاح التسجيل) |
| إعادة تقييم CVSS | توثيق الفجوة بين الدرجة الرسمية لـ NVD (3.8 منخفضة) وشدة الاستغلال المحلي المقدرة من قبل الباحث (7.8 عالية) |
| الوضع | الأمر | الصلاحيات | الوصف |
|---|
| SCANNER | --scan | أي مستخدم | معلومات حالة النظام وبرنامج التشغيل |
| LOADER | --load | مسؤول | تحميل برنامج التشغيل عبر إنشاء خدمة نواة |
| KILLER | --kill / --pid | أي مستخدم | إنهاء العمليات عبر IOCTL |
| CLEANUP | --cleanup | مسؤول | إيقاف خدمة برنامج التشغيل وحذفها |
| IOCTL | المعالج | البدائية | التوثيق السابق |
|---|
0x800024B4 | FUN_000152b0 | إنهاء العملية | جزئي (الآلية غير صحيحة) |
0x80002648 | FUN_00013bb0 | حذف الملفات العشوائي | لا يوجد |
0x8000264C | FUN_00013850 | حذف الملفات قيد الاستخدام (تجاوز SectionObjectPointer) | لا يوجد |
| العملية | PPL نشط | قابل للإنهاء | السبب |
|---|
notepad.exe | لا | ✅ 10/10 | لا حماية |
regedit.exe | لا | ✅ 10/10 | لا حماية |
spoolsv.exe | لا | ✅ 9/10 | إعادة تشغيل من SCM في حالة واحدة |
MsMpEng.exe | لا (لا يوجد PPL في بيئة الاختبار) | ✅ 8/10 | تباين طفيف في التوقيت |
lsass.exe | لا (RunAsPPL غائب) | ✅ 6/10 | تباين في الحالة |
csrss.exe | نعم (PPL غير مشروط) | ❌ 0/10 | STATUS_ACCESS_DENIED |
| موجود | غائب |
|---|
PsLookupProcessByProcessId | ZwOpenProcess |
ObOpenObjectByPointer | SeAccessCheck |
ZwTerminateProcess | SePrivilegeCheck |
PsGetCurrentProcess | |
IoGetRequestorProcess |
| السيناريو | الهدف | التأثير |
|---|
| إنهاء EDR/مضاد الفيروسات | MsMpEng.exe, SentinelAgent.exe | التهرب من الدفاعات |
| حذف ثنائي EDR (قيد الاستخدام) | ملف EDR التنفيذي على القرص | منع إعادة التشغيل بعد الإنهاء |
| تعطيل سجلات التدقيق | خدمة EventLog | التلاعب بالأدلة الجنائية |
| تجاوز العملية المحمية | lsass.exe (بدون RunAsPPL) | تسهيل الوصول إلى بيانات الاعتماد |
| تحضير برامج الفدية قبل التشفير | عوامل الأمان | سلسلة تهرب دفاعي كاملة |
| الأثر | الحالة بعد التنظيف |
|---|
| الخدمة في SCM | تمت إزالتها |
برنامج التشغيل في driverquery | تمت إزالته |
| كائن الجهاز | غير قابل للوصول |
| مفتاح التسجيل | تمت إزالته |
| معرف الحدث 7045 | يبقى — لا يمكن إزالته بواسطة sc delete |
| System |
| — |
wevtutil cl System | تم توليد معرف الحدث 1102 | Security | دائم |
التحكم في الوصول المفقود في معالج IRP_MJ_DEVICE_CONTROL |
| تحليل برنامج التشغيل | تحليل Ghidra كامل، ثلاث بدائيات IOCTL، اختبار PPL، تحليل جدول الاستيراد |
| الجدول الزمني لـ CVE | التسلسل الزمني للاكتشاف، الإفصاح، والتصحيح |