
自動化されたDLLハイジャックの発見、検証、確認。ローカルの設定ミスを武器化された確定した攻撃経路に変換します。
自動化されたDLLハイジャックの発見、検証、確認
ローカルの設定ミスを、武器化された確定済みの攻撃経路へと変える。
DLLHijackHunter は、静的解析を超えた自動化されたWindows DLLハイジャック検出ツールです。多段階パイプラインを使用して、DLLハイジャックの機会を発見、検証、確認します:
ほとんどのDLLハイジャックツールは「このDLLはハイジャック可能かもしれない」というところで止まります。DLLHijackHunter はそれを検証し、既知のエクスプロイトインテリジェンスと照合し、可能な場合は実際の実行経路を確認しようとします。
flowchart TB
subgraph Phase1["フェーズ 1: 発見"]
SE["静的エンジン<br/>サービス、タスク、スタートアップ、<br/>COM、Runキー"]
AE["AutoElevateエンジン<br/>マニフェスト + COM UACバイパス"]
PE["PEアナライザー<br/>インポートテーブル、遅延ロード、<br/>マニフェスト、エクスポート"]
ETW["ETWエンジン<br/>リアルタイムDLLロード<br/>モニタリング"]
SO["検索順序<br/>計算機"]
end
subgraph Phase2["フェーズ 2: フィルターパイプライン"]
direction LR
HG["ハードゲート<br/>(バイナリキル)"]
SG["ソフトゲート<br/>(信頼度調整)"]
end
subgraph Phase3["フェーズ 3: ロード検証 (--verify-load)"]
LP["LoadProbe<br/>子プロセスローダーテスト<br/>プローブDLL配置 & 削除"]
end
subgraph Phase4["フェーズ 4: カナリア"]
CB["カナリアDLLビルダー"]
TE["トリガー実行器"]
VF["検証"]
end
subgraph Phase5["フェーズ 5: 出力"]
SC["階層化スコアラー"]
RC["コンソールレポート"]
RJ["JSONレポート"]
RH["HTMLレポート"]
end
SE --> PE --> SO
AE --> PE
ETW --> SO
SO --> Phase2
HG --> SG
Phase2 --> Phase3
Phase3 --> Phase4
CB --> TE --> VF
Phase4 --> Phase5
| タイプ | 説明 | ステルス性 | ステータス |
|---|---|---|---|
| ファントム | DLLがディスク上のどこにも存在しない | 高 | 実装済み |
| 検索順序 | Windows検索順序のより早い位置にDLLを配置する | 高 | 実装済み |
| サイドローディング | 正規アプリが自ディレクトリからDLLをロードすることを悪用 | 高 | 実装済み (AutoElevateコピー-to-tempパス) |
| .localリダイレクト | .localディレクトリリダイレクションによるハイジャック | 高 | 実装済み |
| ENV PATH | システムPATH内の書き込み可能ディレクトリの武器化 | 高 | 実装済み (厳選されたサービス/DLLマップ) |
| AppInit DLL | AppInit_DLLsレジストリ悪用 | 低 | 実装済み |
| AppCert DLL | AppCertDLLsレジストリ悪用 (すべてのCreateProcess/WinExec呼び出し元にロードされる) | 低 | 実装済み |
| CWD | カレントワーキングディレクトリのハイジャック | 低 | 計画中 — 現在どの発見パスでも生成されない |
IFEOデバッガーエントリは列挙され、参照されるバイナリはDLLインポートについて分析されますが、専用のIFEO/KnownDLLバイパスハイジャックタイプはありません — これらはスタンドアロンの検出として宣伝されていません。
DLLHijackHunter には専用のUACバイパス発見が含まれています:
System32とSysWOW64をスキャンして、埋め込みマニフェストに<autoElevate>true</autoElevate>を含むEXEを探しますHKLM\SOFTWARE\Classes\CLSIDをスキャンして、Elevation\Enabled=1を持つCOMオブジェクトを探しますSetDllDirectoryまたはSetDefaultDllDirectoriesを呼び出さないAutoElevateバイナリに対して、「EXEを書き込み可能フォルダにコピー + DLLをドロップ」攻撃パスをシミュレートしますResources/hijacklibs.jsonとして埋め込まれています。一致すると信頼度が上がり、発見結果がHijackLibs参照ページにリンクされます。一致しないことは何も意味しません。データセットはデータ駆動型です — https://hijacklibs.net/api/hijacklibs.jsonを再ダウンロードしてそのリソースに上書きすることで更新できます(コード変更は不要)。データセット© HijackLibsプロジェクトおよび貢献者。PATHフォルダを評価し、不足しているDLLをPATHで検索することが知られているネイティブWindowsサービスの厳選マップに対してハイジャック候補を生成しますパイプラインは2つの段階を通じて誤検知を削減します:
ハードゲート
api-ms-*、ext-ms-*)Users / Authenticated Users / Everyone、およびLOCAL SERVICE/NETWORK SERVICEのようなリーク防止サブ管理者サービスアカウント)が実効書き込み権限を持つ場合にのみ書き込み可能とカウントされます。重要なのは、これはツールが実行されるトークンとは独立して計算されるため、昇格して実行してもSystem32/Program Filesが書き込み可能に見えることはありません。これが、昇格実行をLPEトリアージにとって意味のあるものにしている理由です。ソフトゲート
LoadLibraryEx緩和チェック推測する代わりに、DLLHijackHunter はハイジャックが機能することを証明しようとします:
sequenceDiagram
participant H as DLLHijackHunter
participant B as カナリアDLLビルダー
participant T as トリガー実行器
participant V as 被害者バイナリ
H->>B: カナリアDLLをビルド
B->>B: プリコンパイル済みカナリアを抽出<br/>(またはMSVCでプロキシをコンパイル)
B-->>H: canary.dll + 確認ファイルパス
H->>H: ハイジャックパスにDLLを配置
H->>T: バイナリ実行をトリガー
T->>V: サービス開始 / タスク実行 / COMアクティベート
V->>V: カナリアDLLをロード
V-->>H: 確認ファイルを書き込み<br/>PID、特権、整合性レベル
H->>H: 記録: CONFIRMED
H->>H: カナリアDLLをクリーンアップ
カナリアDLL:
%ProgramData%\DLLHijackHunter\canary_<hash>.confirm)。そのため、1つのバイナリがすべての候補にサービスを提供します。スキャナーはデプロイパスから同じハッシュを計算し、そのファイルをポーリングします。バンドルされたバイナリは、src/DLLHijackHunter/Resources/canary_src.cの監査可能なソースからビルドされ、Resources/build_canary.batで再生成できます(MSVC C++ツールチェーンが必要です。スキャナーには不要です)。
機能プロキシ例外: 検索順序ハイジャックが存在しエクスポートを公開するDLLをターゲットにする場合、確認後にホストを生かし続けるにはエクスポート転送プロキシが必要です。これはMSVC(
cl.exe、vswhere/vcvarsallで検出)でDLLごとにコンパイルされます。ツールチェーンがない場合は、プリコンパイル済みカナリアが代わりに使用されます — それでもロードを確認します(DllMainが発火)が、エクスポートを転送しないため、確認が記録された後にホストプロセスがクラッシュする可能性があります。ファントムDLLやその他のエクスポートなし候補はコンパイラをまったく必要としません。
署名: 埋め込まれたカナリアは署名されていません。コード署名(より厳格なポリシーの下でロードされ、帰属可能になるように)には署名証明書が必要であり、メンテナー向けのリリース時ステップとして残されています。
プロキシ/エクスポート転送カナリアは実験的でありベストエフォートです。一部のターゲットは正しくロードできないか、以下によって予期しない動作をする可能性があります:
つまり、プロキシカナリアの失敗は、基盤となるハイジャックパスが不可能であることを常に意味するわけではありません。
--verify-load)フィルターパイプラインとカナリアフェーズの間に位置するオプトインの標準ユーザー検証です。該当する各候補について、書き込み可能なハイジャック位置に良性のプローブDLLを一時的に書き込み、その後、短命の子プロセス内の実際のWindowsローダーにDLLを名前で解決するよう要求します。ローダーが解決する場所が判定を決定します:
ntdll.dllの.local/検索順序「発見」)。設計と安全性のメモ:
LOAD_LIBRARY_SEARCH順序をモデル化するため、ファントム / 検索順序 / サイドロード候補にのみ適用されます。.local、PATH、AppInit/AppCert候補は異なるメカニズムを使用するため、スキップとして報告されます。# ローダー検証済み検索順序による標準ユーザートリアージ(カナリアなし、ETWなし)
.\DLLHijackHunter.exe --lpe-only --no-canary --no-etw --verify-load