「このコンピュータで 14:00 から 16:00 の間に何が起きていたか」の多くは、他のアーティファクトなしで USN ジャーナルからそのまま答えられます。レコードは syscall ログではなく、ユーザでタグ付けされてもいませんが、ほぼ同等に有用な何かを与えます。それは、マシンが触れたあらゆるファイルの操作単位・高頻度の記録です。数件の案件を経て身につくパターン知識があれば、Office の保存、ブラウザの遷移、IDE のリビルド、昼休みといった粒度で行動を回復できます。
本記事は、ジャーナルを行動タイムラインとして読むための実地ガイドです。
なぜこれが機能するのか
Windows デスクトップ上のユーザに見える行動のほとんどは、識別可能なファイルシステムシグネチャを生成します。Word で「保存」をクリックすると、Word は一時ファイルを書き、アトミックにリネームし、BasicInfoChange | Close で結果に印を付けます。Chrome で新しいタブを開くとディスクキャッシュが追記されます。npm install を実行すると、数秒で千個の package.json ファイルが生まれます。
これらのシグネチャは Microsoft のリファレンスには文書化されていません。コントロールされた実験ホストのジャーナルを見て、既知の活動と照合することで学べます。以下は、案件で見る頻度の高い順に並べたスターターセットです。
実環境での Office
ユーザが Word、Excel、PowerPoint ファイルを保存すると、次が見えます。
FileCreate | Close ~$<filename>.docx (ロックファイル)
FileCreate | Close <filename>.tmp (アトミック temp)
DataExtend | Close <filename>.tmp × N
RenameOldName | Close <filename>.docx
FileDelete | Close <filename>.docx
RenameNewName | Close <filename>.docx (元は <filename>.tmp)
FileDelete | Close ~$<filename>.docx
BasicInfoChange | Close <filename>.docx
~$ ロックファイルが、Office における「文書が開かれている」シグナルです。その FileCreate と FileDelete が開閉ウィンドウを正確にブラケットします。.tmp から .docx へのアトミックリネームが、保存そのものです。最後の BasicInfoChange は、新しいファイルがクローズ時に mtime をスタンプされる瞬間です。
すべての案件で使うピボット技: ファイル名が ~$ で始まる FileCreate レコードをフィルタします。これで、ウィンドウ内でユーザが開いたすべての Office 文書が得られます。同じ名前の FileDelete を引けば、取得時点でまだ開いていた文書、つまりライブキャプチャの場合はマシンがイメージ化された瞬間にユーザが開いていた文書が得られます。最後の点は「我々が踏み込んだ瞬間にユーザが実際に何をしていたか」という回答として、複数のレポートに採用されてきました。
ブラウザの活動
現代のブラウザは重いファイルシステムキャッシュを維持します。Chrome と Edge は \Users\<u>\AppData\Local\<browser>\User Data\Default\Cache\Cache_Data\ (および Code Cache\) を使います。Firefox は \Users\<u>\AppData\Local\Mozilla\Firefox\Profiles\<id>\cache2\ を使います。閲覧中:
- キャッシュディレクトリ内で持続的に低レートの
FileCreate | CloseとDataExtend | Close。 - LRU が古いエントリを退避させる際の散発的な
FileDelete | Close。 - 数分ごとにインデックスが圧縮される際のキャッシュファイルの
RenameNewName。
キャッシュ書き込みのバーストは、メディアの多いサイトや SPA を訪問していることと相関します。静かな時間は、ユーザが離席しているか、長く読み込み中のページにいることと相関します。アクティブな動画再生は別の形状を示します — 多数の小さな create ではなく、単一のキャッシュファイルに対する大規模で持続的な DataExtend です。
キャッシュのファイル名は URL を符号化していません。それには、ブラウザフォレンジックツール でブラウザ自身の SQLite データベースに切り替えます。ジャーナルの貢献はリズム — ユーザが特定のウィンドウで活発に閲覧していたこと — と、意図的なダウンロードに対する \Users\<u>\Downloads\ の明示的な FileCreate イベントです。
コーディング活動
ユーザが開発者の場合、IDE とビルドツールの活動は非常に特徴的なバーストを生成します。
- Webpack、Vite、Turbopack —
node_modules\.cache\、node_modules\.vite\、.next\、dist\に多くのFileCreate。ビルドあたり数百件。 - Visual Studio C++ —
Debug\やRelease\サブツリーに.objと.pdbファイルのFileCreate。 - Cargo (Rust) — インクリメンタルビルドは
target\debug\incremental\を激しく触り、フルビルドはtarget\debug\deps\も触ります。 - Go —
$GOPATH\pkg\と\Users\<u>\AppData\Local\go-build\のビルドキャッシュで短く激しいバースト。 npm installとyarn install— 数十秒以内にnode_modules\配下に数千件のFileCreateレコード。ジャーナル内で最もノイジーな単一のユーザ活動です。
node_modules\ での 5 分間の FileCreate バーストと、それに続く dist\bundle.js への DataExtend の群れは、「ビルドを実行してから開発サーバがリロードした」状態です。下記の除外セクションを読んでください — 開発以外の分析では、これらのバーストをフィルタしないと他のすべてを埋め尽くします。
ダウンロードとインストール
Chrome での直接ダウンロード:
FileCreate | Close \Users\<u>\Downloads\<file>.crdownload
DataExtend | Close \Users\<u>\Downloads\<file>.crdownload × N
RenameNewName | Close \Users\<u>\Downloads\<file>
BasicInfoChange | Close \Users\<u>\Downloads\<file>
Firefox は .part、Edge は .download を使います。末尾のアトミックリネームが、エクスプローラやその他のリーダにファイルを「完了」状態に見せます。
新しいプログラムのインストールは通常、Downloads にインストーラ (.exe、.msi、.appx) の FileCreate、その後に \Program Files\、\Program Files (x86)\、または \Users\<u>\AppData\Local\Programs\ 配下の FileCreate レコードのバーストが続きます。分単位のヒストグラムでインストールが容易に識別できます。実行側は AmCache と Prefetch で相互参照してください。
まとめる: 日次タイムラインのレシピ
「今日ユーザは何をしたか」のレポートを作るためのレシピ:
- その日の対象ユーザのパース済みジャーナルを取得します。解決済みパスが
\Users\<u>\(対象ユーザ) で始まるレコードに制限します。これにより、Windows Update、システムキャッシュ、その他通常支配的な OS ノイズが除外されます。 - 10 分バケットごとに、
FileCreate、DataExtend、BasicInfoChangeの件数を計算します。 - 三系列をプロットします。形状から大まかな活動が分かります:
- create と extend が多い。 コンテンツの書き込みや保存。
BasicInfoChangeだけが多い。 閲覧、スクロール、Office やエディタがファイルに触れる軽い編集 (大量の書き込みなし)。- extend が多く create が少ない。 大きなダウンロードまたはメディア再生。
Cache\パスでの持続的な create。 閲覧。node_modules\またはtarget\またはDebug\での持続的な create。 コーディング。
- 各バケットの上位 5 件のファイル名を確認してピークに付記します。Office のファイル名と
~$ロックファイルは絶好の指標です。キャッシュのファイル名は通常無視できます。
本ページのパーサは、タイムラインコンポーネント上で分単位ヒストグラムを公開しています。バーをクリックするとそのウィンドウにテーブルが絞られます — これがコードを書かない上記のワークフローです。
帰属 — どの ユーザがキーボードにいたか — については、ジャーナルのタイムラインを EVTX パーサ からの Security.evtx 4624 インタラクティブログオン (LogonType=2) と 4647 ユーザ起動のログオフと組み合わせてください。これでセッション境界がブラケットされ、活動に名前を付けられます。
除外と落とし穴
バックアップと AV のスキャン は、表面的にはユーザ活動に似たボリューム全体の BasicInfoChange バーストを生成します。スケジュールされた時刻に従い、サブツリーに集中するのではなく、すべてのディレクトリを訪問します。パスのカバレッジで容易に識別および除外できます。
同期エージェント (OneDrive、Dropbox、Google Drive Backup and Sync) は、ユーザ活動に 見える ジャーナルトラフィックを生成しますが、これはエージェント自身の作業です。ユーザ起動の活動を見るには同期フォルダ外のレコードに制限し、流出記事 で記録されているクラウド経由の流出パターンを見るには、同期フォルダ内を具体的に確認してください。
バックグラウンドインデクサ。 SearchIndexer.exe は \Users\<u>\AppData\Roaming\Microsoft\Windows\Recent\ と \ProgramData\Microsoft\Search\ のファイルに触れます。MsMpEng.exe (Defender) はスキャン時に BasicInfoChange イベントを生成します。どちらもシステムノイズとして容易にバケット化できます。
Chrome Software Reporter、Edge アップデータ、Windows Update。 いずれも \Program Files\ と \Windows\SoftwareDistribution\ で予測可能な FileCreate と DataExtend のバーストを生成します。パスでフィルタしてください。
node_modules\ その他のビルド出力 は、これを含めるあらゆるタイムラインを支配します。開発以外のケースでは、node_modules\、target\、Debug\、Release\、obj\、bin\、.next\、dist\、build\ をパスプレフィックスで除外してください。
ジャーナルから再構成できないもの
- ユーザ ID。 タイムスタンプを
Security.evtxの4624ログオンと相関させます。 - ユーザが訪問した URL。 それらはブラウザの履歴データベースが保持します。ジャーナルはキャッシュ書き込みのリズムしか知りません。
- ファイルの内容。 メタデータのみです。
- リングバッファのウィンドウを超える期間。 32 MB の
$Jはデスクトップで数日をカバーします。それ以前のものは、このアーティファクトからは消えています。さらに遡るにはシャドウコピーと$LogFileを取得してください。
「X と Y の間にユーザが何をしていたか」の質問の 80% は、$J と $MFT が一緒に直接答えます。残りの 20% には、Sysmon、EVTX、アプリケーションレベルのネットワークと CPU 使用については SRUM、そして適切なスーパータイムラインが必要です。
参考資料
- Plaso (
log2timeline) — パース済みの USN ジャーナルを取り込み、他のすべての Windows タイムラインアーティファクトと統合して 1 つの並べ替え可能なビューにする スーパータイムラインの決定版ツール。 - SANS DFIR — Windows Forensic Analysis ポスター は、ユーザ活動の質問にどのアーティファクトが答えるかについての 1 ページのリファレンスです。
- Velociraptor の artifact exchange — 上記のような USN、MFT、EVTX の相関を組み合わせた複数のコミュニティアーティファクトが含まれます。