PR

DLLインジェクション(DLL Injection)について

本記事は学習用です。作成には ChatGPT と GitHub Copilot を使用しています。

1. 導入:何を扱うか(定義と目的)

DLLインジェクション(DLL Injection)とは、別プロセスのアドレス空間に任意の DLL(Dynamic Link Library)を読み込み、その DLL 内のコードを対象プロセスの文脈で実行させる手法である。

用語定義:

  • DLL(Dynamic Link Library):Windows で共有される実行可能モジュール(PE 形式)。動的にロードして関数を呼び出すことを前提とする。
  • プロセスインジェクション(Process Injection):別プロセスのアドレス空間でコードを実行するための総称(DLL インジェクションはその一手法)。(picussecurity.com)

理由・重要性:

  • 正常用途:デバッガやプロファイラ、互換レイヤ(例:API フックで動作監視)などで利用される。
  • 悪用:マルウェアはプロセスの信頼性を悪用して検知を逃れたり、権限昇格や永続化を目的に DLL インジェクションを多用する。これにより防御側は検出と対応が難しくなる。(Apriorit)

2. 背景と脅威モデル

背景:Windows の設計上、プロセス間でメモリ操作やスレッド生成が許可されているため、DLL を任意にマッピングする方法が複数存在する。API フックやグローバルフックは Windows 標準の仕組みを使った「合法的に見える」注入を可能にする。(Microsoft Learn)

攻撃者の典型的目標:

  • セキュリティ製品回避(アンチウイルスのプロセスに寄生して検出を避ける)
  • キーロガーや情報窃取(ブラウザやメールクライアントにフックを適用)
  • 永続化(次回起動時にもフックやペイロードを有効にする)(threathunterplaybook.com)

検出の難しさ:

  • 正規プロセスでコードが実行されるため、ログやプロセス挙動だけでは判別が難しい。
  • 高度な手法(リフレクティブインジェクション等)はディスクに DLL を置かずメモリ上で展開するため、フォレンジック検出が難しい。(すなのかたまり)

3. 代表的な手法(一覧と特徴)

以下は代表的な DLL インジェクション手法の一覧と簡潔な評価表。

手法概要実装に使う主な API利点欠点
CreateRemoteThread + LoadLibrary対象プロセスに LoadLibrary を呼ぶスレッドを作成OpenProcess, VirtualAllocEx, WriteProcessMemory, CreateRemoteThread, LoadLibrary実装が比較的単純で広く使われる標準 API の相関監視で検出されやすい
SetWindowsHookEx(グローバルフック)フック DLL をグローバルに登録して他プロセスに乗せるSetWindowsHookEx, LoadLibraryGUI 系で合法的に見える場合ありGUI スレッド依存など制約あり(用途が限定)
Reflective DLL Injection(リフレクティブ)メモリ上で DLL を自己展開して呼び出すVirtualAllocEx, WriteProcessMemory, CreateRemoteThread + 自家製ローダディスクに残らず検出回避に有利実装が複雑、互換性の課題
Proxy DLL / DLL Search Order Hijacking正規 DLL と同名で置き換えさせるファイル配置(検索順序・サイドロード悪用)永続化に転用しやすいファイル操作が必要で検出されやすい

(参考:手法の概観は複数の技術解説を参照してまとめた。(Apriorit))

4. 実装の流れ(CreateRemoteThread の概要)

ここでは最も教科書的な「CreateRemoteThread + LoadLibrary」の高レベルな流れのみを示す。実務で試す際は実験用 VM と被験体のみで行い、意図しない環境での実行は法律・規約違反となる点に留意する。

1) 対象プロセスのハンドル取得(必要最小権限)
2) 対象プロセスにメモリ確保(VirtualAllocEx
3) DLL パスなど必要データの書き込み(WriteProcessMemory
4) 対象プロセス側で LoadLibrary を呼ぶリモートスレッド作成(CreateRemoteThread
5) DllMain により初期化・処理開始

補足:LoadLibraryA はユーザーモードの kernel32.dll に属する関数であり「カーネルにある」わけではない。実装上は ASLR の影響を受け得るため、厳密には対象プロセス内のモジュールベースを列挙してアドレスを解決する設計もある。(stackoverflow.com)

flowchart LR A[攻撃プロセス] -->|OpenProcess| B[対象プロセスハンドル] B -->|VirtualAllocEx| C[対象プロセスにメモリ確保] C -->|WriteProcessMemory| D[DLLパスを書き込み] D -->|CreateRemoteThread| E[対象プロセス内でDLLロード] E -->|DllMain| F[ペイロード実行]

