SANS Forensics blogに取り上げられていた内容で、ユーザが(Windows XP/Vista標準の)デフラグを実行したかを調査する方法について、記事の内容にあわせて実際の挙動をWindows XPで確認しながらまとめてみました。
De-mystifying Defrag: Identifying When Defrag Has Been Used for Anti-Forensics (Part 1 - Windows XP)
https://blogs.sans.org/computer-forensics/2009/08/05/de-mystifying-defra...
De-mystifying Defrag : Identifying When the Windows Defragmenter Has Been Used for Anti-Forensics (Part 2 – Vista)
https://blogs.sans.org/computer-forensics/2009/08/17/de-mystifying-defra...
Vistaについては気軽に試せる環境がないので、上記のPart2の情報に基づき最後の方でXPとの差分を書いています。
まずXPの場合ですが、およそ3日毎にタスクスケジューラ経由でコマンドラインベースのデフラグが実行されていると以下に書かれています。
Windows XP: Kernel Improvements Create a More Robust, Powerful, and Scalable OS
http://msdn.microsoft.com/en-us/magazine/cc302206.aspx
つまり大抵の場合デフラグが実行された痕跡は残っていることになるので、システムが自動的に実行したか、ユーザが意図的に実行したかを確認する必要があります。ユーザがデフラグを実行する場合の方法(経路)を思いつく範囲で以下に列挙しました。
(a) マイコンピュータ -> ディスクのプロパティ -> ツールタブ -> 最適化する
(b) 管理ツール -> コンピュータの管理 -> 記憶域 -> ディスクデフラグツール
(c) スタート -> プログラム -> アクセサリ -> システムツール -> ディスクデフラグ
(d) ファイル名を指定して実行 -> dfrg.msc
(e) コマンドプロンプト ( > defrag ボリューム [-a] [-f] [-v] [-?] )
(a)-(d)はGUIベースであり、どの方法を実行しても結局は同じMMCスナップインにたどり着きます(左図)。(e)のコマンドプロンプト経由は普通のユーザはあまり使わないと思われますがGUIと同じくデフラグできます(右図)。これらのどの方法で実行したかにより若干痕跡の残り方が異なり、見るポイントは4つあります。
1. プリフェッチ
2. UserAssist
3. MMCのRecent File Listキー
4. 関連ファイルの最終アクセス日時(atime)
4つの各ポイントについて参照する場所や使用ツールを取り上げつつ、(a)-(e)それぞれの方法で痕跡がどう残っていたかを紹介します。
1. プリフェッチ
[対象フォルダ]
%systemroot%Prefetch
[対象ファイル]
CMD.EXE-XXXXXXXX.pf, DEFRAG.EXE-XXXXXXXX.pf, DFRGNTFS.EXE-XXXXXXXX.pf, DFRGFAT.EXE-XXXXXXXX.pf, MMC.EXE-XXXXXXXX.pf
(ファイル名のEXEとpfの間にはハッシュ情報が入ってくるため、便宜上XXX..と表記しています)
[概要]
プリフェッチから、実行ファイル(exe)を最後に実行した時間や回数などの情報が得られます。詳細はIharaさんの記事がわかりやすいです。
プリフェッチ機能
http://d.hatena.ne.jp/hideakii/20060325
プリフェッチをパースする無償ツールはいくつかありますが、Windows File Analyzer(http://www.mitec.cz/wfa.html)がわかりやすかったです(ただ時間情報をUTCベースでしか表示できない点と、結果をテキスト等に出力できない点が残念ですが..)。
[痕跡の残り方]
(a)-(d)のGUIベースのどの方法でも、デフラグツールのGUI画面を起動した時点で"MMC.EXE-XXXXXXXX.pf"の実行時間、回数が更新されます。そして分析や最適化を実行した時点で対象ディスクのファイルシステムがNTFSであれば"DFRGNTFS.EXE-XXXXXXXX.pf"が、FATであれば"DFRGFAT.EXE-XXXXXXXX.pf"が更新されます。いったん"分析"してから"最適化"すると2回カウントされる点に注意が必要です。"DEFRAG.EXE-XXXXXXXX.pf"は使われないため更新されません。
(e)のコマンドライン経由の場合は、まず"CMD.EXE-XXXXXXXX.pf"が更新されます。defrag.exeを引数なしや-?でヘルプを出力するように実行した場合、"DEFRAG.EXE-XXXXXXXX.pf"のみが更新されます。分析(-aオプション)や最適化が実行された場合は"DEFRAG.EXE-XXXXXXXX.pf"と対象ファイルシステムに応じて"DFRGNTFS.EXE-XXXXXXXX.pf"または"DFRGFAT.EXE-XXXXXXXX.pf"が更新されます。
SANSの記事では、コマンドライン経由で実行した場合にdfrgntfs.exeが3回分カウントされるような記述があります(”When using the GUI, the execution value for dfrgntfs.exe was incremented by one and when using the command line application, the counts were incremented by three.”)が、こちらで確認した限りではそのような挙動は見られず1回分のカウントでした。何か見落としてるんでしょうか..
2. UserAssistキー
[対象レジストリキー]
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{GUID}\Count
[対象エントリ]
ディスクデフラグ.lnk, mmc.exe, cmd.exe
[概要]
ユーザのファイル実行に関する情報が得られます。エントリ名がROT-13で変換されているので自動パースしてくれるツールがあると便利です。レジストリの調査といえばRegRipper(http://www.regripper.net/)ですが、プラグインによっては日本語などASCII以外の文字コードが含まれている場合に正しく処理してくれません。UserAssistキーの処理に関しては日本語を含むエントリは出力すらしませんでしたので、使用しない方がよいでしょう。
# 他言語対応のRegRipperは某所で近い内に公開される予定(?)なのでそちらに期待です
ということで、現状UserAssistキーに特化した調査はDidier Stevensさん作のツール(http://blog.didierstevens.com/programs/userassist/)がお奨めです。
[痕跡の残り方]
それぞれの場合で以下のエントリが残ります。
(a) : なし
(b), (d) : UEME_RUNPATH:C:\WINDOWS\system32\mmc.exe
(c) : UEME_RUNPIDL:%csidl2%\アクセサリ\システム ツール\ディスク デフラグ.lnk, UEME_RUNPATH:C:\WINDOWS\system32\mmc.exe
(e) : UEME_RUNPATH:C:\WINDOWS\system32\cmd.exe
(c)以外はデフラグを実行しなくても残りうる情報なので、他の調査結果との突き合わせが必須です。
3. MMCのRecent File Listキー
[対象レジストリキー]
HKCU\Software\Microsoft\Microsoft Management Console\Recent File List
[対象エントリ]
dfrg.msc, compmgmt.msc
[概要]
MMCスナップインの実行履歴が上記のレジストリに残ります。MMC自体の実行が初回であれば、実行時に対象キー"Software\Microsoft\Microsoft Management Console\Recent File List"が作成されます。
その後、配下にFile1-File4の4つのエントリに、パスが記載された情報が残ります。File1が直近でFile2, File3, File4の順に古い情報になります。既にFile1に残っているエントリと同じスナップインを実行した場合は変化しませんが、File2-File4に残っているスナップインを実行した場合はそのエントリがFile1に変わり、その影響で他のエントリの順番がずれます。
このエントリはスナップイン実行を終了した(閉じた)タイミングで更新されます。つまりレジストリキーのLast WrittenはFile1に記載されているスナップインの終了時を示します。
基本的にMMCのRecent File Listキーには日本語を含まないので、RegRipperでも取りこぼさず処理できます。
[痕跡の残り方]
(a), (c), (d) : C:\WINDOWS\system32\dfrg.msc
(b) : C:\WINDOWS\system32\compmgmt.msc
(e) : なし
(b)は"コンピュータの管理"経由で実行されるためか、compmgmt.mscの履歴が残り、dfrg.mscの実行履歴は残りませんでした。
4. 関連ファイルの最終アクセス日時(atime)
[対象ファイル]
%systemroot%\system32\dfrgntfs.exe, defrag.exe
%systemroot%\dfrg.msc, dfrgres.dll, dfrgui.dll
C:\Documents and Settings\All Users\スタートメニュー\アクセサリ\システムツール\ディスク デフラグ.lnk
[概要]
ファイルシステム(NTFS)のmactimeから情報が得られます。参照するツールですが、Entry Modifiedを見る必要はないのでターゲットを改変しないようにしていればエクスプローラでもよいと思いますが、Autopsy, EnCaseなどの専用ツールが望ましいでしょう。関連dll, exeもアクセスされるため、それらのatimeにあらわれる特徴を確認します。
[痕跡の残り方]
(a) : dfrg.msc < dfrgui.dll < dfrgres.dll < mmc.exe < dfrgntfs.exe
(b) : dfrgres.dll < mmc.exe < dfrgui.dll < dfrgntfs.exe
(c) : ディスクデフラグ.lnk < dfrg.msc < dfrgui.dll < mmc.exe < dfrgres.dll < dfrgntfs.exe
(d) : mmc.exe < dfrgui.dll < dfrg.msc < dfrgres.dll < dfrgntfs.exe
(e) : defrag.exe < dfrgres.dll < dfrgntfs.exe
上記はEnCaseのLast Access Timeでソートした結果を基に時系列情報を不等号で記述しています。右に行くほど新しい時間であることを示します。(a)-(e)のそれぞれの方法によってexeやdllの順番が異なる点は疑問ですが、秒単位で見るとほとんど同一でした。ミリ秒などのもっと細かい単位での確認も行いたいですが、手軽に試せる環境がないため今後の課題にしておきます。
dfrgui.dllは、名前の通り(a)-(d)のGUIベースでの実行時にアクセスされることがわかります。
また、コマンドライン経由でユーザが実行したかシステムによる実行かを特定するためにLayout.ini内の情報が役に立ちます。システムによるデフラグではlayout.iniの内容を更新するためmtimeも更新されますが、手動ではlayout.iniを触らないため、これらのmtimeとpfファイルのmtimeが同一か確認することにより判断できるとのことです。この部分については今回は実機で確認していません。
最後にVistaの場合についての補足です。Vistaでは毎週水曜の午前1時に、タスクスケジューラでフルボリュームのデフラグを実行します(原文は "Vista ships with a default scheduled task for a full volume defragmentation every Wednesday evening at 1am"とあり、eveningとなっているのは疑問ですが..)。スケジュールされた時間にシステムが稼働していなければ実行されないようです。
XPではMMCスナップインのdfrg.mscを使っていましたが、Vistaではdfrgui.exeが使われます。defrag.exe, dfrgntfs.exeの扱いはXPと同様です。GUIの実行前にはUACの一部であるconsent.exeも実行されます。
UserAssistにはdfrgui.exeのリンクファイルであるdfrgui.lnkの痕跡が残る可能性があります。また、Vistaはatimeをデフォルトで更新しないため、明示的にatimeの更新が有効になっていない限り調査には使えません。
大きな変更点として、Vistaではイベント/スケジューラログに、手動とシステムによる実行の両方をロギングするようになりました。ただしコマンドラインでの実行はログに残りません。ログの内容はスケジュールされたか、開始、完了、中断などの情報が含まれますが、プロセス自体はSYSTEMアカウントで実行されるため、実行したユーザは特定できません。