ActiveTK's Note

【詳解】NTFSでファイルを削除すると何が起こるのか


作成日時 2023/12/19 15:45
最終更新 2023/12/20 00:02


  • まず初めに
  • ゴミ箱の存在と挙動
  • ゴミ箱から削除した後の行方
  • ファイルを完全に削除する方法
  • 参考文献

  • まず初めに

    この記事は、NTFSのファイルシステムにおいて"削除"の操作が何を意味するのか、高度なIT技術者向けに書いた技術記事です。

    そのため、一部技術的な用語が注釈なしに使われている場合がありますので、分からない用語があれば適度に検索を行って下さい。

    また、筆者の私はMSで働く技術者ではなく、ごく一般的な普通の高校一年生です。内容に誤りがあった場合、こちらからお知らせ下さい。


    ゴミ箱の存在と挙動

    通常、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(セキュリティ識別子)を意味し、ドメイン情報などを含んだ乱数のような文字列となっています。具体的には、以下の形式です。

    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`には以下のような形式で削除情報が保存されます。

    // ヘッダー情報
    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)が続きます。そして中間にファイルのデータがあり、最後に追加のメタデータがあります。

    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 等のリンク先を指定

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

    実は、ファイルが削除されると、いきなりデータを0x00で上書きするのではなく、そのファイルに関するMFTエントリが「削除された」とマークされます。 そして、再利用可能としてマークされたMFTエントリは、新しいファイルが作成されると必要に応じて再利用されます。

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

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


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

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

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

     ・ディスクを(物理的に)破壊する

     ・ファイルを複数回上書きする

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

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

    ちなみに、私はちょうど2年前、中学二年生のときにファイルを上書き削除するツール「FileKiller」を開発しているので、よろしければご利用ください。

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


    参考文献

    NTFSの読み方 #NTFS - Qiita

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

    Master File Table (Developer Notes) - Win32 apps