【入門編】 Windowsカーネルオブジェクト(EPROCESS, ETHREAD)の構造解析 – インシデントレスポンス & フォレンジック(DFIR)防御ガイド

こんにちは!インシデントレスポンスの現場を渡り歩いているSOCアナリストです。日々のセキュリティ運用の片隅で、こんな疑問を持ったことはありませんか?

「Windowsのタスクマネージャーやコマンドでプロセスの一覧を見ているけれど、本当にそれだけがすべてなのだろうか?」

悪意ある攻撃者、いわゆるハッカーたちは、私たちが普段使っているOSの標準機能や画面(タスクマネージャーやPowerShellのコマンドなど)の目を巧みに盗んで、自分たちの存在を隠そうとします。今回は、そんな攻撃者の狡猾な手口を暴くための奥義――「Windowsカーネルオブジェクト(EPROCESSやETHREAD)の構造解析」について、一緒に優しく紐解いていきましょう!

小難しい専門用語が出てきても、一歩ずつ対策を学んでいきましょうね。

—

1. 身近な「防犯」で考えてみよう:OSのAPIとカーネルオブジェクト

まずは、私たちが普段暮らしている「お家」に例えて考えてみましょう。

表玄関(OSのAPI)と、裏の合い鍵(カーネルオブジェクト)

  • OSのAPI(タスクマネージャーやコマンドなど):

家主(OS)が「今、家の中に誰がいますか?」と来客に確認するための表玄関のインターホンのようなものです。訪問者が「私は〇〇です」と名乗れば、家主はその通りに信じてリストを作ります。

  • カーネルオブジェクト(EPROCESS、ETHREAD):

家全体の構造図であり、誰がどこにいて、どの部屋の鍵を持っているのかを記録している管理台帳そのものです。

もし、泥棒(マルウェア)が侵入してきたとき、どうするでしょうか? 泥棒は頭がいいので、表玄関のインターホン(OSのAPI)には出ないようにしたり、嘘の名前を名乗ったりして、タスクマネージャーから姿を消してしまいます(これを「プロセス隠蔽」と言います)。

しかし、どれだけ巧妙に表玄関をごまかしても、家の管理台帳である「カーネルオブジェクト」のページを直接めくってみればどうでしょう? 「あれ? インターホンには誰も応答していないのに、2階の部屋の電気がついていて、勝手に合鍵が使われているぞ!」という矛盾に気づくことができますよね。

私たちがやっているメモリフォレンジックとは、まさにこの「管理台帳を直接のぞき見して、嘘を見破る作業」なのです。

—

2. 攻撃者はどうやって私たちを騙すのか?(ダイレクトカーネルオブジェクト操作:DKOM)

攻撃者がよく使う手口に、DKOM(Direct Kernel Object Manipulation:ダイレクトカーネルオブジェクト操作)というものがあります。

これは、Windowsのルールを無視して、メモリ上のカーネルオブジェクト(例えば、プロセスを管理する EPROCESS という構造体)のデータを直接書き換えるアプローチです。

プロセス隠蔽のカラクリ

Windowsのタスクマネージャーは、プロセスを表示するとき、裏側で「プロセス同士を繋ぐ輪っか(二重連結リスト:ActiveProcessLinks)」を順番に辿って、「あ、ここにプロセスAがあって、次にプロセスBがあって……」と数えています。

攻撃者は、この輪っかの中から自分のプロセスの名前だけをこっそり切り離してしまうのです。

  • タスクマネージャー(表玄関):「輪っかを辿っても、このプロセスの名前が出てこないから、居ないことにしておこう」
  • 実際のCPU:「おや、裏でちゃんと指示されたプログラムが動いているぞ」

このように、OSの「見える世界」と「実際の裏側の世界」にズレを生じさせるのが、現代の高度なマルウェアの常套手段です。

—

3. 現場の眼:EPROCESSとETHREADの正体

