【入門編】 USNジャーナル($UsnJrnl)を用いたファイル操作履歴の追跡 – インシデントレスポンス & フォレンジック(DFIR)防御ガイド

こんにちは!インシデントレスポンスの現場を渡り歩いているSOCアナリストです。日々、企業のネットワークに侵入したサイバー攻撃者との「静かなる攻防戦」を戦っています。

突然ですが、皆さんはご自身のパソコンやサーバーで「誰かが勝手にファイルを作ったり、消したり、こっそり名前を変えたりした痕跡」を完璧に追いかけられる自信はありますか?

「ゴミ箱を見ればわかるよ」「ファイルの更新日時を見ればいいんじゃないの?」と思われるかもしれませんが、プロの攻撃者はそんな甘い手口を使いません。彼らは侵入した足跡を消すために、ファイルのタイムスタンプを書き換えたり(タイムストッピング)、重要な証拠ファイルをこっそり削除したりします。

そんなとき、私たちが現場で「おっ、ここにごん太の足跡が残っているぞ!」と頼りにするのが、今回テーマにする USNジャーナル($UsnJrnl) という強力な仕組みです。

小難しいセキュリティ用語が出てくると身構えてしまうかもしれませんが、大丈夫です。今回は身近な「防犯カメラとマンションの入退室台帳」に例えながら、一歩ずつ優しく紐解いていきましょう!

—

1. USNジャーナルとは? 身の回りの「防犯カメラ」に例えてみよう

Windowsの標準的なファイルシステムであるNTFSには、ファイルが「いつ、どこで、どう扱われたか」をすべて記録する、非常に真面目な日記帳のような機能が存在します。それが USNジャーナル(Update Sequence Number Journal) です。

これをごく身近な例で考えてみましょう。

皆さんが住んでいるマンションのメインエントランスに、オートロックの「自動入退室記録システム」があるとします。誰かがマンションに出入りするたびに、カードキーがスキャンされ、何時何分に、どの住民(あるいは来訪者)が、どこを通ったかが自動的にログとして残りますよね。

WindowsにとってのUSNジャーナルは、まさにこの「マンションの入退室記録システム」です。

  • ファイルが新しく作られた = 「新しい住人が引っ越してきた」
  • ファイルが書き換えられた = 「部屋の中で模様替えをした」
  • ファイルの名前が変わった = 「表札の名前を書き換えた」
  • ファイルが削除された = 「住人が退去していなくなった」

たとえ攻撃者がファイルの見た目をごまかしたり、ゴミ箱を空にしたりしても、このエントランスのシステム(USNジャーナル)には「誰がいつ、どんな出入りをしたか」の生々しい記録がリングバッファ(上書き式の古い順ノート)の形でしっかり残されてしまうのです。これが、私たちフォレンジック調査員が攻撃者の足跡を暴ける理由です。

—

2. 攻撃者はなぜUSNジャーナルを恐れるのか?

サイバー攻撃者は非常に狡猾です。彼らは社内ニッチな権限を奪うと、自分たちの悪質なツール(マルウェアやバックドア)をダウンロードし、実行し、痕跡を消そうと必死になります。

例えば、攻撃者がよくやる手口として、次のようなものがあります。
1. ネットから怪しいスクリプトをダウンロードして実行する。
2. 作業が終わったら、そのスクリプトを「Shift + Delete」で完全に消去する。
3. ファイルのタイムスタンプ(更新日時など)を、何事もなかったかのように昔の日時に偽装する。

これだけ聞くと、「うわ、完全に証拠隠滅されてるじゃん……」と絶望してしまいますよね。しかし、ここでUSNジャーナルが真価を発揮します。

ファイルを「作成した」という事実や、名前を「変更した」というイベントは、OSの深層レベルで確実にUSNジャーナルに刻まれます。たとえファイル本体が綺麗さっぱり消去されていようとも、「ここにこういう名前のファイルが存在し、こういう操作をされた」という歴史の履歴書(ログ)までは、攻撃者は完全に消し去ることがなかなかできないのです。ここに、現場の調査員たちの勝機があります。

—

3. 実践!USNジャーナルを覗き見るためのアプローチ

