メモリダンプから ShimCache を抽出する

読了 1 分

TL;DR. ShimCache はメモリに存在します。ディスク上の SYSTEM ハイブには直近の正常シャットダウン時に書き出されたエントリしかありません。稼働中またはクラッシュしたホストの現セッションのエントリを回収するには、Volatility 3 の windows.shimcachemem(または Velociraptor の Windows.Registry.AppCompatCache アーティファクト)をメモリイメージに対して実行してください。

ShimCache は Windows が稼働している間は揮発性メモリ上に存在し、正常シャットダウン時にのみ SYSTEM ハイブへ書き出されます(タイミングの詳細)。つまり、稼働中ホストのメモリイメージは、直近セッションの ShimCache エントリ — まさに進行中のインシデントに関連性が高いエントリ — を見つけられる 唯一の 場所であることが多いのです。

メモリのコピーがディスクのコピーよりも重要になる場面

メモリ内 ShimCache が欲しいのは次のような時です。

  • インシデント以降、ホストが 正常にシャットダウンされていない 場合。ハード再起動、BSOD、強制電源断のいずれでも、SYSTEM ハイブの ShimCache は古いままになります。
  • アンチフォレンジック を疑う場合。ディスク上のハイブを編集した攻撃者でも、メモリ内のコピー(毎セッション再構築される)には触れていないことがあります。アンチフォレンジック検出 を参照。
  • 直近の書き出し時に ディスク上のハイブから追い出された エントリが必要な場合。1,024 件の上限により古いエントリは押し出されますが、条件次第ではまだメモリに残っていることがあります。

Volatility 2 で

定番のプラグインは shimcachemem です。XP〜Win10 のメモリイメージに対して:

vol.py -f memory.raw --profile=Win10x64_19041 shimcachemem

これは SYSTEM ハイブのメモリ内表現にある AppCompatCache 構造体を辿り、オフライン・パーサーと同じく (mtime, パス) の行を出力します。プラグインのソースと利用ノートは Volatility 2 リポジトリ にあります。

Volatility 3 で

Volatility 3 ではこれが windows.shimcachemem として継承されています:

vol -f memory.raw windows.shimcachemem

プロファイル選択は不要です(Vol 3 は OS を自動判別)。プラグインは Windows アーティファクト一式と並んで Volatility 3 ドキュメント に整理されています。

Velociraptor で

単一ダンプの解析ではなく、大規模に収集する場合は、Velociraptor の Windows.Registry.AppCompatCache アーティファクトを使うと、稼働中エンドポイントのライブ・レジストリ・ビュー経由でメモリ内 ShimCache を直接読めます。これは OS がシャットダウン時にディスクへ書き出していたであろう ShimCache そのもの — シャットダウンを待たずに、です。

2 つのビューを組み合わせる

実務的にはしばしば、次の両方を手にします。

  • Volatility プラグインまたは Velociraptor 収集から得た メモリ内 ShimCache
  • 同じホストの SYSTEM ハイブから得た ディスク上 ShimCache

正常シャットダウンが起きていない時点では、メモリ内コピーがディスク・コピーの上位集合になります — ただしディスク・コピーには、長時間稼働後にメモリから追い出された古いエントリが含まれることもあります。両方を取得し、(パス, mtime) で重複排除した和集合を ハンティング・ワークフロー に流し込んでください。

次に役立つステップ

エントリが揃ったら:

  • 抽出したハイブの素早いオフライン・トリアージには Shimcache Parser を。ブラウザ内で動作し、アップロード不要です。
  • 生 Blob を自分でデコードする場合は バイナリフォーマットのリファレンス を参照。
  • メモリから復元したエントリが「実行された」ことを意味すると主張する前に、必ず 実行証明 を確認してください。

さらに読む

関連記事