5. 高度なバリエーション(リフレクティブ等)と検出の観点

5.1 リフレクティブ DLL インジェクション

特徴:DLL イメージをメモリ上に書き込み、自前のローダ(PE リロケーション、インポート解決などを行う)で実行する。LoadLibrary やディスク上のファイルを必要としないため、EDR や AV(アンチウイルス)による静的/ファイルベース検出を回避しやすい。(すなのかたまり)

5.2 API フックを用いた技術(IAT/EAT/インラインフック)

  • IAT 書き換えやインラインジャンプ書き換え(プロセス内の関数先を差し替える)など、DLL をロードせずに挙動を変える技術も存在する。これらはインジェクションと組み合わせられる。

5.3 防御(検出)観点のチェックリスト

  • 不審なプロセスが他プロセスのハンドルを高権限で取得している(OpenProcess)。
  • VirtualAllocEx / WriteProcessMemory / CreateRemoteThread の連続利用が見られる。
  • スレッドの開始アドレスが kernel32.dll!LoadLibraryA などに向いている。
  • メモリにロードされたモジュールがディスク上に対応ファイルを持たない(メモリ上のみのモジュール)。
  • ログ活用(例):Sysmon の ProcessAccessCreateRemoteThread などを相関し、上記指標をハンティングに活用する。(threathunterplaybook.com)

6. 対策と実務での対応手順

6.1 開発者/運用向け対策(優先順)

  1. 最小権限の適用:プロセスに必要以上の権限を与えない。
  2. サインと整合性確認:重要コンポーネントはコード署名し検証する。
  3. プロセス保護:要件に応じてサンドボックスや PPL(Protected Process Light)等を検討する。
  4. EDR / Sysmon 等での検知ルール整備:CreateRemoteThread / VirtualAllocEx 等のシーケンス相関をルール化。
  5. ロギングとアラート:ハンドル操作、メモリ書き込み、DLL ロードイベントを集約して相関分析する。(threathunterplaybook.com)

6.2 インシデント対応手順(発見時)

  1. 影響範囲の特定:どのプロセスに注入されたか、タイムラインを特定。
  2. メモリダンプ取得と静的解析:メモリ上のモジュールをダンプし、PE ヘッダーやインポートテーブルを解析。
  3. ネットワーク通信の確認:注入 DLL が外部へ通信しているか(C2 の有無)。
  4. 復旧:感染プロセスの再起動、パッチ適用、ホスト隔離。
  5. ルート原因分析:侵入経路(ランサム/フィッシング/リモート脆弱性)を確定し再発防止。(PwC)

7. 実践的な注意点・よくある誤り

  • 管理者権限なしで試す:一部 API は高権限が必要。実験は VM 上で行う。
  • 正当用途と悪用の線引き:デバッグやツール開発目的でも、配布や実環境での利用は企業ポリシーや法律で制限される場合がある。
  • 永続化と混同しない:DLL 注入自体は一時的で、永続化は別手法(サービス登録やスタートアップ、DLL ハイジャック等)で行われることが多い。
  • 検出回避の過信:リフレクティブなどの高度手法でも、振る舞い分析やメモリの異常検出で見つかる可能性がある。防御は多層化が必須。(すなのかたまり)

8. まとめ(教育的ポイント)

  • DLL インジェクションは仕組みを理解すれば正当ツールにも悪用にもなる重要な技術領域である。
  • 学習項目(推奨):VirtualAllocEx / WriteProcessMemory / CreateRemoteThread / GetProcAddress / LoadLibrary の挙動理解と、リフレクティブの仕組み(PE フォーマット、リロケーション、インポート解決)。(Stack Overflow)
  • 防御側はプロセス操作の監視・検知ルール整備・最小権限の適用を実施することが実務上の優先事項である。(threathunterplaybook.com)

9. 付録(API 要約)

API目的
OpenProcess対象プロセスのハンドル取得
VirtualAllocEx対象プロセスにメモリ確保
WriteProcessMemory対象プロセスにデータ書き込み
CreateRemoteThread対象プロセスでスレッド実行(LoadLibrary 呼び出し)
SetWindowsHookExグローバル/ローカルフック登録と DLL 搭載

A. 参考サイト

B. 関連書籍

コメント