← ブログに戻る

ボリューム シャドウ コピーと $MFT: 古いバージョンのテーブルを復元する

· 読了 2 分

結論: Volume Shadow Copy の各スナップショットには、取得時点での $MFT の凍結コピーが含まれます。古いスナップショットをマウントして $MFT をエクスポートすれば、今日のファイル システムを 1 週間前のものと比較したり、スナップショット間で削除されたファイルを復元したり、時間とともにメタデータが変化する様子を観察したりできます。

VSS が捉えるもの

Volume Shadow Copy Service(VSS)は NTFS ボリュームのある時点のスナップショットを取ります。各スナップショットはコピー オン ライトのデルタです — ブロックが変更されようとするとき、元のものがまずシャドウ コピーに保存されます。したがってスナップショットは、Master File Table を含めて、作成時点でのボリュームをそのまま反映します。

典型的な Windows エンドポイントではスナップショットは自動で取られます — 通常は Windows Update の前、System Restore によるもの、サードパーティのバックアップ ソフトによるものなど。ワークステーションには数週間前まで遡る半ダースほどのスナップショットがあっても珍しくありません。

フォレンジックで重要な理由

ライブの $MFT は 1 つの観測です。5 つのスナップショットを持つボリュームは 6 つの観測 を提供します — 今日と過去 5 つです。各過去 $MFT はその瞬間のボリュームの状態を記録しており、以下を含みます。

  • 当時存在し、それ以来削除されたファイル — 完全に復元可能。
  • 今存在するが当時はなかったファイル — いつ導入されたかを証明。
  • タイムスタンプが今日と異なるレコード — スナップショット間で起きたリネーム、移動、タイムストンピングを露呈。

スナップショットはランサムウェア事案で特に有用です。VSS が削除されていなければ(一部のランサムウェアは試みます — MFT におけるランサムウェアのパターン 参照)、古いスナップショットのいずれかに暗号化前の $MFT と、しばしば元のファイル データが含まれます。

スナップショット一覧

管理者権限の PowerShell から:

vssadmin list shadows

各エントリは \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy7 のような Shadow Copy Volume パスを示します。このパスはマウント可能です。

フォレンジック イメージからは libvshadow を使います。vshadowinfo ツールは .dd.E01 イメージ内のスナップショットを列挙し、vshadowmount はそれらを個別の仮想ボリュームとして公開します。

vshadowinfo disk.dd
vshadowmount disk.dd /mnt/shadows

マウント後、vss1vss2、... が個別のファイルとして得られ、それぞれを NTFS ボリュームとして解析できます。

スナップショットから $MFT を取り出す

スナップショットがマウントされると(ライブ システムまたは vshadowmount 経由)、$MFT は親ボリュームと同じオフセット — スナップショットのルート — に存在します。ライブのものを取り出すのと同じツールで取り出します。

  • fsutil(ライブ システム): fsutil file queryextents \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy7\$Mft
  • FTK Imager: シャドウ コピー デバイスを証拠として追加し、$MFT までナビゲートしてエクスポート。
  • The Sleuth Kit の icat(イメージ): icat -o <offset> vss1 0 > mft_vss1.bin(inode 0 は常に $MFT)。
  • KAPEMFT ターゲットを、マウント済みの各スナップショットに対して実行。

ライブ システムでの仕組みは $MFT の取り出し を参照してください。

2 つの MFT を比較する

最も安価で有用な解析は diff です。両方の $MFT ファイルを CSV(レコードごとに 1 行)に解析し、レコード番号でソートして diff を取ります。

mft_dump -o csv mft_today.bin   > today.csv
mft_dump -o csv mft_vss3.bin    > vss3.csv
diff <(sort today.csv) <(sort vss3.csv) > changes.diff

探すべきもの:

  • vss3 に存在し、today で削除済みまたは欠落しているレコード — 期間中に削除されたファイル。
  • today に存在し、vss3 にないレコード — 期間中に導入されたファイル。
  • $STANDARD_INFORMATION のタイムスタンプが過去に動いたレコード — タイムストンピングの可能性(スナップショットが真実値)。
  • $FILE_NAME の親参照が変わったレコード — ファイルが別のディレクトリに移動。

$UsnJrnl レベルで同じ diff を取るとさらに豊かな情報が得られます。MFT の diff と合わせれば全体像が掴めます。

制限

  • スナップショットは削除されうる。 vssadmin delete shadows /all は 1 行で全消去でき、ランサムウェアの定石です。既に追い出されたスナップショットは戻りません — VSS は既定で最大 64 までです。
  • スナップショットは任意の時点ではない。 スケジュールされたものやインストーラがトリガしたものしか得られません。インシデント発生のまさにその瞬間のスナップショットがあることは稀です。
  • 古い $MFT の常駐データはスナップショットの範囲を超えて保存されません。 ファイルがあるスナップショットに存在し、かつ小さかったなら、そのスナップショットに常駐バイトが入っています。削除後に取られたスナップショットからデータを復元できると期待してはいけません。

よくある質問

Linux から VSS スナップショットを読めますか?

はい — libvshadow はクロスプラットフォームです。vshadowmount でイメージをマウントし、NTFS 対応ツールでスナップショット ボリュームを通常ファイルとして読めます。

スナップショットには $MFT のようなシステム ファイルが含まれますか?

はい。VSS スナップショットはスナップショット時点でのボリューム上のすべてのブロックを捕捉します。$MFT 先頭のメタデータ ファイルも含まれます。

Windows はスナップショットをいくつ保持しますか?

既定でボリュームあたり最大 64 です。設定はレジストリの MaxShadowCopies で、カスタマイズされることはほぼありません。バックアップ ソフトが入ったサーバーでは、実効上限は通常バックアップ ソフトが保持する数になります。

シャドウ コピーのデータは消去に強いですか?

ライブ ボリューム上の個別ファイルの削除に対しては強いです — それが目的です。vssadmin delete shadows、ディスク全体の消去、物理メディア損傷に対しては強くありません。

外部リソース