では、その裏側の世界を覗くための主役である EPROCESS と ETHREAD について、もう少し詳しく見ていきましょう。

  • EPROCESS(Executive Process):

Windows上で動く1つの「プロセス」の戸籍謄本のようなものです。プロセスID(PID)、作成時間、親プロセスの情報、そして先ほどお話ししたプロセス同士を繋ぐ輪っかのポインタなどが、この中にぎっしり詰まっています。

  • ETHREAD(Executive Thread):

プロセスの中身で実際に手を動かして作業をする「スレッド(実行の最小単位)」の管理台帳です。1つのプロセスの中に、複数の作業員(ETHREAD)が存在することもあります。

これらはすべて、メモリ上の決まったアドレス(番地)に、決まったルール(オフセット)で書き込まれています。

解析の現場で使われる疑似コードのイメージ

私たちフォレンジック調査員は、メモリのダンプファイル(物理メモリのコピー)を解析する際、専用のツールを使ってこの構造体を直接読み解きます。イメージとしては、次のようなプログラム(PythonのVolatilityフレームワークなどを想定)で、隠されたプロセスを見つけ出します。

# -------------------------------------------------------------------------
# 【実務参考】メモリ上のEPROCESS構造体を走査してプロセスを探すイメージ
# -------------------------------------------------------------------------

def scan_hidden_processes(memory_dump):
    # カーネルメモリのベースアドレスからEPROCESSのリストを順次たどる
    eprocess_list = memory_dump.get_active_process_links()
    
    for process in eprocess_list:
        pid = process.get_unique_process_id()
        image_name = process.get_image_file_name()
        
        # 表玄関(タスクマネージャー)のリストと比較する
        if not is_visible_in_task_manager(pid):
            print(f"[!] 警告: 隠蔽されたプロセスを検知しました!")
            print(f"    - プロセス名: {image_name}")
            print(f"    - プロセスID (PID): {pid}")
            print(f"    - 対策: 直ちにメモリ保全とネットワーク切断を実施してください。")

# ※上記のコードは構造解析の概念を説明するための疑似コードです。

このように、OSのAPIを経由せず、メモリ上のデータ構造を直接確認することで、隠された脅威をあぶり出すことができるのです。

—

4. 新人のIT担当者・開発者が今日からできる一歩

「カーネルオブジェクトなんて、なんだか難しそう……」と思ったかもしれませんが、日々のインフラ管理や開発において、意識できるポイントはちゃんとあります。

1. 「正常な状態」の基準値(ベースライン)を知る
普段からサーバーやPCで、どんなプロセスが動いていて、どの親プロセスから起動しているのか(例:explorer.exe から cmd.exe が起動している等)を把握しておきましょう。
2. EDR(Endpoint Detection and Response)製品を活用する
私たち人間が手動で毎回メモリを解析するのは大変です。市販の優秀なEDRツールは、今回お話ししたようなカーネルレベルの挙動や不審なAPIフックを常時監視し、私たちに代わって「表と裏の矛盾」を検知してくれます。
3. セキュリティのログを過信しすぎない
「ログに記録されていないから安全」ではなく、「ログそのものが改ざんされている可能性(カーネルレベルの脅威)」を常に頭の片隅に置いておくことが、プロへの第一歩です。

—

まとめ

今回は、Windowsカーネルオブジェクト(EPROCESS、ETHREAD)の構造解析について、お家の防犯に例えて解説しました。

セキュリティの世界は広大で、最初は覚えることが多くて圧倒されてしまうかもしれません。でも、「表に見えている情報がすべてとは限らない」「裏側の仕組み(カーネル)を知ることで真実が見えてくる」という視点を持てば、インシデント対応の面白さや奥深さがぐっと見えてくるはずです。

一歩ずつ、着実にスキルを磨いていきましょう!次の現場レポートでも、実践的ですぐに役立つ知識をお届けしますね。

コメント

タイトルとURLをコピーしました