
CVE-2024-51324(BYOVD)に関する修士論文研究。4つの動作モード(SCANNER, LOADER, KILLER, CLEANUP)を備えた高度なエクスプロイト、SHA-256ドライバ検証、完全な学術文書を含む。ポートフォリオ作品は、Windowsカーネルドライバセキュリティ、IOCTLリバースエンジニアリング、Bring Your Own Vulnerable Driverエクスプロイトをカバーする。
Bring Your Own Vulnerable Driver (BYOVD) — Baidu アンチウイルス
BdApiUtil64.sys
3つの未ドキュメントのカーネルプリミティブ: プロセス終了、任意ファイル削除、SectionObjectPointer バイパスによる使用中ファイル削除
影響: Baidu アンチウイルス v5.2.3.116083 (BdApiUtil64.sys)
脆弱ドライバをカーネルにロード中(LOADER モード)
このリポジトリには、Baidu アンチウイルスのカーネルドライバ BdApiUtil64.sys における Bring Your Own Vulnerable Driver (BYOVD) の脆弱性である CVE-2024-51324 に関する私の 修士論文研究 が含まれています。
NVD レコードは CVSS v3.1 ベーススコア 3.8 (低)、ベクタ AV:N/AC:L/PR:H/UI:N/S:U/C:L/I:L/A:N、CWE-269 (不適切な特権管理) を割り当てています。このスコアは本研究で文書化されたローカル攻撃の現実を反映していません。管理者がドライバをロードした後(ソーシャルエンジニアリングや任意のローカル特権昇格によって達成可能な1回限りのステップ)、サンドボックス化されたプロセスや標準ユーザープロセスを含む後続のプロセスは、追加の権限チェックなしで IOCTL を送信できます。研究者が評価した CVSS v3.1 スコア 7.8 (高)、ベクタ AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H は、ロード後の悪用の現実をより正確に捉えています。両方のスコアは技術文書で議論されています。
このドライバはデバイスオブジェクト \Device\BdApiUtil を SecurityDescriptor = NULL で作成するため、任意のプロセス(整合性レベルに関係なく)がハンドルを開いて IOCTL を送信できます。Ghidra 11.0.3 による静的解析の結果、内部メカニズムは以前文書化されたよりも重要であることが明らかになりました。ドライバは ZwOpenProcess ではなく PsLookupProcessByProcessId + ObOpenObjectByPointer(KernelMode) を使用しており、SeAccessCheck を完全にバイパスします。3つの IOCTL プリミティブが完全に特性評価され、そのうち2つは公開文書がありません。
CVE-2024-51324/
├── README.md
├── LICENSE
│
├── drivers/
│ └── BdApiUtil64.sys # ドライバ(配布なし)
│
├── exploit/
│ ├── exploit-explanation.md
│ └── byovd_killer.py # メインエクスプロイト — 4つの動作モード
│
└── docs/
├── screenshots/
│ ├── 01-byovd-scan.png
│ ├── 02-byovd-scan-target.png
│ ├── 03-byovd-load.png
│ ├── 04-byovd-load-custom.png
│ ├── 05-kill-name.gif
│ ├── 06-kill-pid.gif
│ ├── 07-kill-limit.gif
│ ├── 08-dry-run.gif
│ └── 09-byovd-cleanup.png
│
└── analysis/
├── 01-root-cause.md
├── 02-driver-analysis.md # Ghidra RE 完全版、3つのプリミティブ、PPL テスト
└── 03-timeline.md
BdApiUtil64.sys (SHA-256: 47EC51B5F0EDE1E70BD66F3F0152F9EB536D534565DBB7FCC3A05F542DBE4428)python exploit/byovd_killer.py --scan
python exploit/byovd_killer.py --scan --target lsass.exe
python exploit/byovd_killer.py --load
python exploit/byovd_killer.py --load --driver C:\path\to\BdApiUtil64.sys
python exploit/byovd_killer.py --load --service-name MyService
python exploit/byovd_killer.py --kill notepad.exe
python exploit/byovd_killer.py --pid 1234
python exploit/byovd_killer.py --kill notepad.exe --max-instances 2
python exploit/byovd_killer.py --kill notepad.exe --dry-run
python exploit/byovd_killer.py --cleanup
python exploit/byovd_killer.py --cleanup --service-name MyService