では、実際にこのUSNジャーナルを解析するにはどうすればよいのでしょうか。
実務の現場では、専用のフォレンジックツール(MFTECmd や Zimmerman's Tools シリーズなど)や、Pythonを使った解析スクリプトを活用することが多いです。

ここでは、開発者やインフラ担当者の皆さんが、Windowsの内部構造をプログラムやスクリプトから理解するための第一歩として、管理者権限で実行できるPowerShellやコマンドプロンプトの基本的な確認方法を覗いてみましょう。

Windowsでは、標準コマンドである fsutil を使うことで、現在のUSNジャーナルの状態を簡単に確認できます。以下のコードブロックは、その設定や状態を安全に確認するためのサンプルコマンドです。

# 【管理者権限で実行してください】
# 現在のCドライブにおけるUSNジャーナルの状態(サイズや割り当て状況)を確認します
fsutil usn queryjournal C:

このコマンドを実行すると、次のような情報が返ってきます。

  • Usn Journal ID: ジャーナルを一意に識別するID
  • First Usn: 記録されている一番古いレコードの番号
  • Next Usn: 次に記録されるレコードの番号
  • Maximum Size: ジャーナルに割り当てられた最大サイズ(これを超えると古いものから上書きされます)

もしインシデントが発生し、数日前の詳細なファイル操作履歴を追いたい場合、この「Maximum Size」と「上書きのサイクル」のバランスが非常に重要になってきます。攻撃を受けてから調査までの時間が経ちすぎていると、肝心なログが古いものから順に上書きされて消えてしまう(これを「ジャーナルのラップ(環状上書き)」と呼びます)ことがあるため、インシデントレスポンスの世界では「初動のスピード(スピード感)」が命になるのです。

—

4. ログ解析を自動化・効率化するためのPythonアプローチ(概念とサンプル)

セキュリティエンジニアや開発者であれば、「このUSNジャーナルの膨大なログから、特定の怪しい拡張子(.exeや.ps1など)や、特定のフォルダへのアクセスを自動で抽出したい!」と考えるはずです。

ここでは、USNジャーナルのレコード構造を解析するイメージを掴むために、ファイル操作のログをパース(解析)する際の考え方をシンプルなPythonの疑似コードで表現してみます。

# -*- coding: utf-8 -*-
"""
USNジャーナルレコード解析の概念を示すサンプルスクリプト
(実際のバイナリ解析には専用のライブラリや構造体定義が必要になります)
"""

def parse_usn_record(record_data):
    """
    USNレコードのバイナリデータから必要な情報を抽出する関数
    """
    # 実際のUSNレコードには、レコード長、ファイル名長、USN、ファイル参照番号などが含まれます
    # ここでは分かりやすくダミーの解析ロジックを記述しています
    
    parsed_info = {
        "usn": record_data.get("usn", 0),
        "file_name": record_data.get("file_name", ""),
        "reason": record_data.get("reason", []),
        "timestamp": record_data.get("timestamp", "")
    }
    
    return parsed_info

# 模擬的なUSNジャーナルから取得したイベントのリスト
mock_journal_logs = [
    {"usn": 1001, "file_name": "update.exe", "reason": ["FILE_CREATE", "DATA_EXTEND"], "timestamp": "2023-10-25 10:00:01"},
    {"usn": 1002, "file_name": "secret_data.zip", "reason": ["FILE_CREATE"], "timestamp": "2023-10-25 10:05:12"},
    {"usn": 1003, "file_name": "secret_data.zip", "reason": ["RENAME_OLD_NAME", "RENAME_NEW_NAME"], "timestamp": "2023-10-25 10:10:00"},
]

print("=== 攻撃者のファイル操作履歴の解析結果(シミュレーション) ===")

for log in mock_journal_logs:
    result = parse_usn_record(log)
    
    # 怪しい拡張子や不審なリネーム操作を検知するフィルターロジック
    if ".exe" in result["file_name"] or "RENAME" in str(result["reason"]):
        print(f"[!] 警告: 不審なファイル操作を検知しました!")
        print(f"    - 時刻: {result['timestamp']}")
        print(f"    - ファイル名: {result['file_name']}")
        print(f"    - 操作内容 (Reason): {result['reason']}")
        print("-" * 40)

現場の実務では、このようなロジックをベースにした市販の強力なツール(EnCaseやFTK、あるいはオープンソースのDFIRツール)を駆使し、タイムライン(時系列)ビューを作成して「攻撃者が何時にどの踏み台からどのファイルを展開し、どうやって隠蔽したか」のストーリーを組み立てていきます。

—

5. まとめと、明日からできる一歩

今回は、USNジャーナル($UsnJrnl)というファイルシステムの変更ログを切り口に、攻撃者の足跡を追うフォレンジックの基本と仕組みを解説しました。

  • USNジャーナルは、ファイルシステムにおける「マンションの入退室自動記録システム」。
  • ファイルが削除されたり、タイムスタンプが偽装されたりしても、操作の履歴(ログ)は深い層に刻まれ続ける。
  • 調査の際は、ログが上書き(ラップ)されて消えてしまわないよう、迅速な初動対応(ライブレスポンスやディスク保全)が不可欠。

「セキュリティやフォレンジックって難しそう……」と感じていた方も、身の回りの防犯の仕組みに置き換えてみると、少し身近に感じられたのではないでしょうか?

インシデントはいつ、誰の身に降りかかるかわかりません。しかし、こうしたOSの仕組みやログの存在を知っているだけでも、「いざという時にどこを確認すればいいか」という心強い羅針盤になります。

ぜひ、今日の学びをきっかけに、ご自身の環境のログ設定やバックアップ体制を見直してみてくださいね。一歩ずつ、安全なシステム作りを一緒に進めていきましょう!

コメント

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