熟練の攻撃者は証拠を消すだけでなく、残るものをカモフラージュしようとします。最もよく見かける技法が 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を生みます。
同じハンドル セッション内で DataOverwrite、DataExtend、FileCreate がなく 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.evtxの4663と組み合わせれば周辺のプロセス文脈も分かります。
つまり timestomp されたファイルは、データ上こう見えます:
- MFT 比較が SI < FN(または FN より未来の SI 等)を検出。
- ジャーナルにたとえば
2026-04-12 03:08:14のBasicInfoChange | Closeがあり、周辺に書き込みなし。 - そのタイムスタンプをレポートに記載。
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.evtxがSeRestorePrivilegeまたは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 スクリーニング:
- 理由がちょうど
BasicInfoChange | Closeのレコードでフィルタ。 - それぞれについて、同じ
FileReferenceNumberの直前 5 分のレコードを確認。DataOverwrite、DataExtend、FileCreate、リネームがなければフラグ。 - フラグ済みエントリについて、MFT で SI-vs-FN のデルタを算出。デルタが大きい順にソート。
リストの上位は通常あなたの timestomping です。残りはエクスプローラが「隠し」属性を切り替えたり、スクリプトが属性に触れる類の操作 — 文脈次第ですが、典型的な調査では興味の対象外です。