序章









本記事では,NTFSのファイルシステムにおいて"削除"の操作が何を意味するのか,Windows内部の処理に焦点をあてて解説しました。




ゴミ箱の存在と挙動









通常,Windowsでファイルを削除すると,「ゴミ箱」(Recycle Bin)と呼ばれる特殊な領域に移動します。これはWindows 95以降に導入された機能で,誤ってファイルを削除した場合に復元するなどの用途で利用できます。

ゴミ箱にアクセスするためのパスは `shell:RecycleBinFolder` ですが,データの実態はドライブ直下の `$Recycle.Bin` というフォルダーに保存されています。

また,ゴミ箱の内部的な処理は `Shell32.dll` が担当しており,explorer.exeが削除や復元の指示を出すという構図になっています。

削除したファイルのパスや削除日時などが`the index file`という専用のバイナリファイルに書き込まれます。詳細はこちらのドキュメントを参照して下さい。

参考までに,バージョンごとの`the index file`のパスは以下の通りです。




Windowsのバージョンゴミ箱のインデックスファイルのパス
Windows NT4<DriveLetter>:\RECYCLER\<UserSID>\INFO
Windows 2000<DriveLetter>:\RECYCLER\<UserSID>\INFO2
Windows XP<DriveLetter>:\RECYCLER\<UserSID>\INFO2
Windows Vista+<DriveLetter>:\$RECYCLE.BIN\<UserSID>\$I...





ただし,ここで<UserSID>はWindowsにおいてアカウント名とは別に割り当てられる内部のSID(セキュリティ識別子)を意味し,ドメイン情報などを含んだ乱数のような文字列となっています。具体的には,以下の形式です。

```MarkDown
S-R-X-Y1-Y2-Yn-1-Yn

S SIDであることを示す記号(Indicates that the string is a SID)
R SID仕様のバージョン(Indicates the revision level)
X ドメインとコンピュータや識別番号(Indicates the identifier authority value)
Y RID(セキュリティプリンシパル)情報 (Represents a series of subauthority values, where n is the number of values)

※2023年12月現在、Rは「1」のみ存在します。
```



なお,`the index file`には以下のような形式で削除情報が保存されます。

```MarkDown
// ヘッダー情報
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

// ファイルサイズ(バイト数)
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

// 削除日時(64bit)
0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xd7, 0x01,

// ファイルパスの長さ
0x0b, 0x00, 0x00, 0x00,

// ファイルパス(最後にNULLバイトを追加)
0x43, 0x00, 0x3a, 0x00,

0x5c, 0x00, 0x31, 0x00, 0x5c, 0x00, 0x31, 0x00,
0x2e, 0x00, 0x74, 0x00, 0x78, 0x00, 0x74, 0x00,
0x00, 0x00

```





ただし,厄介なことに,削除日時は1601年1月1日から経過した100ナノ秒の回数になっています。そのため,Unix時間としてパースしないように注意して下さい。




ゴミ箱から削除した後の行方









前述の通り,Windowsで普通にファイルを削除するだけではゴミ箱という名前のついたフォルダにデータを移動しているに過ぎません。ここでは,ゴミ箱からファイルを削除する場合,もしくはファイルをShift + Delのショートカットキーで完全に削除する場合の挙動を扱います。

まず,NTFSの構造についてです。そもそもNTFSは,先頭にブートセクタがあり,その後にMaster File Table(MFT)が続きます。そして中間にファイルのデータがあり,最後に追加のメタデータがあります。

```MarkDown
NTFS = Boot sector → MFT → Free Space → More metadata (→ Free Space)
```


NTFSの詳細はこちらのドキュメンテーションを参照して下さい。

NTFSの構造の内,ファイルの削除にあたって大きな役割を果たすのがMFTです。このMFTは,パーティションの管理情報や全ファイル/フォルダの情報を保持しており,通常はディスク容量の8分の1(12.5%)が割り当てられています。