Ghidra 11.0.3 による BdApiUtil64.sys のリバースエンジニアリングにより、従来の公開情報よりも広い攻撃面が特定されました。
0x800024B4)ディスパッチチェーンは3つのレベルで構成されます。
IOCTL 0x800024B4
└─ FUN_00028630 (IRP_MJ_DEVICE_CONTROL ディスパッチャ)
└─ FUN_00015230 (ラッパー: IOCTL コードとバッファサイズ = 4 バイトを検証)
└─ FUN_000152b0 (強制終了ハンドラ — 脆弱性の所在)
再構築されたハンドラ (Ghidra):
if ((param_1 != 0) && (param_1 != 4)) {
PsLookupProcessByProcessId(param_1, &local_res10);
ObOpenObjectByPointer(
local_res10,
0x200, // OBJ_KERNEL_HANDLE
0, // PassedAccessState: NULL
0x1fffff, // PROCESS_ALL_ACCESS
0, // ObjectType: NULL
0, // AccessMode: KernelMode ← SeAccessCheck をバイパス
local_res18
);
ZwTerminateProcess(local_res18[0], 0);
}
なぜ KernelMode が SeAccessCheck をバイパスするのか:
ZwOpenProcess のパス:
NtOpenProcess → ObOpenObjectByName → SeAccessCheck
(DACL、呼び出し元トークン、整合性レベルをチェック)
STATUS_ACCESS_DENIED を返す可能性あり
ObOpenObjectByPointer(KernelMode) のパス:
SeAccessCheck ← 呼び出されない
→ PROCESS_ALL_ACCESS ハンドルが無条件に付与される
ZwOpenProcess は ドライバのインポートテーブルに存在しません。以前の情報源に基づく ZwOpenProcess を使用した説明は技術的に誤りです。
0x80002648)ハンドラ FUN_00013bb0 は Unicode パスを受け取り、InputBufferLength ≥ 0x208 を検証して FUN_00013c10 に委譲します。サブハンドラはカーネルモードでファイルを開き(呼び出し元トークンに対する SeAccessCheck なし)、FileInformationClass = 0xD (FileDispositionInformation) の IRP_MJ_SET_INFORMATION IRP をディスパッチしてファイルを削除対象としてマークします。カーネルがアクセス可能な任意のファイルを、NTFS アクセス許可に関係なく削除できます。
0x8000264C)ハンドラ FUN_000139d0 は FileObject->SectionObjectPointer(FILE_OBJECT のオフセット 0x28)にアクセスし、削除 IRP をディスパッチする前に2つのフィールドを一時的に NULL に設定します。
plVar1 = FileObject->SectionObjectPointer;
plVar1[2] = 0; // DataSectionObject → NULL
plVar1[0] = 0; // ImageSectionObject → NULL
IofCallDriver(device, irp);
KeWaitForSingleObject(...);
// 完了後に復元
plVar1[2] = DataSectionObject_backup;
plVar1[0] = ImageSectionObject_backup;
IopDeleteFile は FileDispositionInformation を実行する前にこれらのポインタをチェックします。これらを NULL 化することで、ファイルがマッピングされていないように見せかけ、使用中保護をバイパスします。このプリミティブは、実行中の EDR エージェントのバイナリを、プロセスを終了せずにディスクから削除できます。
完全な EDR 排除チェーン:
1. EDR プロセスを終了 (IOCTL 0x800024B4)
2. ディスク上の EDR バイナリを削除 (IOCTL 0x8000264C) ← メモリマップされていても動作
3. 再起動を防止 ← 実行可能ファイルがディスク上に存在しなくなる
PPL (Protected Process Light) は、このドライバからの ObOpenObjectByPointer(KernelMode) ベースの終了に抵抗する 唯一のランタイム緩和策 です。
--cleanup 後も残るものEvent ID 7045 は、クリーンアップを含む完全な攻撃サイクルを生き残る 唯一の成果物 です。サービス名、ImagePath(完全なバイナリパス)、サービスタイプ、作成タイムスタンプが含まれます。
wevtutil cl System を実行して Event ID 7045 を削除すると、Security チャネルに Event ID 1102 が生成され、誰がいつログをクリアしたかが記録されます。これにより、元の成果物が破壊されてもログ改ざんが検出可能になります。
| 攻撃者の行動 | 結果として生じる成果物 | チャネル | 永続性 |
|---|---|---|---|
wevtutil cl System | Event ID 7045 削除 | System | — |
title: BYOVD Attack via BdApiUtil64.sys (CVE-2024-51324)
id: a3f7c2e1-8b4d-4f9a-b6e3-2d1c9f8a7b5e
status: experimental
logsource:
product: windows
service: system
detection:
selection_eventid:
EventID: 7045
selection_driver:
- ServiceName|contains: 'BdApi'
- ImagePath|contains: 'BdApiUtil64.sys'
condition: selection_eventid and selection_driver
level: high
tags:
- attack.defense_evasion
- attack.t1562.001
- attack.privilege_escalation
- attack.t1068
完全な Sigma ルールと Sysmon 設定(SHA-256 ハッシュによる Event ID 6 + レジストリキーによる Event ID 13)は docs/detection/ で入手できます。
| 文書 | 説明 |
|---|---|
| 根本原因分析 | IRP_MJ_DEVICE_CONTROL ハンドラにおけるアクセス制御の欠落 |
本研究は、私の サイバーセキュリティ修士論文(UCAM — Campus Internacional de Ciberseguridad)の一部であり、複数の環境における N-Day 脆弱性を分析しています。
この CVE は、論文内の Windows カーネルドライバ / BYOVD ベクトルを表しており、以下を実証しています。
ZwOpenProcess は存在せず、実際のメカニズムは ObOpenObjectByPointer(KernelMode))キーワード: BYOVD · Kernel Driver · IOCTL · Ghidra · Process Termination ·
File Deletion · SectionObjectPointer · ObOpenObjectByPointer · Defense Evasion ·
CVE-2024-51324
Annais Molina (devianntsec) — サイバーセキュリティ修士課程学生
MIT ライセンス — LICENSE を参照
このリポジトリは、学術的な修士論文の一部として 教育およびセキュリティ研究目的のみ で提供されます。すべてのテストは、ネットワークに公開されていない隔離された仮想マシン上で実行されました。脆弱ドライバ (BdApiUtil64.sys) はこのリポジトリでは配布されていません。独立して入手する必要があります。自分が所有するシステム、または明示的な書面によるテスト許可を得たシステムでのみ使用してください。システムに対する許可のない使用は違法であり、刑事訴追される可能性があります。
| 側面 | 説明 |
|---|
| 技術的訂正 | ZwOpenProcess はインポートテーブルに存在せず、実際のメカニズムは PsLookupProcessByProcessId + ObOpenObjectByPointer(KernelMode) であり、無条件に SeAccessCheck をバイパスします |
| 3つの文書化されたプリミティブ | プロセス終了 (0x800024B4)、任意ファイル削除 (0x80002648)、SectionObjectPointer バイパスによる使用中ファイル削除 (0x8000264C) — 最後の2つは公開文書なし |
| 4つの動作モード | LOADER、KILLER、SCANNER、CLEANUP — 完全なライフサイクル管理 |
| SHA-256 検証 | ロード試行前にドライバハッシュを検証 |
| PPL 実証テスト | プロセスカテゴリごとに10回試行し、PPL が唯一のランタイム緩和策であることを確認 |
| フォレンジック分析 | クリーンアップ後の永続的な Event ID 7045、自己告訴的なログクリア成果物としての Event ID 1102 |
| 検出ルール | Sigma ルールと Sysmon 設定(ハッシュによる Event ID 6 + レジストリキーによる Event ID 13) |
| CVSS 再評価 | 公式 NVD スコア (3.8 低) と研究者評価によるローカル悪用の深刻度 (7.8 高) との差異を文書化 |
| モード | コマンド | 権限 | 説明 |
|---|
| SCANNER | --scan | 任意のユーザー | システムおよびドライバのステータス情報 |
| LOADER | --load | 管理者 | カーネルサービス作成によるドライバのロード |
| KILLER | --kill / --pid | 任意のユーザー | IOCTL によるプロセス終了 |
| CLEANUP | --cleanup | 管理者 | ドライバサービスの停止と削除 |
| IOCTL | ハンドラ | プリミティブ | 事前の文書 |
|---|
0x800024B4 | FUN_000152b0 | プロセス終了 | 部分あり(メカニズムが不正確) |
0x80002648 | FUN_00013bb0 | 任意ファイル削除 | なし |
0x8000264C | FUN_00013850 | 使用中ファイル削除(SectionObjectPointer バイパス) | なし |
| プロセス | PPL アクティブ | 終了可能 | 原因 |
|---|
notepad.exe | いいえ | ✅ 10/10 | 保護なし |
regedit.exe | いいえ | ✅ 10/10 | 保護なし |
spoolsv.exe | いいえ | ✅ 9/10 | SCM が1件で再起動 |
MsMpEng.exe | いいえ(テスト環境では PPL なし) | ✅ 8/10 | わずかなタイミングのばらつき |
lsass.exe | いいえ(RunAsPPL なし) | ✅ 6/10 | 状態のばらつき |
csrss.exe | はい(無条件 PPL) | ❌ 0/10 | STATUS_ACCESS_DENIED |
| 存在する | 存在しない |
|---|
PsLookupProcessByProcessId | ZwOpenProcess |
ObOpenObjectByPointer | SeAccessCheck |
ZwTerminateProcess | SePrivilegeCheck |
PsGetCurrentProcess | |
IoGetRequestorProcess |
| シナリオ | ターゲット | 影響 |
|---|
| EDR/AV の終了 | MsMpEng.exe、SentinelAgent.exe | 防御回避 |
| EDR バイナリの削除(使用中) | ディスク上の EDR 実行可能ファイル | 終了後の再起動を防止 |
| 監査ログの破壊 | EventLog サービス | フォレンジックの改ざん |
| 保護されたプロセスのバイパス | lsass.exe(RunAsPPL なし) | 資格情報アクセスの促進 |
| ランサムウェアの事前暗号化準備 | セキュリティエージェント | 完全な防御回避チェーン |
| 成果物 | クリーンアップ後の状態 |
|---|
| SCM 内のサービス | 削除済み |
driverquery 内のドライバ | 削除済み |
| デバイスオブジェクト | アクセス不可 |
| レジストリキー | 削除済み |
| Event ID 7045 | 永続 — sc delete では削除不可 |
wevtutil cl System | Event ID 1102 生成 | Security | 永続 |
| ドライバ分析 | Ghidra RE 完全版、3つの IOCTL プリミティブ、PPL テスト、インポートテーブル分析 |
| CVE タイムライン | 発見、開示、パッチの時系列 |