Japan Computer Emergency
Response Team Coordination
CenterUSNジャーナル解析の追求
Japan Security Analyst Conference 2018

株式会社サイバーディフェンス研究所 山崎 輝

電子署名者 : Japan Computer Emergency Response TeamCoordination Center
DN : c=JP, st=Tokyo, l=Chiyoda-ku, email=office@jpcert.or.jp,
o=Japan Computer Emergency Response Team Coordination
Center, cn=Japan Computer Emergency Response TeamCoordination Center
日付 : 2018.01.17 09:50:20 +09'00'

自己紹介
 山崎 輝/YAMAZAKI Teru
 株式会社サイバーディフェンス研究所 情報分析部
 フォレンジック調査/インシデント対応支援
 フォレンジック技術トレーニング/研修 フォレンジック関連ツール開発

 Twitter：@4n6ist

 Web：https://www.kazamiya.net/
2

Windows フォレンジック
イベントログレジストリプリフェッチ$MFT$UsnJrnl

Amcache

SRUDB

ショートカット

ジャンプリスト

ESEDB

個別ログ…
3

本テーマの背景
 USNジャーナル（$UsnJrnl）は通常残っている

 既存のツール/アプローチのみでは不十分な可能性
 過去のデータを復元できていないケース

 大量のデータを見きれていないケース

 最終的に人が見るべきデータに落とし込む
4

トピック
1. USNジャーナルの基本

2. USNジャーナルのカービング

3. USNジャーナルの解析

5

1. USNジャーナルの基本

USNジャーナルとは（1） バックアップ/アンチウイルス等の処理高速化を目的とした機能
 NTFS上のファイル/フォルダに対する変更処理を記録

 Windows 2003 SP2/Vistaからシステムドライブで標準有効 ファイルパス $Extend¥$UsnJrnl
 $J … メイン $Max … 管理情報
Change Journals
https://msdn.microsoft.com/en-us/library/windows/desktop/aa363798(v=vs.85).aspx
7

USNジャーナルとは（2） Process Monitorの以下の条件で取得するデータに近い File System Activity
 Query関連のオペレーションを除外✓ いつ（時間）✓ どこで（ファイル/フォルダ）✓ 何が（オペレーション）

8

USNジャーナルの管理情報（1） $MaxにUSNジャーナルの管理情報を記録（32バイト）
 8バイト毎に4種類の情報を保持
最大サイズ
USNジャーナルID

割り当て差分最も下位の有効なUSN サンプル

0x0000000002000000
0x01D30A8D6874FDB3

0x0000000000800000
0x0000000000000000
9

USNジャーナルの管理情報（2） Windows標準コマンドで参照可能> fsutil usn queryjournal ドライブ

各情報の変換後
内容
最大サイズ
割り当て差分USNジャーナルID※
最も下位の有効なUSN

16進表記
0x0000000002000000
0x0000000000800000
0x01D30A8D6874FDB3
0x0000000000000000

変換後
33,554,4328,388,608
2017/08/01 06:14:180※ USNジャーナルIDはUSNジャーナル機能有効時のタイムスタンプ
10

USNジャーナルのサイズ設定デフォルト値
 検証環境で確認した最大サイズと割り当て差分の組合せ
バージョン
Vista, 7

最大サイズ
33,544,432（32MB）

割り当て差分
4,194,304（4MB）2008
8.1, 10, 2012, 2016

1,048,576（1MB）
33,544,432（32MB）

262,144（256KB）
8,388,608（8MB）

 条件によっては上記と異なる可能性あり
 サードパーティアプリによって変更されることもある

11

USNジャーナルの記録挙動（1）割り当て差分 割り当て差分 割り当て差分

最大サイズ

最大サイズ

割り当て差分最大サイズ

解放
割り当て差分
解放

最大サイズ

解放
12

USNジャーナルの記録挙動（2） 最大サイズ32MB+割り当て差分8MB=40MBの場合
 40MB（41,943,040）到達前後のデータ保存状況（Data run）
到達前

到達後割り当て差分のクラスタ数=8388608/4096=2048個を解放
クラスタ番号1535606から2016個
クラスタ番号1050425から32個解放したクラスタ数分をスパース（0埋め）として登録
13

USNジャーナルの記録挙動（3）最大サイズ

割り当て差分スパース(0)USNジャーナルのファイルサイズ

 長期間の稼働に伴い見た目のファイルサイズは肥大化

 実サイズは（最大サイズ）～（最大サイズ＋割り当て差分）の範囲