MFTは先頭に「NTFS metafiles」(NFTSメタファイル)と呼ばれるデータが保存されており,Windowsにおいてはそれらを先頭にドルマークの付いた"特別なファイル"として扱うことがあります。

そしてNTFS metafilesの後に,各ファイルごとのMFTエントリ(ファイルレコード)が存在しています。なお,MFTエントリはファイルごとに1KBの固定長となっており,以下の11項目のデータが存在します。




種類属性名説明
0x10$STANDARD_INFORMATIONタイムスタンプやFlag(ファイルの種類),USN等
0x20$ATTRIBUTE_LISTMFT に入りきらなかった属性とその位置情報
0x30$FILE_NAMEファイル名(もしくはフォルダ名)
0x40$OBJECT_IDファイル識別子(Officeアプリ等で利用)
0x80$DATAファイルに書き込まれた内容
0x50$SECURITY_DESCRIPTOR所有者やアクセス権情報
0xE0$EA拡張属性
0x90$INDEX_ROOTB+Tree の最上位ノードの位置を示す(フォルダで使われる属性)
0xA0$INDEX_ALLOCATIONB+Tree の割り当て済 Index のリスト(フォルダで使われる属性)
0xB0$BITMAPB+Tree の Index の割り当て, 未割当を示す(フォルダで使われる属性)
0xC0$REPARSE_POINTSymbolic Link 等のリンク先を指定




引用元:【図解】NTFSファイルシステムの仕組みと構造解析

実は,ファイルが削除されると,いきなりデータを0x00で上書きするのではなく,そのファイルに関するMFTエントリが「削除された」とマークされます。

そして,再利用可能としてマークされたMFTエントリは,新しいファイルが作成されると必要に応じて再利用されます。

そのため,ファイルを完全に削除したつもりでも,この時点では実際のデータはまだ物理的にディスク上に残っているのです。これにより,新たなデータで領域がアロケーションユニット(クラスタ)が上書きされない限り,ファイルは復元が可能です。(いわゆる「ファイル復元ソフト」は,この仕組みを利用しています。)

技術的には,ファイルレコードのヘッダーにあるフラグが0x0001(ファイル)から0x0000(削除済みファイル)に変更されることで,ファイルを削除したものとして扱うようになります(フォルダーを削除した場合,0x0003から0x0002に変更されます)。




ファイルを完全に削除する方法









ファイルを本当の意味で完全に削除するには,エクスプローラーの"通常の方法"で削除を行うだけでは全く不十分であることが分かって頂けたかと思います。

では,ファイルを確実かつ安全に削除するにはどうすれば良いのでしょうか。一般的に,以下の二つの方法があります。

ディスクを(物理的に)破壊する
ファイルを複数回上書きする


前者は明らかです。ただし,ディスクを物理的に破壊したとしても,粉砕が不十分であれば残留した磁気から復元できる可能性がありますので,破壊は専門に扱う業者へ依頼しましょう。個人的には,目の前でハードディスクを破壊してくれるサービス「黒歴史最終処分場。」がお勧めです。

後者の方法については,消去を行うデバイスの種類によって上書きすべき内容や回数が異なりますが,最近ではほとんどのデバイスで1-2回の0x00/0xFFによる上書きを行えば十分のようです。企業秘密などの機密情報の場合,乱数による3回程度の上書きをお勧めしています。

また,私はファイルを復元できないように上書きして削除するツール「FileKiller」を開発しているので,ぜひご利用ください。

ちなみに,Windowsにはcipherというディスク単位で上書き削除を行うプログラムが内臓されているので,cipher /w:X:を実行すればディスクを完全に消去できます。






参考文献









NTFSの読み方 #NTFS - Qiita

【図解】NTFSファイルシステムの仕組みと構造解析~MFT, 拡張属性, 代替データストリーム~ | SEの道標

Master File Table (Developer Notes) - Win32 apps