FCNS_UsnJrnl

FCNS_UsnJrnlはNTFSのChange JournalsレコードをカービングおよびパースするEnScriptです。

FCNS UsnJrnl 01

使い方

Caseを作成もしくはオープン後、調査対象を追加してから実行します。メニュー/オプションの内容は以下の通りです。

  • Target: パース/カービング対象のファイル/オブジェクトの選択
    • Selected: ブルーチェックしたファイル/オブジェクト
    • Other - $UsnJrnl·$J, $LogFile, pagefile.sys, Unallocated Clusters, VSS: チェックボックスで選択
  • Filtering Option: パース/カービング時の挙動調節
    • From/To: 対象とするレコードの期間を指定
    • Skip duplication records: 重複するレコードを発見した場合には処理をスキップ
    • Integrate output records (for Exporting TSV File): 重複するレコードを発見した場合には処理をスキップ
  • Export: パース/カービング結果の出力場所を指定
    • LEF File: 発見したレコードをLEFとして出力する場所/ファイル名を指定
    • TSV File: 発見したレコードに関するメタデータの出力場所/ファイル名を指定

ダウンロード

FCNS_UsnJrnl_1.0.1.EnPack (SHA1: 8ee537493e3b405132b28823cde21f9492b218e7)

ライセンス

個人、商用を問わず自由に利用することができますが、本ツールの利用により生じた問題については責任を負いかねます。

EnPack形式で公開していますがEnScript形式をご希望の方はお問合せください。

動作環境

EnCase 7.x

背景

Change Journalsはファイル/フォルダに対する変更を記録するための領域であり、Windows 2003以上のバージョンではシステムドライブ(Cドライブ)に対してデフォルトで有効になっています。バックアップ/ウイルス対策ソフトのチェック処理の高速化等で利用されていますが、フォレンジック調査の観点でも有用な情報源です。

Change Journalsのレコード構造はMicrosoft社のWebサイトで公開されており、オープンソースを含めパース可能なツールは2014/10時点で複数存在します。ただし、これらのツールは未割当領域に対するカービングやレコードをパースした結果の集約等の点で改善できる部分があったため本EnScriptを実装しました。

特徴

FCNS_UsnJrnlはUSN_RECORD_V2構造の情報に基づき、指定されたファイル(オブジェクト)に対して以下のシグネチャを用いて探索します。

..\x00\x00\x02\x00\x00\x00..................................................\x3C\x00

5-6バイト目はChange Journalsレコード構造におけるバージョン情報を示す部分であり、"\x02\x00"となるUSN_RECORD_V2を対象としています。Microsoft社のドキュメントではUSN_RECORD_V3も定義されていますが、Windows 8.1を含めWindows 10 Technical PreviewでもUSN_RECORD_V2の構造で記録されていることを確認したため、USN_RECORD_V2のみを探す仕様としています。

通常、Change Journalsが記録される$UsnJrnl·$Jの領域は数十MB程度に設定されています。確認した限りでは、保存領域の上限に達すると古いレコードが保存されている一定の領域は削除(解放)し、新たな保存用領域を確保するという動作を取っています。従って未割当領域(Unallocated Clusters)には、過去のChange Journalsが残っていることが多いと言えます。その他に、スワップファイル(pagefile.sys)やNTFSのファイルシステムレベルのジャーナル($LogFile)にもChange Journalsのキャッシュが残っているため、探索対象とすることにより多くの情報が取得できる可能性があります。

レコード内にはビットレベルで様々な変更内容を示すReasonが定義されています。例えばファイルの作成を示すUSN_REASON_FILE_CREATEは0x00000100、属性の変更を示すUSN_REASON_BASIC_INFO_CHANGEは0x00008000であり、このような変更内容が組み合わされて記録されていくためReasonには様々なパターンがあります。Reasonをビットレベルで個別に対応付けしていくと流れを追う際に非効率に感じたため、以下のようにパース結果のReason(String)項目にある程度集約した情報を出力しています。

FCNS UsnJrnl 02

Reasonの内容に応じて以下のいずれかに分類してReason(String)項目に出力します。

  • RENAME(NEW) ... 名前変更(変更後)
  • RENAME(OLD) ... 名前変更(変更前)
  • DELETE ... 削除
  • CREATE ... 作成
  • DATA ... データ操作(追加/上書き/削除)
  • CLOSE ... クローズ
  • META ... メタ操作(タイムスタンプ/属性/アクセス権)
  • ADS ... 代替データストリーム
  • COMP/EFS ... NTFS圧縮/暗号化
  • OBJECT_ID ... オブジェクトID
  • REPARSE ... リパースポイント
  • OTHER ... 上記以外

また、Change Journalsのレコードは変更処理毎に追加されていくため、個々のレコードを全てパースすると冗長になってしまうパターンがあります。例えばあるファイルに対してデータ書き込みが発生した際には、書き込みサイズによって同じようなレコードが数百レコード分記録されることもあります。本EnScript実行時に"Integrate output records"オプションを指定すると、1ファイルに対する1連のレコードを1つにまとめます。先ほどのパース結果のサンプルに対して、このオプションを指定した場合は以下のように出力されます。

FCNS UsnJrnl 03

すべてのレコード情報を表示するとそれだけ流れが追いにくくなり解釈にも時間がかかるため、情報量の少ないレコードは省くことにより解析の効率化が見込めます。

参考情報

Change Journals
http://msdn.microsoft.com/en-us/library/windows/desktop/aa363798(v=vs.85).aspx

USN_RECORD_V2 structure
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365722(v=vs.85).aspx

更新履歴

2015/04/19

Target - Otherの対象にVSSを追加しました。また、これまではPCに設定されているタイムゾーンにあわせていましたが、証拠ファイルに設定したタイムゾーンにあわせて出力するようにしました。