17章
1 USNジャーナルの解析
USNジャーナルの概要
USNジャーナルの「USN」は、「Update Sequence Number:更新シーケンス番号」の略です。NTFSファイルシステムにおいては、ファイル/フォルダが追加、削除、変更されるたびに、変更履歴レコードが1つずつ作成され、ユニークな更新シーケンス番号 (USN) を割り当てます。このことから、これらの変更レコードを記録する仕組みやアーティファクトが「USNジャーナル」と呼ばれています。
USNジャーナルは、バックアップやアンチウイルス等の処理を高速化することを目的とした、変更履歴の管理機能です。デジタルフォレンジックにおいては、「誰が(システム/ユーザー/マルウェア等)」「いつ」「何をした」かを推定するための「操作履歴」という観点で、USNジャーナルを調査するケースが多いでしょう。そのため、「変更履歴」と同じ意味となりますが、ここではより能動的に、USNジャーナルの記録を「操作履歴」と表現します。
USNジャーナルへのロギングは、Windows Vista/Windows Server 2003 SP2以降、システムドライブ(内蔵ディスクのCドライブ等)において、標準で有効となりました。USNジャーナルが記録される実体のファイルは、Cドライブの場合、
- ファイルパス:
C:\$Extend\$UsnJrnl
です。このファイルは、エクスプローラー等では表示されない特殊フォルダ/ファイルで、FTK Imager等で参照すると、ファイルサイズが0バイトになっています。

これは、USNジャーナルのレコードが、代替データストリーム(ADS)に記録されるためです。「$UsnJrnl」ファイルには、次のADSが存在します。
- ログ:
$J - 管理情報:
$Max
実際にデジタルフォレンジックの解析対象アーティファクトとなるのは、ログの部分ですので、
C:\$Extend\$UsnJrnl:$J
をパースして分析します。
次の図は、$UsnJrnlのADS「$J」を、FTK Imagerで参照した例です。

USNジャーナルの保存容量は、ライブレスポンスにおいて、Windows標準の「fsutil」コマンドにより確認できます。Cドライブがシステムドライブの場合、次のコマンドを入力します。
fsutil usn queryjournal c:
次の図は、標準設定のWindows10が稼働するPCで、上記コマンドを実行した例です。