14

現存のUSNジャーナルの抽出 ファイルシステムを直接処理するツールが必要 スパース領域をスキップすることが望ましい ツール例
 CDIR（https://www.cyberdefense.jp/products/cdir.html）

 ExtractUsnJrnl（https://github.com/jschicht/ExtractUsnJrnl）
15

USNレコードの構造 変更処理はレコード単位で記録
000h

12

3

レコード長

45

メジャーバージョン

10h

親ファイルID

20h

タイムスタンプ

30h

セキュリティID

6789A

マイナーバージョン

ファイル属性BCDE

F

ファイルID

USN
理由
ファイル名の長さ

ファイル名
オフセット

ソース情報

ファイル名…

USN_RECORD_V2 structure
https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa365722(v=vs.85).aspx※ USN_RECORD_V3, USN_RECORD_V4も用意されているがデフォルト無効16

USNレコード レコード毎にUpdate Sequence Number（USN）を付与
 USNはメインデータ上のオフセット値
USNレコード1
USNレコード2
USNレコード3
USNレコード4

USN
0サイズ
100100
18080
120

300
100.
記録順序の識別に使える.
.
17

理由
定義
（USN_REASON）

内容

定義（USN_REASON）

内容

DATA_OVERWRITE

データ上書きINDEXABLE_CHANGE

NOT_INDEXED属性の変更

DATA_EXTEND

データ追記

BASIC_INFO_CHANGE

属性/タイムスタンプの変更DATA_TRUNCATION

データ切り詰めHARD_LINK_CHANGE

ハードリンクの追加/削除

NAMED_DATA_OVERWRITE

ストリームデータ上書き

COMPRESSION_CHANGE

圧縮状態の変更

NAMED_DATA_EXTEND

ストリームデータ追記

ENCRYPTION_CHANGE

暗号状態の変更

NAMED_DATA_TRUNCATION

ストリームデータ切り詰め

OBJECT_ID_CHANGE

オブジェクトIDの変更

FILE_CREATE

作成

REPARSE_POINT_CHANGE

リパースポイントの変更

FILE_DELETE

削除

STREAM_CHANGE

ストリームの変更

EA_CHANGE

拡張属性（EA）の変更

TRANSACTED_CHANGE

ストリーム変更（TxF）

SECURITY_CHANGE

アクセス権の変更

INTEGRITY_CHANGEINTEGRITY変更（ReFS）

RENAME_OLD_NAME

ファイル名の変更（前）

CLOSE

クローズ

RENAME_NEW_NAME

ファイル名の変更（後）18

ファイル属性
定義（FILE_ATTRIBUTE）

内容定義（FILE_ATTRIBUTE）

内容

ARCHIVE

アーカイブ

NO_SCRUB_DATA

ReFS用

COMPRESSED圧縮OFFLINE

オフライン

DEVICE

予約

READONLY

読み取り専用DIRECTORY

ディレクトリ

RECALL_ON_DATA_ACCESS

仮想ファイル用ENCRYPTED

暗号化

RECALL_ON_OPEN

仮想ファイル用

HIDDEN

表示しない

REPARSE_POINT

リパースポイントINTEGRITY_STREAMReFS用SPARSE_FILE

スパース

NORMAL通常

SYSTEM

システム

NOT_CONTENT_INDEXED

非インデックスTEMPORARY

テンポラリ

File Attribute Constants
https://msdn.microsoft.com/ja-jp/library/windows/desktop/gg258117(v=vs.85).aspx
19

USNレコードのパース アタッチされたドライブであれば標準コマンドでパース可能> fsutil usn readjournal ドライブ csv > 保存先20

2. USNジャーナルのカービング

USNジャーナルの残存割り当て差分 割り当て差分 割り当て差分

最大サイズ割り当て差分

最大サイズ

解放
割り当て差分
解放

最大サイズ

解放

解放されたクラスタが再利用されるまで過去のUSNレコードは残っている
22

USNジャーナルの削除挙動（1） マルウェアによるUSNジャーナルの削除処理の登場
 NotPetya/Nyetyaは以下のコマンドを呼び出す> fsutil usn deletejournal /D %c:
実行前

実行後

USNジャーナルID更新
ファイルサイズリセット

23

USNジャーナルの削除挙動（2）
実行後

実行前

元のクラスタは解放されるだけ
ファイルサイズ
削除前

スパース(0)
ファイルサイズ

削除後

スパース(0)

解放24

