【実務・中級編】 Prefetchファイルによる実行プロセスの詳細分析 – インシデントレスポンス & フォレンジック(DFIR)防御ガイド

現場のエンジニアへ告ぐ:その「実行履歴」は嘘をつかない。Prefetchファイル解析の極意

現場でインシデントが発生した際、攻撃者が真っ先に消そうとするのはログだけだと思っていませんか?彼らが最も警戒し、しかし往々にして見落とす「宝の山」があります。それが、Windowsの C:\Windows\Prefetch フォルダに眠る .pf ファイルです。

「Prefetch(プリフェッチ)」は本来、OSの起動やアプリケーションの読み込みを高速化するための仕組みですが、フォレンジックの観点から見れば、これは極めて正確な「実行履歴のタイムスタンプ付きアーカイブ」です。

今日は、なぜPrefetchが侵害調査の要となるのか、そして開発者としてどう防御を固めるべきかを、実務の視点から紐解いていきます。

—

なぜ攻撃者はPrefetchを恐れるのか

攻撃者が侵入に成功した後、必ずといっていいほど「ツール」を配置します。PowerShellスクリプト、Mimikatz、あるいはバックドアを仕込んだexeなど。これらは実行された瞬間、WindowsによってPrefetchファイルが生成されます。

ここから得られる情報は以下の通りです。

  • 実行ファイル名: cmd.exe や powershell.exe はもちろん、難読化されたマルウェアの正体。
  • 実行回数: 攻撃者がどの程度そのツールを試行・悪用したかの指標。
  • 最終実行時刻: 侵害のタイムラインを特定する決定的な証拠。
  • 読み込まれたDLLリスト: どのライブラリを悪用して権限昇格を狙ったのかという痕跡。

ログが改ざんされていても、このファイルが残っていれば「何時に何が動いたか」という事実は覆せません。

—

攻撃の芽を摘む:Prefetchの悪用を防ぐ「セキュアな設計」

攻撃者は、システムに備わっている正規の機能を悪用する「Living off the Land (LotL)」という手法を好みます。皆さんが書くWebアプリケーションやバックエンドの処理が、攻撃者の踏み台になっていないか確認してください。

特に、「任意の実行ファイルをアップロード・実行させる機能」や、「OSコマンドを直接実行するバックエンド」は最悪の脆弱性です。

1. Webアプリでのコマンド実行を防ぐ(Python実装例)

ユーザー入力からシェルを呼び出すような設計は論外です。もしどうしても外部コマンドが必要なら、以下のようにホワイトリストで厳格に制御し、シェル経由での実行を禁止してください。

import subprocess
import shlex

def execute_safe_command(command_key, args):
    # ホワイトリストによるコマンド制御
    allowed_commands = {
        "image_resize": "/usr/bin/convert",
        "pdf_merge": "/usr/bin/pdftk"
    }

    if command_key not in allowed_commands:
        raise ValueError("許可されていない操作です")

    # shell=False に設定し、引数をリストで渡すことでインジェクションを防止
    # shlex.quoteで引数をエスケープして安全性を高める
    cmd = [allowed_commands[command_key]] + [shlex.quote(a) for a in args]
    
    # 実行結果を取得し、適切にログを残す
    result = subprocess.run(cmd, capture_output=True, text=True, check=True)
    return result.stdout

2. 環境レベルでの防御:AppLockerの導入

Prefetch解析を極める前に、そもそも「許可していない実行ファイル」を走らせない環境を作ることが最善のインシデントレスポンスです。

Windows環境であれば、AppLockerを使用して、「実行パス」や「署名」に基づいたホワイトリスト運用を徹底してください。これにより、仮に攻撃者がツールを持ち込んでも、Prefetchに記録される前にOSレベルでブロック可能です。

設定の指針(グループポリシー):

  • 実行可能ルール: C:\Windows\ および C:\Program Files\ 以下のみを許可。
  • ユーザーディレクトリ: C:\Users\ 以下での実行を明示的に禁止(攻撃者の定石ルートを塞ぐ)。

—

現場で役立つPrefetch解析のワンポイント

もし皆さんが調査の現場に立たされたら、まずは WinPrefetchView のようなGUIツールではなく、CLIベースで証拠を保全してください。

# Pythonで簡易的にPrefetchヘッダーを読み取るイメージ(概念コード)
import struct

def parse_prefetch_header(file_path):
    with open(file_path, 'rb') as f:
        # ファイルの先頭部分を読み取り、シグネチャ(MAM)を確認
        header = f.read(4)
        if header == b'MAM\x04':
            print("有効なWindows 8以降のPrefetchファイルです")
        # ここから先は解析ライブラリを使用し、実行回数などを抽出

Prefetchは、攻撃者との「知恵比べ」における最も誠実な証人です。「ログは消せても、OSの挙動(キャッシュ)は消せない」という原則を理解し、皆さんの開発するシステムが攻撃者に利用されないよう、今日から権限管理と入力バリデーションを今一度見直してください。

何か不明点があれば、またいつでも相談してください。インシデントは起きてから対処するのではなく、起きないように設計するものです。

コメント

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