この場合の保存容量は、最大サイズ(32MB)+ 割り当て差分(8MB)で、合計40MB程度です。USNジャーナルがこのサイズを超えた場合、先頭から8MBが削除され、新たに8MBの保存領域が割り当てられます。どの程度の期間の操作履歴が保存されるかは、PCの使用状況やアプリの稼働状況などによって異なります。
上の図の例における保存容量の検証で使用したPCは、業務でほぼ毎日10時間前後使用されているものですが、USNジャーナルには過去約1日分、約40万レコードの操作履歴が保存されていました。
インシデント調査においては、不審なイベント認知以降のPC操作を最小限にとどめ、可能な限り早期にUSNジャーナルを保全しましょう。なお、PCの管理者権限を奪われた場合は、fsutil usn deletejournal コマンドでUSNジャーナルを消去されるケースがあります。このようにログローテーションや証拠隠滅行為により消去された過去のUSNジャーナルは、メモリスワップファイルやバックアップ領域(Volume Shadow Copies Service: VSS)、削除済み(未割当)領域などからカービング手法で復元できる可能性もあります。USNジャーナルの復元手法は、複数のリサーチャーによりインターネット上で紹介されています。詳細は、この章のAppendixを参照してください。
USNジャーナルの構造
USNジャーナル($UsnJrnl:$J)には、1つのファイル/フォルダに対する1つの操作(作成、変更、削除等)に対して、1つのレコードが作成されます。
本コンテンツ作成時において、USNジャーナルのレコード・フォーマットはVersion 2~4がサポートされており、Microsoft社公式サイトにおいて公開されています。Version 2では、次のリストのように定義されています(日本語説明を補記しています)。
- USN_RECORD_V2 structure (winioctl.h)
typedef struct {
DWORD RecordLength;
WORD MajorVersion;
WORD MinorVersion;
DWORDLONG FileReferenceNumber; # ファイルID
DWORDLONG ParentFileReferenceNumber; # 親フォルダID(上位フォルダのファイルID)
USN Usn; # 更新シーケンス番号
LARGE_INTEGER TimeStamp; # タイムスタンプ(操作日時)
DWORD Reason; # レコード作成理由(作成/変更/削除等の操作内容)
DWORD SourceInfo;
DWORD SecurityId;
DWORD FileAttributes;
WORD FileNameLength;
WORD FileNameOffset;
WCHAR FileName[1]; # ファイル/フォルダ名
} USN_RECORD_V2, *PUSN_RECORD_V2;
USNジャーナルのレコードから、どのような操作(変更)が行われたログであるかを知るには、「Reason」(レコード作成理由)のバイナリ値(4バイト・符号なし32bit符号なし整数)をデコードする必要があります。
「Reason」のデコードとその意味についても、Microsoft社公式サイトにおいて公開されており、次の表のように定義されています(日本語の説明と「Meaning」の意訳を補記、またデコードValue先頭の「USN_REASON_」は省略しています)。
- READ_USN_JOURNAL_DATA_V0 structure (winioctl.h)
| Value (上段:デコードValue / 下段:バイナリ値:"0x・・・") |
Meaning | 意訳(操作の内容) |
|---|---|---|
BASIC_INFO_CHANGE0x00008000 |
A user has either changed one or more file or directory attributes (such as the read-only, hidden, system, archive, or sparse attribute), or one or more time stamps. | 属性(読み取り専用、非表示、システム、アーカイブ、スパース属性など)、またはタイムスタンプの変更 |
CLOSE0x80000000 |
The file or directory is closed. | データ変更の保存 |
COMPRESSION_CHANGE0x00020000 |
The compression state of the file or directory is changed from or to compressed. | 圧縮/非圧縮の変更 |
DATA_EXTEND0x00000002 |
The file or directory is added to. | データの追加 |
DATA_OVERWRITE0x00000001 |
Data in the file or directory is overwritten. | データの上書き更新 |
DATA_TRUNCATION0x00000004 |
The file or directory is truncated. | データの一部切り捨て |
EA_CHANGE0x00000400 |
The user makes a change to the file or directory extended attributes. These NTFS file system attributes are not accessible to Windows-based applications. | NTFS拡張属性の変更(ユーザーは操作不可) |
ENCRYPTION_CHANGE0x00040000 |
The file or directory is encrypted or decrypted. | 暗号化/復号 |
FILE_CREATE0x00000100 |
The file or directory is created for the first time. | 新規作成 |
FILE_DELETE0x00000200 |
The file or directory is deleted. | 削除 |
HARD_LINK_CHANGE0x00010000 |
An NTFS file system hard link is added to or removed from the file or directory. An NTFS file system hard link, similar to a POSIX hard link, is one of several directory entries that see the same file or directory. | ハードリンクの追加/削除 |
INDEXABLE_CHANGE0x00004000 |
A user changed the FILE_ATTRIBUTE_NOT_CONTENT_INDEXED attribute. That is, the user changed the file or directory from one that can be content indexed to one that cannot, or vice versa. (Content indexing permits rapid searching of data by building a database of selected content.) | 検索用インデックス作成の有効化/無効化 |
NAMED_DATA_EXTEND0x00000020 |
One or more named data streams for the file were added to. | 代替データストリーム(ADS)の追加 |
NAMED_DATA_OVERWRITE0x00000010 |
Data in one or more named data streams for the file is overwritten. | 代替データストリーム(ADS)の上書き更新 |
NAMED_DATA_TRUNCATION0x00000040 |
One or more named data streams for the file is truncated. | 代替データストリーム(ADS)の一部切り捨て |
OBJECT_ID_CHANGE0x00080000 |
The object identifier of the file or directory is changed. | オブジェクト識別子の変更 |
RENAME_NEW_NAME0x00002000 |
The file or directory is renamed, and the file name in the USN_RECORD_V2 or USN_RECORD_V3 structure holding this journal record is the new name. | ファイル/フォルダのリネーム:変更後(新しい名前) |
RENAME_OLD_NAME0x00001000 |
The file or directory is renamed, and the file name in the USN_RECORD_V2 or USN_RECORD_V3 structure holding this journal record is the previous name. | ファイル/フォルダのリネーム:変更前(古い名前) |
REPARSE_POINT_CHANGE0x00100000 |
The reparse point contained in the file or directory is changed, or a reparse point is added to or deleted from the file or directory. | リパースポイントの追加/削除 |
SECURITY_CHANGE0x00000800 |
A change is made in the access permissions to the file or directory. | アクセス権の変更 |
STREAM_CHANGE0x00200000 |
A named stream is added to or removed from the file or directory, or a named stream is renamed. | 代替データストリーム(ADS)の追加/削除/リネーム |
CDIR-AによるUSNジャーナルのパース結果(詳細は後述)では、USNジャーナル・レコードの作成理由(Reason)として、上の表中のデコードValue(「FILE_CREATE」、「FILE_DELETE」等)を表示します。次に挙げるデコードValueは頻出するとともに、デジタルフォレンジック調査において重要なものですので、整理しておきましょう。
- ファイル/フォルダの新規作成
- FILE_CREATE
- ファイル/フォルダの削除
- FILE_DELETE
- FILE_DELETE
- ファイルの更新(データ追加モードでOpenし、変更を保存)
- DATA_EXTEND → FILE_CLOSE ※ 通常はデータ保存時に、1回の操作として1レコードに記録される
- DATA_EXTEND → FILE_CLOSE ※ 通常はデータ保存時に、1回の操作として1レコードに記録される
- ファイルの更新(データ上書きモードでOpenし、変更を保存)
- DATA_OVERWRITE → FILE_CLOSE ※ 同上
- DATA_OVERWRITE → FILE_CLOSE ※ 同上
- ファイル/フォルダのリネーム(親フォルダIDに変更なし)、または移動(親フォルダIDが変更される)
- RENAME_OLD_NAME → RENAME_NEW_NAME ※ 別のレコードとして、同時刻に作成される
- RENAME_OLD_NAME → RENAME_NEW_NAME ※ 別のレコードとして、同時刻に作成される
リネームと移動については、それぞれのUSNジャーナル・レコード作成パターン例を紹介します。いずれのパターンも、同時刻に作成される「RENAME_OLD_NAME」と「RENAME_NEW_NAME」の2レコードに分かれますので、注意しましょう。
- リネーム(親フォルダIDは変更されず、ファイル/フォルダ名のみが変更される)
| 操作日時 | ファイルID | 親フォルダID | ファイル/フォルダ名 | 理由 |
|---|---|---|---|---|
| 2022/03/29 11:01:18 | 100 | 10 | ABC.exe | RENAME_OLD_NAME |
| 2022/03/29 11:01:18 | 100 | 10 | DEF.exe ※変更後 | RENAME_NEW_NAME |
- 移動(親フォルダIDのみが変更され、ファイル/フォルダ名は変更されない)
| 操作日時 | ファイルID | 親フォルダID | ファイル/フォルダ名 | 理由 |
|---|---|---|---|---|
| 2022/03/29 11:01:18 | 100 | 10 | ABC.exe | RENAME_OLD_NAME |
| 2022/03/29 11:01:18 | 100 | 50 ※変更後 | ABC.exe | RENAME_NEW_NAME |
- リネームと同時に移動(親フォルダID・ファイル/フォルダ名が同時に変更される) ※ごみ箱へ入れた場合はこのパターンになります
| 操作日時 | ファイルID | 親フォルダID | ファイル/フォルダ名 | 理由 |
|---|---|---|---|---|
| 2022/03/29 11:01:18 | 100 | 10 | ABC.exe | RENAME_OLD_NAME |
| 2022/03/29 11:01:18 | 100 | 50 ※変更後 | DEF.exe ※変更後 | RENAME_NEW_NAME |
なお、ファイル/フォルダのコピー操作時には、新規作成(FILE_CREATE)のレコードに、コピー先のファイル/フォルダ名が記録されるのみです。コピー元となったファイル/フォルダ名は、USNジャーナルには記録されません。そのため、作成されたファイル/フォルダが、コピー操作によるものかどうかも確認できません。コピー操作の有無を確認する場合には、MFTから同一サイズのファイルが存在するかどうかの検索、Amcacheに記録されたファイルや現存ファイルであればハッシュ値の比較など、他のアーティファクトと併せて調査し、推定することになります。
USNジャーナルのパース
USNジャーナルは、多くの有償・無償ツールでパースすることができます。ここでは、CDIR-Aで提供する各種アーティファクトのパースツール群から、「usnjrnl.exe」を使用する方法を紹介します。
usnjrnl.exeは、保全したUSNジャーナル($UsnJrnl:$J)を入力して、1つのUSNジャーナル・レコードに記録された内容を、項目分けした1行のデータに加工し、CSV形式で一括出力します。出力するCSVファイルは、デフォルトではファイル名「C_$UsnJrnl-$J_output.csv 」として、実行時に指定する出力先フォルダへ保存されます。
usnjrnl.exeにより、USNジャーナルをパースする実行コマンドは、次のとおりです。
usnjrnl.exe -o [出力先フォルダ ] [入力となる$UsnJrnl($J)ファイルの保全フォルダ]
例 > usnjrnl.exe -o C:\CDIR-A_out\USNJ C:\pc-sales01_2022xx\NTFS
なお、CDIR-Cで$UsnJrnl:$Jを証拠保全した場合は、ファイル名の先頭にドライブ名を追加し、ファイル名とADS名のとの区切りを「-」(ハイフン)にした、通常の単独ファイル(例 C_$UsnJrnl-$J)として、「NTFS」サブフォルダ配下に保存します。CDIR-C以外の方法で保全したUSNジャーナルは、保全ファイルの命名ルールや保存形式が異なっているとusnjrnl.exe ではパースできないことがあります。
usnjrnl.exeが出力するCSVファイルには、次の項目が出力されます。
- ComputerName: 保全したPCのコンピュータ名
- Time: 操作(変更)発生日時
- Time Zone: Timeのタイムゾーン
- File Name: 対象ファイル/フォルダ名
- Value: 行われた操作を示すバイナリ値
- Reason: Valueに対応するデコード文字列(操作内容)
- File ID: ファイル ID
- Parent Folder ID: 親フォルダ ID(上位フォルダのファイルID)
次の図は、出力したCSVファイルを表計算ソフトで表示した例です。
- usnjrnl.exeによるUSNジャーナルのパース例