USNレコードが残る場所
 USNレコードは$UsnJrnl以外にも残る メモリ
 ファイルシステムジャーナル（$LogFile）
 スワップファイル（pagefile.sys） ハイバネーションファイル（hiberfil.sys）

 VSSスナップショット
 未割当領域

 過去のUSNレコードは潜在的に多数存在
25USNレコードのカービング 未割当領域だけでなくファイルシステム全域を探索した方がよい ノイズを減らすためにうまくシグネチャを作る必要がある
000h

12

3

レコード長

4502 00

6789A00 00

BC

親ファイルIDUSN
USN_RECORD_V2の固定部分

20h

タイムスタンプ

セキュリティID

ファイル属性E

F

ファイルID

10h

30h

D

理由
ファイル名の長さ

0x3C

ソース情報

ファイル名…
26

カービングシグネチャ作成のための調査
 サンプリングにより得られた正常なUSNジャーナルの特徴
 レコード長：必ず8の倍数（64～464） ファイル名長：必ず偶数（2～356）
 ソース情報：大半は0 セキュリティID：大半は0 NTFSの仕様
 ファイル名の文字コードはUTF16-LE

 ファイル名の最大長は255文字（510バイト）27

USNレコードのカービングシグネチャ
 サンプリング結果と仕様を踏まえてシグネチャを決定
000h

10h
20h
30h

1238の倍数かつ60～600

4502 00

679A00 00

親ファイルID
追加シグネチャタイムスタンプ
セキュリティID

8

ファイル属性

B

C

D

E

F

ファイルID

USN
理由

2～512

0x3C

ソース情報

ファイル名…

28

Bulk Extractor
 https://github.com/simsong/bulk_extractor
 与えられたデータから様々なパターンを抽出/パースするツール メールアドレス
 URL

 EXIF
 ZIP
 …

 入力データはファイル、ドライブ、ディスク、E0イメージなど
 抽出用シグネチャをスキャナとして実装、拡張することが可能
29

Bulk Extractor with Record Carving
 https://www.kazamiya.net/bulk_extractor-rec
 レコードカービング用のスキャナを追加

 USNジャーナルレコードのカービングスキャナはntfsusn
 hiberfileスキャナとの併用によりハイバネーションファイル
hiberfil.sys内も適切に取り扱える（ただし、Windows 8以上の形式には非対応）

30

Bulk Extractor with Record Carvingの使い方（CMD）
 hiberfil.sys内を含めUSNレコードをカービングする例> bulk_extractor -x all -e hiberfile -ntfsusn -o 出力フォルダ イメージファイル> bulk_extractor -x all -e hiberfile -ntfsusn -o 出力フォルダ ¥¥.¥C:> bulk_extractor -x all -e hiberfile -ntfsusn -o 出力フォルダ ¥¥.¥PhysicalDrive031

Bulk Extractor with Record Carvingの使い方（GUI）
 hiberfil.sys内を含めUSNレコードをカービングする例
1. Tools > Run bulk_extractor
2. Image Fileを指定
3. Output Feature Directoryを指定
4. Scannersのhiberfileとntfsusnのみチェック

5. Submit Run

32

Bulk Extractor with Record Carvingの処理速度
 マルチスレッドのためCPUよりI/Oがボトルネックになりやすい
 SSDやRAIDディスクを利用すると高速入力データがSSD上にある場合の例
40GBのディスクイメージ処理に142秒300MB/sec ⇒ 1TBを1時間で処理可能

33

評価用サンプルデータ
 一定期間以上利用されていたコンピュータを評価データに利用
バージョン

Vista
72008
2008
8.1
2012
10

最大サイズ割り当て差分

台数

32MB
32MB
1MB
512MB
32MB
32MB
32MB

4MB
4MB
256KB
1MB
8MB
8MB
8MB

577
12
6
22
5

ディスクサイズ
平均
220GB
260GB
300GB
430GB
370GB
220GB
360GB
34

Bulk Extractor with Record Carving評価結果
 既存データとカービングデータの平均サイズ比較
バージョン
Vista
7
2008
2008
8.1
2012
10

最大サイズ 割り当て差分
32MB
4MB
32MB
4MB
1MB
256KB512MB
1MB
32MB
8MB
32MB
8MB
32MB
8MB

既存データ
カービングデータ
33.8MB
114.9MB
33.8MB
2191.9MB
1.13MB
241.2MB512.4MB867.1MB
35.5MB
293.2MB
35.9MB
77.7MB
36.9MB
1357.6MB35

