TL;DR. Prefetch は実行回数と実行時刻を伴う本物の実行証拠です。ShimCache はファイルが存在し検査されたことしか証明しません。「実行されたか、いつか?」が必要なら、まず Prefetch を見ます。Prefetch が無効化または消去されていれば、ShimCache が存在についての予備証人になります。
ShimCache と Prefetch は、どちらも「Windows ホスト上のプログラム」を浮かび上がらせるため、絶えず比較されます。しかし両者は同じ種類の証拠ではなく、互換とみなすと誤った結論を生みます。以下が直接比較です。
概要
| ShimCache | Prefetch | |
|---|---|---|
| 場所 | HKLM\SYSTEM\…\AppCompatCache | C:\Windows\Prefetch\*.pf |
| 何を証明するか | ファイルが存在した/検査された | ファイルが実行された |
| 実行回数 | なし | あり |
| 実行タイムスタンプ | なし(ファイル mtime のみ) | あり — 直近 8 回の実行時刻 |
| 参照ファイル | なし | あり — 読み込まれた DLL・データファイル |
| 書き込み時点 | クリーンシャットダウン時のみ | 実行後 約 10 秒以内 |
| サーバーでの既定 | 有効 | しばしば無効 |
| 容量 | 最大 1,024 エントリ | 1,024 個の .pf(Win8 以降) |
Prefetch が勝る点
Prefetch はより強力な実行アーティファクトです、以上。各 .pf は最終実行時刻(Windows 8 以降は最大 8 回)、総実行回数、プロセスが読み込んだファイル一覧を提供します。これは「この binary はこれらの時刻に実行された」と断言するのに十分です — ShimCache には決してできないことです。その唯一のタイムスタンプはファイルの最終更新時刻であり、実行時刻ではないからです。
ShimCache が勝る点
Prefetch には致命的な弱点があります。サーバー、SSD 向けに調整されたイメージ、そして攻撃者によって頻繁に無効化されます(EnablePrefetcher = 0)。クリーンアップツールにより能動的に削除もされます。一方 ShimCache は常に有効で、実行される前に投下され削除された binary すら記録できるほど鋭敏です。Prefetch が空のとき、ShimCache はなお**「このファイルはこのホストに触れたことがあるか?」**にしばしば答えます — その推論をどこまで押せるかはShimCache はプログラムが実行されたことの証明になるか?を参照。
一緒に使う方法
- 両方あり、パス一致: 強力な実行証拠。Prefetch の実行時刻をイベントタイムラインに、ShimCache の mtime はファイル同一性の固定にのみ使う。
- Prefetch のみ: 実行は証明済み。ShimCache は単にまだフラッシュされていないだけかもしれません(シャットダウン時のみ書き込み — ShimCache の保存場所参照)。
- ShimCache のみ: ファイルは存在し検査された。裏付けなしに実行を主張しないこと — AmCache、BAM、イベントログを収集する(完全な対応表はこちら)。
- どちらもないが実行を疑う: アンチフォレンジックを探す。Prefetch の削除と ShimCache フラッシュの欠如は、それ自体が所見であり、ShimCache アンチフォレンジックで扱っています。
ShimCache 側を何もインストールせずに読むには、SYSTEM ハイブを Shimcache Parser にドロップしてください — すべてブラウザ内で完結します。
さらに読む
- Prefetch フォーマットの解説 (libscca) —
.pfバイナリレイアウトのリファレンス。 - Mandiant: leveraging the ShimCache — ShimCache のフォレンジック上の役割を定義。