ファイル/フォルダの操作状況を時系列で明らかにする場合は、パース結果を「Time」欄でソートします。
また、「Reason」欄を「FILE_DELETE」の文字列でフィルターすることにより、MFTレコードが削除・上書きされてしまった復元困難なファイルでも、過去に存在した痕跡が明らかになる場合もあります。さらに、証拠隠滅されてしまったマルウェアの存在有無を確認したい場合には、「File Name」欄を「.exe」「.dll」等の実行ファイル拡張子でフィルターする条件を加えることにより、効率的に調査できるでしょう。
後続の Hands-on-1では、実際にUSNジャーナルをパースして、ソートやフィルターを活用した分析調査のハンズオンを行います。
なお、上記の項目一覧やパース例のとおり、USNジャーナルには、各ファイル/フォルダの名称は記録されていますが、親フォルダの名称(ファイルパス)は記録されていません。記録されているのは、親フォルダのファイルID(親フォルダID: Parent Folder ID)のみです。そのため、USNジャーナルにロギングされたファイル/フォルダが保存されていたファイルパスを明らかにするためには、MFTから親フォルダのファイルIDを検索する必要があります。
USNジャーナルを分析する際には、必ず同時にMFTもパースし、表計算ソフトなどで検索可能な形式にしておきましょう。以下、前の章でも紹介した、親フォルダIDからMFTパース結果を参照し、ファイルパスを取得する際の例を再掲します。
USNジャーナル
ファイル名:123.exe(削除済み)
ファイルID:50
親フォルダのファイルID:25
mft.exeによるMFTのパース結果例(CSVファイルの抄)
| Filename | Path | FileID | Flag |
|---|---|---|---|
| 999.txt | C:\tmp\system | 50 | File |
| test | C:\Windows\etc | 25 | Directory |
この例では、過去に存在した「123.exe」が削除され、同ファイルに割り当てられていたファイルID「50」のMFTレコードは、すでに全く別の「C:\temp\system\999.txt」というファイルに再利用されています。この2つのファイルは関連しないと考えるべきでしょう。
一方、親フォルダのファイルID「25」については、フォルダの作成日時が「123.exe」の作成日時以前であれば、親フォルダであったと認定できます。その場合、「123.exe」のファイルパスは次のようになります。
C:\Windows\etc\test\123.exe※MFTの「Filename」欄に記録されたフォルダ名「test」が、ファイルパスにおける最下位のサブフォルダ名になります。