
KslDump — Defender가 부엌에 이미 칼을 두고 갔는데, 왜 직접 칼을 가져오겠는가?
저는 2026년 3월 7일에 이 문제를 Microsoft에 보고했습니다. 하지만 거의 20일 전에 게임 해킹 커뮤니티에서 이미 이를 리버싱하여 공개적으로 논의하고 있었습니다. 제 쪽에서는 그들의 프로젝트를 따르지 않았고 이에 대해 전혀 알지 못했습니다. 또한 이것이 완전히 별개이고 관련 없는 두 프로젝트라는 점도 명확합니다.
Defender가 부엌에 칼을 이미 두고 갔는데 왜 직접 칼을 가져오는가?
KslDump는 Microsoft 서명 구성요소만을 사용하여 PPL로 보호된 LSASS에서 자격 증명을 추출합니다. 익스플로잇이 배포되지 않습니다. 드라이버가 로드되지 않습니다. 전체 공격 체인은 Windows Defender와 함께 사전 설치되어 제공됩니다. Microsoft는 실행 중인 버전(wd\KslD.sys)에서 MmCopyMemory를 null로 설정하여 패치했지만, 오래된 취약한 버전(drivers\KslD.sys)을 디스크에 그대로 남겨두었습니다. 공격자는 아무것도 가져오지 않습니다. 단지 서비스를 Microsoft가 정리하는 것을 잊어버린 지점으로 다시 가리킬 뿐입니다.
https://github.com/user-attachments/assets/78dfce25-56b3-4eb8-9de2-7c183601e597
KslD.sys는 Microsoft Defender와 함께 제공되는 커널 드라이버입니다. Microsoft 서명되어 있으며, 신뢰할 수 있는 커널 모듈로 로드되고, 사용자 모드에서 접근 가능한 디바이스 오브젝트 \\.\KslD를 노출합니다.
드라이버는 IOCTL 0x222044를 허용하며, 디바이스 핸들을 열 수 있는 모든 프로세스에 제한 없는 커널 및 물리 메모리 액세스를 제공하는 여러 하위 명령을 포함합니다.
| 하위 명령 | 기능 | 영향 |
|---|---|---|
| 2 | CR3, IDTR 및 기타 CPU 제어 레지스터를 사용자 모드로 반환 | 즉각적인 KASLR 무력화 |
| 12 | 공격자가 제어하는 주소와 크기로 MmCopyMemory() 호출 | 임의의 커널/물리 메모리 읽기 |
디바이스 핸들에 대한 유일한 관문은 드라이버의 서비스 키 아래 레지스트리 키(AllowedProcessName)에 저장된 프로세스 이름 문자열입니다. 이 값은:
차이점은 CCommand::Initialize의 한 줄입니다:
// 82 KB version (patched) — deliberately clears the pointer:
v3 = MmGetSystemRoutineAddress(L"MmCopyMemory");
if (v3 >= 0) {
*(a1 + 24) = 0; // ← NULLs it — SubCmd 12 is dead
}
// 333 KB version (vulnerable) — stores the pointer:
ptr = MmGetSystemRoutineAddress(L"MmCopyMemory");
if (ptr) {
*(this + 0x18) = ptr; // ← Keeps it — SubCmd 12 works
}
Defender 플랫폼 업데이트는 패치된 82 KB 버전을 drivers\wd\에 넣고 ImagePath를 가리키는 반면, 이전 333 KB 버전은 drivers\에 남아 있습니다. 테스트된 시스템에서 이전 바이너리는 제거되지 않았습니다. 익스플로잇은 단순히 ImagePath를 취약한 버전으로 다시 전환하고 서비스를 다시 시작합니다. 두 바이너리 모두 Microsoft 서명되어 있으며 OS에서 신뢰합니다.
Microsoft의 공개 문서에 따르면 KB4052623은 Defender 드라이버를 System32\drivers\wd로 이동하는 역사적인 변경을 포함하여 Defender 플랫폼 업데이트를 제공하며, Windows 서비스는 NTFS 하드 링크를 통해 WinSxS 백업 구성 요소 저장소 파일을 유지하고 정리 중에만 대체된 구성 요소 버전을 제거합니다. 테스트된 시스템에서 이는 최신 82 KB KslD.sys가 Defender 플랫폼 업데이트 경로를 통해 도착할 수 있었던 반면, 이전 333 KB System32\drivers\KslD.sys는 더 새로운 CBS 버전으로 대체될 때까지 현재 CBS 백업 구성 요소 저장소 복사본으로 남아 있었던 이유를 설명합니다.
Microsoft는 BYOVD 공격을 방지하기 위해 취약한 드라이버 차단 목록(DriverSiPolicy.p7b)을 유지합니다. 이 차단 목록은 HVCI를 통해 적용되며 알려진 취약한 서명된 드라이버가 로드되는 것을 차단합니다.
Microsoft의 자체 문서에 따르면:
"취약한 드라이버 차단 목록은 Windows 생태계 전체에서 Microsoft가 개발하지 않은 드라이버에 대한 시스템 보안 강화를 위해 설계되었습니다"
Microsoft의 자체 드라이버는 설계상 차단 목록에서 제외됩니다.
근본 원인은 간단합니다: MmCopyMemory는 PPL을 존중하지 않습니다.
PPL(Protected Process Light)은 LSASS에 대한 OpenProcess 및 ReadProcessMemory 호출을 차단하여 자격 증명 도용을 방지하기 위해 설계되었습니다. 그러나 PPL은 사용자 모드 API 경로만 보호합니다. 커널 모드 물리 메모리 읽기에는 권한이 없습니다.
KslD.sys는 사용자 모드 코드에 물리 또는 가상 주소로 메모리를 복사하는 Microsoft의 자체 커널 API인 MmCopyMemory()에 대한 직접 경로를 제공합니다. 드라이버는 다음을 수행합니다:
결과: Microsoft 서명 드라이버가 완전한 PPL 우회 기능을 기본 제공합니다.
취약점의 핵심은 하위 명령 12 — 제한 없는 MmCopyMemory() 래퍼입니다:
IOCTL: 0x222044
Input: struct {
DWORD SubCmd; // 12
DWORD Reserved; // 0
QWORD Address; // Target VA or PA
QWORD Size; // Bytes to read
DWORD Flags; // 1 = Physical, 2 = Virtual
DWORD Padding;
}
Output: Raw memory contents (up to Size bytes)
물리 읽기(Flags = 1)가 중요한 기본 요소입니다. 물리 메모리 액세스는 프로세스 보호 수준, EPROCESS 플래그 또는 사용자 모드 API 제한의 영향을 받지 않으며, 이것이 PPL을 우회하는 방법입니다.
가상 읽기(Flags = 2)는 커널 가상 주소를 직접 읽으며, 수동 페이지 테이블 변환 없이 커널 구조(EPROCESS, ntoskrnl 내보내기)를 탐색하는 데 유용합니다.
┌──────────────────────────────────────────────────────────────────┐
│ KslDump Attack Flow │
├──────────────────────────────────────────────────────────────────┤
│ │
│ 1. Registry Edit ImagePath ← vulnerable 333KB KslD.sys *│
│ │ AllowedProcessName ← our process │
│ │ sc stop/start KslD │
│ ▼ │
│ 2. KASLR Bypass SubCmd 2 → CR3 + IDTR │
│ │ IDT → lowest ISR → ntoskrnl base │
│ ▼ │
│ 3. Kernel Walk PsInitialSystemProcess → SYSTEM EPROC │
│ │ ActiveProcessLinks → find lsass.exe │
│ │ Read lsass DTB from EPROCESS+0x28 │
│ ▼ (all via SubCmd 12, flags=2) │
│ │
│ 4. Physical Read Page table walk using lsass DTB │
│ │ MmCopyMemory() reads lsass pages │
│ │ *** BYPASSES PPL *** │
│ ▼ (SubCmd 12, flags=1) │
│ │
│ 5. Key Extraction Find lsasrv.dll via PEB → LDR │
│ │ Scan .text for LSA key signatures │
│ │ Follow BCRYPT chain → AES + 3DES + IV │
│ ▼ │
│ 6. Credential Dump Walk LogonSessionList │
│ Decrypt MSV1_0 credentials │
│ → NT hashes │
│ │
└──────────────────────────────────────────────────────────────────┘
cryptography 패키지 (pip install cryptography)C:\Windows\System32\drivers\KslD.sys)이 공격은 타사 드라이버, 서명되지 않은 코드, 익스플로잇이 필요하지 않습니다. 모든 것이 Microsoft 서명, Microsoft 제공이며 이미 시스템에 있습니다. 취약한 드라이버는 자체 패치 옆에 디스크에 존재하며, 정확히 이런 유형의 공격을 방지하기 위한 차단 목록에서 제외되어 있습니다.
이 취약점은 Microsoft 보안 대응 센터(MSRC)에 보고되었습니다. MSRC는 다음과 같은 근거로 **"취약점이 아님"**으로 종료했습니다:
"설명된 공격은 사전에 존재하는 관리자 권한에 의존합니다. 해당 권한이 어떻게 획득되었는지 보여주는 증거가 제공되지 않았습니다. 해당 권한을 부여하는 취약점을 입증하지 않고 관리자 또는 루트 액세스를 가정하는 보고서는 영향이 낮은 것으로 간주됩니다. 그러한 액세스 권한을 가진 공격자는 이미 더 심각한 작업을 수행할 수 있기 때문입니다."
CVE가 할당되지 않았습니다. 수정 사항이 발행되지 않았습니다.
이 도구는 공인된 보안 테스트 및 연구 목적으로만 제공됩니다. 소유한 시스템이나 명시적인 서면 허가를 받은 시스템에서만 사용하십시오. 컴퓨터 시스템에 대한 무단 접근은 불법입니다. 저자는 오용에 대한 책임을 지지 않습니다.