
修士論文研究: CVE-2024-30051 (Windows DWM ヒープオーバーフロー)。高信頼性エクスプロイトを特徴とし、自動ヒープスプレー最適化、リアルタイムログ記録、実証的な成功率分析を備えています。高度なWindowsバイナリエクスプロイト、ヒープレイアウト操作、およびデスクトップウィンドウマネージャーを介したLPEを示すポートフォリオ作品です。
Windows デスクトップ ウィンドウ マネージャー (
dwmcore.dll) におけるヒープベースのバッファオーバーフロー
ローカル特権昇格 → DWM プロセスによる Integrity Level SYSTEM
ビルドターゲット: Windows 11 22H2 (10.0.22621.3447) · パッチ: KB5037771
このリポジトリには、Windows デスクトップ ウィンドウ マネージャー コア ライブラリ (dwmcore.dll) における高深刻度 (CVSS 7.8) の 特権昇格 脆弱性 CVE-2024-30051 に関する 修士論文の研究 が含まれています。
この脆弱性は、CCommandBuffer::Initialize における 整数除算のサイズ計算ミス に起因します。new() で使用されるサイズと memcpy() で使用されるサイズがこの計算ミスにより乖離し、0x8F バイトのヒープオーバーフロー が発生します。エクスプロイトが成功すると、dwm.exe が攻撃者が制御する DLL をロードし、window manager\dwm-1 アカウントのもとで Integrity Level SYSTEM として任意のコードを実行します。
CVE-2024-30051-Masters-Thesis/
├── README.md
├── LICENSE
├── setup.bat # s11.dll を必要な場所にコピーします
│
├── exploit/
│ ├── C21.sln # Visual Studio 2022 ソリューション
│ ├── exploit_src/
│ │ ├── c26f.vcxproj
│ │ ├── c26f.filters
│ │ └── main.cpp # エクスプロイト — ヒープスプレー + フッキング + オーバーフロー
│ └── payload/
│ ├── payload.vcxproj
│ ├── payload.vcxproj.filters
│ ├── dllmain.cpp # ペイロード DLL — SYSTEM シェルを起動 + クリーンアップ
│ ├── framework.h
│ ├── pch.h
│ └── pch.cpp
│
└── docs/
├── screenshots/ # パッチ差分解析、WinDbg、フォレンジックキャプチャ
└── analysis/
├── 01-root-cause.md # CCommandBuffer::Initialize の整数除算バグ
├── 02-heap-spray.md # 50セッションの経験的データと統計的知見
└── 03-timeline.md # 発見、開示、パッチの時系列
Visual Studio 2022 で C21.sln を開きます。payload プロジェクトを Release x64 でビルドします。
リポジトリのルートから setup.bat を実行します。これにより s11.dll が C:\Users\Public\Documents\s11.dll にコピーされます (PAYLOAD_DLL_PATH で定義されたパス)。
⚠️ DLL は
C26f.exeを実行する前にこの正確なパスに配置されている必要があります。実行ファイルの隣に置いても機能しません。
C26f プロジェクトを Release x64 でビルドします。
x64\Release\C26f.exe
標準 (非昇格) CMD から実行します。エクスプロイトは最大 10 回自動再試行します。成功すると、dwm.exe が s11.dll をロードし、SYSTEM Integrity Level で CMD を起動します。セッションログは %TEMP%\cve_30051_log.txt に書き込まれます。
#define MAX_ATTEMPTS 10 // セッションごとの最大自動再試行回数
#define SPRAY_STEP 0x10 // ホール間隔インデックス (1024 ホール)
#define SPRAY_RANGE_START 0x3000 // スプレー範囲開始インデックス
#define SPRAY_RANGE_END 0x7000 // スプレー範囲終了インデックス
#define SLEEP_POST_SPRAY 0xC8 // スプレー後の待機時間 (200ms)
#define SLEEP_POST_HOLES 0xC8 // ホール開放後の待機時間 (200ms)
#define PAYLOAD_DLL_PATH "C:\\Users\\Public\\Documents\\s11.dll"
CCommandBuffer::Initialize (dwmcore.dll 10.0.22621.3447) では、CD2DSharedBuffer::GetBufferSize が 2 回呼び出されます。new() に渡されるサイズは乗算前に 0x90 で整数除算されますが、memcpy() は未加工の値を使用します:
buffer_size = GetBufferSize() → 例 0x23F
size_new = (0x23F / 0x90) * 0x90 = 0x1B0 ← 割り当て
size_memcpy = 0x23F ← コピー
オーバーフロー = 0x23F - 0x1B0 = 0x8F バイト
ビルド 10.0.22621.3447 (脆弱) と 10.0.22621.3593 (修正) の BinDiff 比較:
全体類似度 0.98 に対してスコア 0.32 という異常値は、脆弱性箇所の直接的な兆候です。
1. Hook RtlCreateHeap → dwmcore ヒープハンドルをキャプチャ
2. Hook RtlAllocateHeap → 基本チャンクアドレスをキャプチャ
3. Hook NtDCompositionCreateChannel → MappedAddress (共有メモリ領域) をキャプチャ
4. Hook NtDCompositionCommitChannel → サイズフィールドを上書き (0x120 → 0x23F)
追加のバッチコマンドを注入
5. Heap spray 0x10000 CHolographicInteropTexture オブジェクト (サイズ=0x1B0)
6. 0x10 インデックスごとに空き領域を作成 → オーバーフロー着地点のギャップを作成
7. ペイロードをオーバーフローバッファに書き込み → KCBTable+0x388 + LoadLibraryA + DLL パス
8. すべてのスプレーオブジェクトを解放 → オーバーフローをトリガー → LoadLibraryA("s11.dll")
9. dwm.exe がペイロード DLL をロード → SYSTEM 整合性で CMD を起動
利用可能な RAM は、ヒープスプレーの成功に必要な試行回数に影響しますか?
それぞれ 25 セッションの 2 ブロック。セッションごとのプロトコル: クリーンな起動後スナップショットを復元 → 100 秒間の安定化待機 → エクスプロイトを起動 → 成功試行を記録。
| ブロック | RAM | セッション | 成功 | 失敗 |
|---|---|---|---|---|
| A | 8,192 MB | 25 | 24 | 1 |
| 検定 | 統計量 | p値 | 結論 |
|---|---|---|---|
| Mann-Whitney U | U = 184.0 | p = 0.031 | H₀ を棄却 |
| Welch の t 検定 | t(23) = −2.695 | p = 0.011 | H₀ を棄却 |
base = heap_base + 0x720 により、決定論の主な要因が穴密度ではなく再現可能な起動後ヒープレイアウトであることが確認されます。完全な生データ、セッションログ形式、および決定論的ヒープ観察結果は docs/analysis/02-heap-spray.md に文書化されています。
成功すると、window manager\dwm-1 のもとで CMD ウィンドウが開きます:
=====================================================
CVE-2024-30051 - Windows DWM Heap Overflow EoP
CWE-122 | CVSS 7.8 | Elevation of Privilege
=====================================================
Researched and reproduced by : devianntsec
Original PoC by : Ricardo Narvaja (Fortra)
Target : Windows 11 22H2 (22621.3447)
=====================================================
[*] Current user:
window manager\dwm-1
[*] Mandatory Integrity Level:
Mandatory Label\System Mandatory Level S-1-16-16384
[*] Enabled privileges:
SeImpersonatePrivilege Enabled
=====================================================
Shell running under DWM process - SYSTEM level
=====================================================
アーティファクト (s11.dll および .bat スクリプト) は、遅延クリーンアッププロセスにより 5 秒後に自動的に削除されます。
| ドキュメント | 説明 |
|---|---|
| 根本原因解析 | CCommandBuffer::Initialize の整数除算バグ、パッチ差分解析手法 |
この研究は、私の サイバーセキュリティ修士論文 (UCAM — Campus Internacional de Ciberseguridad) の一部であり、複数の環境にわたる N-Day 脆弱性を分析しています。
この CVE は論文内の Windows デスクトップアプリケーション ベクトルを表し、以下を示しています:
Keywords: EoP · Heap Overflow · DirectComposition · DWM · Patch Diffing · BinDiff · WinDbg · Heap Spray · Empirical Analysis · CVE-2024-30051
Annais Molina (devianntsec) — サイバーセキュリティ修士課程学生
MIT ライセンス — LICENSE を参照
このリポジトリは、学術的な修士論文の一部として、教育およびセキュリティ研究目的のみで提供されます。すべてのテストは、ネットワークに公開されていない隔離された仮想マシン上で実施されました。所有しているシステム、またはテストする明示的な書面による許可があるシステムでのみ使用してください。システムに対する不正な使用は違法であり、刑事訴追される可能性があります。
| 項目 | 説明 |
|---|
| パッチ差分解析 | BinDiff 解析の完全版。CCommandBuffer::Initialize が正確な脆弱性箇所であることを特定 (類似度 0.32、全体 0.98、一致関数 14,062) |
| WinDbg 動的解析 | 4つのフックすべて、サイズフィールドの上書き、ペイロード構築のステップバイステップ検証 |
| 経験的ヒープスプレー解析 | 2つの RAM 構成 (8,192 MB および 4,096 MB) で 50 回の制御セッション を実施し、正式な統計検定を適用 |
| 統計的知見 | Mann-Whitney U (p = 0.031) および Welch の t 検定 (p = 0.011) により RAM の影響を確認; 観測平均は理論予測 ~64 試行の 12.9–19 倍良好 |
| ペイロード DLL パスの集中管理 | ハードコードされたパスを #define PAYLOAD_DLL_PATH プリプロセッサ定数として抽出 |
| セッションログ記録 | %TEMP%\cve_30051_log.txt にタイムスタンプ付きの完全なログをセッションごとに書き込み |
| 学術的ドキュメント | 根本原因、50セッションのヒープスプレー解析、および CVE タイムライン |
| 指標 | 値 |
|---|
| 全体類似度 | 0.98 |
| 信頼度 | 0.99 |
| 一致関数 | 14,062 (99.1%) |
CCommandBuffer::Initialize 類似度 | 0.32 |
| 基本ブロック — 脆弱バージョン | 4 |
| 基本ブロック — 修正バージョン | 20 (16 の検証ブロック追加) |
| B | 4,096 MB | 25 | 24 | 1 |
| ブロック | RAM | 平均試行回数 | 標準偏差 | 95% CI | 理論 (64) に対する倍率 |
|---|
| A | 8,192 MB | 3.375 | 1.135 | [2.896; 3.854] | ≈ 19× 高速 |
| B | 4,096 MB | 4.958 | 2.645 | [3.841; 6.076] | ≈ 12.9× 高速 |
| アーティファクト | 場所 | 永続性 | 検出ツール |
|---|
cmd.exe (dwm.exe の子プロセス) | セキュリティイベントログ | はい (プロセス監査が有効な場合) | イベント ID 4688 |
外部プロセスが dwm.exe にアクセス | Sysmon | はい | Sysmon イベント ID 10 |
dwm.exe のクラッシュ (失敗時) | アプリケーションイベントログ | はい | イベント ID 1000 |
ペイロード DLL s11.dll (ディスク上) | C:\Users\Public\Documents\ | 最初の約 5 秒間のみ | SHA-256 モニタリング |
| ヒープスプレー解析 |
| 50セッションの経験的データ、生セッションデータ、統計的検定 |
| CVE タイムライン | 発見、開示、パッチの時系列 |