
KslDump — なぜ自分のナイフを持ち込むのか?Defenderがすでにキッチンに一つ置いてあるのに。
私は2026年3月7日にこの問題をMicrosoftに報告しました。しかし、その約20日前に、ゲームハッキングコミュニティがすでにリバースエンジニアリングし、公に議論していました。 私の側としては、彼らのプロジェクトをフォローしておらず、これらのことを全く知りませんでした。また、これらが完全に別個の無関係なプロジェクトであることも明らかです。
Defenderがすでに台所にナイフを置いているのに、なぜ自分でナイフを持ち込むのか?
KslDumpは、Microsoft署名済みコンポーネントのみを使用して、PPLで保護されたLSASSから資格情報を抽出します。エクスプロイトは展開されず、ドライバも読み込まれません。攻撃チェーン全体はWindows Defenderにプリインストールされています。Microsoftは、実行中のバージョン(wd\KslD.sys)をMmCopyMemoryを無効化することで修正しましたが、古い脆弱なバージョン(drivers\KslD.sys)をディスク上に残したままです。攻撃者は何も持ち込まず、Microsoftがクリーンアップし忘れたサービスを指し示すだけです。
https://github.com/user-attachments/assets/78dfce25-56b3-4eb8-9de2-7c183601e597
KslD.sys は、Microsoft Defenderに搭載されているカーネルドライバです。Microsoft署名済みであり、信頼されたカーネルモジュールとして読み込まれ、ユーザーモードからアクセス可能なデバイスオブジェクト \\.\KslD を公開します。
このドライバは、デバイスハンドルを開くことができる任意のプロセスに対して無制限のカーネルメモリおよび物理メモリアクセスを提供する、複数のサブコマンドを伴うIOCTL 0x222044 を受け入れます。
| SubCmd | 機能 | 影響 |
|---|---|---|
| 2 | CR3、IDTR、およびその他のCPU制御レジスタをユーザーモードに返す | 即座にKASLRを無効化 |
| 12 | 攻撃者が制御するアドレスとサイズで MmCopyMemory() を呼び出す | 任意のカーネル/物理メモリ読み取り |
デバイスハンドルへの唯一のゲートは、ドライバのサービスキー下のレジストリキー(AllowedProcessName)に保存されたプロセス名文字列です。この値は:
違いは CCommand::Initialize の1行です:
// 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のプラットフォームアップデートは、修正済みの82KBバージョンを drivers\wd\ に配置し、ImagePath をそれを指すように設定する一方、古い333KBバージョンは drivers\ に残ります。テストしたシステムでは、古いバイナリは決して削除されませんでした。エクスプロイトは単に ImagePath を脆弱なバージョンに戻してサービスを再起動するだけです。両方のバイナリはMicrosoft署名済みであり、OSに信頼されています。
Microsoftの公開ドキュメントによると、KB4052623はDefenderのプラットフォームアップデートを提供し、DefenderドライバのSystem32\drivers\wdへの移行を含みます。一方、WindowsサービスはWinSxSでバックアップされたコンポーネントストアファイルをNTFSハードリンクで保持し、クリーンアップ時に置き換えられたコンポーネントバージョンのみを削除します。テストしたシステムでは、これにより新しい82KBのKslD.sysがDefenderプラットフォームアップデートパスを通じて到着する一方、古い333KBの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は、ユーザーモードコードにMmCopyMemory()への直接パスを提供します。これは、物理アドレスまたは仮想アドレスでメモリをコピーするためのMicrosoft自身のカーネルAPIです。このドライバは以下を実行します:
結果: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 Security Response Center(MSRC)に報告されました。彼らは以下の理由により**「脆弱性ではない」**としてクローズしました:
「説明された攻撃は、事前の管理者権限に依存しています。その権限がどのように取得されたかを示す証拠は提供されていません。管理者権限またはルートアクセスを前提とする報告は、それらの権限を付与する脆弱性を示さない限り、影響が低いと見なされます。なぜなら、そのようなアクセスを持つ攻撃者は、より深刻な行動を既に実行できるからです。」
CVEは割り当てられず、修正も発行されませんでした。
このツールは許可されたセキュリティテストおよび研究目的のみで提供されます。自分が所有するシステム、またはテストするための明示的な書面による許可があるシステムでのみ使用してください。コンピュータシステムへの不正アクセスは違法です。作者は誤用に対する責任を負いません。