3. USNジャーナルの解析既存のUSNジャーナル解析ツール
 フリー/商用を含め複数の解析ツールが存在する
 基本はUSNレコードのパース 人間にとって読みやすい表記に変換
 表形式（CSV/TSV）での出力が一般的

 ツールによっては独自の機能
 別データ（$MFT, $LogFile）との連携
 時間フィルタ/ファイル名等の検索 グラフ描画37

既存ツールの課題
 実際の調査で…
 単純なパース結果 ⇒ 量が多すぎて事象追跡しにくい 時間/ファイル名等のフィルタ ⇒ 関連情報が欠落し事象追跡しにくい

 課題解決に加えて実調査で得たノウハウの機能化を試みる
 うまく量を減らして流れを追いやすくする
 特徴的な情報/事象（インジケータ）に気づきやすくする

38

USN Analytics
 https://www.kazamiya.net/usn_analytics/
 マルチプラットフォーム（C++11準拠）

 オープンソース
 コマンドライン> usn_analytics [-ru] -o 出力フォルダ 入力ファイル-r 全レコードのパース結果のみ出力-u タイムスタンプをUTCで表示（デフォルトはPCのタイムゾーン設定）

入力ファイルはUSNレコードで構成される任意のファイル
39

全USNレコードのパース
 USNレコードの構造に従って全フィールドをパース（TSV）

 USNの昇順（＝記録順を示す）で書き出し
 タイムスタンプは100ナノ秒単位で書き出し
 属性からフォルダとわかる場合はファイル名末尾に「¥」追記40

全USNレコードのパース結果
 既存データとカービングデータの平均レコード数比較
バージョン
Vista
7

既存データ
カービングデータ
324,000
1,013,000
362,000
14,641,000

2008
2008
8.1

13,0006,244,000
375,000

2,534,000
9,415,0001,443,000

2012
10

396,000
338,000

843,000
8,280,000 期間は対象に大きく依存する
41

解析用のフィールド整理
 調査上活用価値の高いフィールドに厳選する オフセット
 USN
 タイムスタンプ
 ファイル名
 理由
 ファイル属性
 ファイルID

 親ファイルID
42

USNレコードの連結 同一ファイルに対する一連の処理が複数記録されるパターン

setupapi.dev.logに対する追記処理 情報量を極力落とさずに扱うためのフィールドを追加
 レコード数
 一連の処理の所要時間
43

ファイルパスの構築
 親ファイルIDのレコードが残っていればパスの構築が可能

setupact.logとsetuperr.logのパスはPanther¥IE¥

 全レコードを走査してパス情報のリストを作成
 候補が複数ある場合、USN値を考慮して妥当なパス情報を選択 ファイルパス用のフィールドを追加
44

リネーム/移動の追跡 理由がOLDNAMEとNEWNAMEのレコード
 ファイル名の変更有無でリネーム（RENAME）か移動（MOVE）か判明

 リネーム時 ファイル名に「変更前ファイル -> 変更後ファイル」と表示

 移動時
 ファイル名に「(変更前フォルダ¥ -> 変更後フォルダ¥)」と表示

45

解析処理結果
レコードの連結

所要時間

パスの構築

リネームの追跡46

インジケータの発見、抽出 システム/ユーザの挙動を示すアーティファクトの活用
 プログラム実行履歴
 ファイル参照履歴
 特徴的なファイル名/拡張子の活用

47

プログラム実行履歴
 プリフェッチ（pf）ファイルの作成/更新処理から判断 メリット pfファイルが現存しなくてもUSNレコードは残っている可能性がある デメリット プリフェッチ無効の環境（Windows Server、仮想環境）では使えない

48

ファイル参照履歴
 ユーザによるファイル参照時の処理から判断 ショートカット（lnk）ファイルの作成
 該当ファイルにオブジェクトID付与

 メリット エントリポイントの特定に使える可能性がある デメリット 量が多くなる傾向にありチェックに時間がかかる

49特徴的なファイル拡張子
 特定の拡張子に着目して結果を集約することによりインジケータの発見につながる可能性がある
 ジョブ（job）
 PE形式ファイル（scr）
 スクリプト（bat/vbe/ps1）

50

今回のアウトプットと今後の展開
 アウトプットとして
 USNジャーナルに対する理解 Bulk Extractor with Record Carvingによるカービング USN Analyticsによる解析（≠パース）

 今後の展開 ノウハウの機能化の拡充

 グラフ、ヒストグラム等を活用した可視化
 機械学習の活用
51