← ブログに戻る

USN ジャーナルで Timestomping とアンチ フォレンジックを見抜く

MFT タイムスタンプを編集する攻撃者でも、チェンジ ジャーナルからは隠れられません。$STANDARD_INFORMATION と $FILE_NAME の不一致や、想定外の BasicInfoChange レコードがアンチ フォレンジック活動を露呈させる仕組み。

約 2 分で読了

熟練の攻撃者は証拠を消すだけでなく、残るものをカモフラージュしようとします。最もよく見かける技法が timestomping — ファイルの NTFS タイムスタンプを編集して無害(あるいは調査ウィンドウの外)に見せる手口です。かつては有効でしたが、USN ジャーナルを有効化していると明瞭な信号を残します。

本記事では timestomping がディスクに何をするか、ジャーナルがそれをどう露呈させるか、同じアーティファクトでつかめる他のアンチ フォレンジック手口を解説します。

NTFS タイムスタンプの簡単なおさらい

各 MFT エントリは 2 つの属性にタイムスタンプを持ちます:

  • $STANDARD_INFORMATION(SI):ユーザ ランドのツールや大半の API が変更できるタイムスタンプ。dir、エクスプローラ、Get-ChildItem が表示するもの。フォーマットは Microsoft の NTFS リファレンス に文書化されています。
  • $FILE_NAME(FN):NTFS が各 $FILE_NAME 属性に内部的に設定するタイムスタンプ。名前ごとに 1 つあるのが普通(ハード リンクされていれば複数の名前を持てます)。SI に比べて はるかに 変更しにくく、カーネル レベルのアクセスや専用ツールが必要です。

Timestomping ツール(SetMACE、Metasploit のアンチ フォレンジック モジュール由来の歴史的な timestomp.exe、各種カスタム実装)は通常 SI を狙います。最近は FN も狙うものがあります。いずれにせよ MFT に触れる — そしてその接触がジャーナルを点灯させます。

タイムスタンプ編集をジャーナルがどう記録するか

SI タイムスタンプが書かれると、NTFS は BasicInfoChange | Close レコードを発行します。これが決め手になる理由は:

  • 正規の「touch」は、BasicInfoChange | Closeタイムスタンプ更新を引き起こした実書き込みDataExtend または DataOverwrite一緒に 生みます。
  • Timestomping は、同じ FileReferenceNumber 上で 書き込みを伴わない裸の BasicInfoChange | Close を生みます。

同じハンドル セッション内で DataOverwriteDataExtendFileCreate がなく BasicInfoChange | Close だけが出る場合、それはメタデータ操作です — ほぼ常に timestomping か属性変更(読み取り専用/隠しフラグ)です。

古典的な比較:SI vs FN

最も権威ある timestomping 検出は、各ファイルの $STANDARD_INFORMATION$FILE_NAME のタイムスタンプと比較するものです。Mandiant の調査員が長年にわたり書いており、Mandiant の timestomping ホワイト ペーパー が歴史的リファレンス、Brian Carrier も File System Forensic Analysis で扱っています。

ジャーナルはその比較を置き換えるのではなく補完します:

  • MFT 比較は timestomping が どこかで 起きたと教えます。いつかは分かりません。
  • ジャーナルの BasicInfoChange | Close レコードは いつ SI 書き込みが起きたかを正確に教え、Security.evtx4663 と組み合わせれば周辺のプロセス文脈も分かります。

つまり timestomp されたファイルは、データ上こう見えます:

  1. MFT 比較が SI < FN(または FN より未来の SI 等)を検出。
  2. ジャーナルにたとえば 2026-04-12 03:08:14BasicInfoChange | Close があり、周辺に書き込みなし。
  3. そのタイムスタンプをレポートに記載。

MFT 書き込みについて $LogFile とジャーナルが食い違うとき

ジャーナルはファイル単位で書き込みを記録し、$LogFile は基盤の MFT トランザクションを記録します。timestomp は次を生みます:

  • $LogFile に MFT 書き込みトランザクション(対象エントリの $STANDARD_INFORMATION を変更)が 1 件。
  • ジャーナルに BasicInfoChange | Close が 1 件。

$LogFile に MFT 更新トランザクションがあるのにジャーナルに対応する BasicInfoChange | Close がなければ、攻撃者が ジャーナル レコードを削除した 可能性があります — fsutil usn deletejournal のあとに createjournal を実行することで可能で、これも独自の痕跡を残します。

ジャーナルが捉えるその他のアンチ フォレンジック手口

ジャーナルを無効化する

fsutil usn deletejournal /D /N C: はジャーナルを削除します。実行後:

  • ジャーナル ファイルが空で再構築される。それ以前のレコードは消える。
  • $UsnJrnl の MFT エントリが新たに書かれる — $LogFile はそのトランザクションを記録する。
  • SACL が設定されていれば、Security.evtxSeRestorePrivilege または SeManageVolumePrivilege の Sensitive Privilege Use を記録する。

ジャーナルは「何を持っていたか」までは語れませんが、無効化した行為自体がアンチ フォレンジックの強い信号です。管理コマンドと所要権限は Microsoft の fsutil usn リファレンス を参照。

代替データ ストリーム

ADS による隠蔽は古典ですが、ジャーナルはきれいに記録します — StreamChange レザン ビットが代替ストリームの追加・削除で立ちます。StreamChange でフィルタすればボリューム上の ADS 作成・変更イベントが洗い出せます。誤検知としては、ブラウザのダウンロードに付く正規の Zone.Identifier ストリーム — これも StreamChange を生み、元ファイルの FileCreate とペアで現れます。

ハード リンクの小技

HardLinkChange はハード リンクの追加・削除で立ちます。攻撃者はファイルを 2 つの親から到達可能にするためにハード リンクを使うことがあり、これはパス ベースの制御を回避するのに便利です。HardLinkChange を追跡し、FileReferenceNumber でピボットしてすべての親を確認しましょう。

リパース ポイントの悪用

リパース ポイント(ジャンクション、シンボリック リンク、マウント ポイント)はパスを別の場所へ転送します。ReparsePointChange は追加・変更で点灯します。$Recycle.Bin\Users\Default、その他「触れられるべきでない」場所のリパース ポイントを探しましょう。

取れない手口

ジャーナルを完全にバイパスするアンチ フォレンジック手口の短いリスト:

  • 外部メディアからブートしてディスクを書き換える — 稼働 OS には一切触れない。
  • 同じ内容サイズを保ったユーザ ランドの書き換え(同オフセットへの上書き、SI 更新なし)。DataOverwrite は出ますが、元の内容は失われます。ジャーナルは書き込みを見ていても、書き込み前にあったものは見えません。
  • 他のことを何もする前にジャーナルを無効化する。ジャーナルは稼働中のことしか記録できません。

これらには $LogFile、シャドウ コピー、ホスト外テレメトリのいずれかが必要です。ジャーナルは強力な目撃者ですが、唯一の目撃者ではありません。

実用的なスキャン

パース済みジャーナルに対する、最速の timestomping スクリーニング:

  1. 理由がちょうど BasicInfoChange | Close のレコードでフィルタ。
  2. それぞれについて、同じ FileReferenceNumber の直前 5 分のレコードを確認。DataOverwriteDataExtendFileCreate、リネームがなければフラグ。
  3. フラグ済みエントリについて、MFT で SI-vs-FN のデルタを算出。デルタが大きい順にソート。

リストの上位は通常あなたの timestomping です。残りはエクスプローラが「隠し」属性を切り替えたり、スクリプトが属性に触れる類の操作 — 文脈次第ですが、典型的な調査では興味の対象外です。