概要
Windows NT/2000 (Win2K) が C2 に準拠していることの 1 つの特徴として、オブジェクトの再利用の保護を実装している点が挙げられます。つまり、アプリケーションでファイル領域や仮想メモリを割り当てる際、アプリケーションでは、Windows NT/2K によって割り当てられるリソースに以前格納されていたデータを確認できないということです。Windows NT では、アプリケーションにメモリまたはディスクのセクターを提供する前に、メモリの領域に 0 を設定し、ファイルが配置されているディスクのセクターに 0 を設定します。ただし、オブジェクトの再利用を行う場合は、ファイルが削除される前に占有していた領域に 0 が設定されるわけではありません。これは、Windows NT/2K が、オペレーティング システムがシステム リソースへのアクセスを制御することを前提として設計されているためです。ただし、オペレーティング システムがアクティブでない場合は、raw アクセス モードでディスクを編集するエディターや回復ツールを使用して、オペレーティング システムが割り当てを解除したデータを確認したり回復したりすることができてしまいます。Win2K の暗号化ファイル システム (EFS) を使用してファイルを暗号化した場合でも、ファイルの暗号化された新しいバージョンを作成すると、暗号化されていない元のファイル データはそのままディスクに残ります。
削除したファイルや EFS を使用して暗号化したファイルが回復されないようにするには、安全な削除アプリケーションを使用するしか方法はありません。安全な削除アプリケーションは、ディスク上にある、削除されたファイルのデータを上書きします。その際、磁気メディアのパターンを読み取ることができ脆弱な方法で削除されたファイルの内容を解明するような回復テクノロジを使用してもディスク データを回復できないようにする手法が使用されます。SDelete (Secure Delete) は、このようなアプリケーションです。SDelete を使用すると、既存のファイルを安全に削除したり、ディスクの未割り当ての領域に存在するファイル データ (既に削除または暗号化したファイルも含まれます) を安全に削除したりすることができます。SDelete は、米国防総省の、削除と消去に関する規格 DOD 5220.22-M を満たしているので、SDelete を使用して削除したファイル データは完全に消去されたと確信することができます。SDelete を使用すると、ファイル データは安全に削除されますが、ディスクの空き領域にあるファイル名は削除されないことに注意してください。
SDelete の使用
SDelete は、たくさんのオプションを使用できるコマンド ライン ユーティリティです。SDelete を使用すると、1 つまたは複数のファイルやディレクトリを削除したり、論理ディスク上の空き領域から不要なものを除去したりできます。また、ディレクトリやファイルを指定するときにワイルド カード文字を使用できます。
使用法: sdelete [-p <回数>] [-s] [-q] <ファイルまたはディレクトリ> ... sdelete [-p <回数>] [-z|-c] [<ドライブ文字>] ... -a 読み取り専用の属性を削除します。 -c 空き領域から不要なものを除去します。 -p <回数> 上書きの回数を指定します (既定値は 1 です)。 -q エラーを出力しないようにします (Quiet モードで実行します)。 -s または -r サブディレクトリを再起処理します。 -z 空き領域に 0 を設定します (仮想ディスクの最適化に適しています)。
SDelete のしくみ
特殊な属性を持たないファイルを安全に削除するのは比較的簡単で、安全な削除プログラムでは、安全な削除パターンを使用してファイルを上書きするだけです。厄介なのは、Windows NT/2K の圧縮されたファイル、暗号化されたファイル、およびスパース ファイルを安全に削除したり、ディスクの空き領域から不要なものを安全に除去したりすることです。
NTFS では、圧縮されたファイル、暗号化されたファイル、およびスパース ファイルを、16 個のクラスターで構成されるブロック単位で管理します。プログラムでこのようなファイルの既存の領域に書き込みを行うと、NTFS では、ディスク上の新しい領域を新しいデータの格納先として割り当てます。新しいデータが書き込まれると、NTFS では、それまでそのファイルによって占有されていたクラスターの割り当てを解除します。NTFS では、データの整合性に関する理由から、この慎重な手法を使用します。また、圧縮されたファイルおよびスパース ファイルの場合は、新しい割り当てが既存の割り当てよりも大きい (圧縮された新しいデータが圧縮された古いデータよりも大きい) 場合に備えて、この手法を使用します。そのため、このようなファイルを上書きしても、ファイルのコンテンツをディスクから削除することはできません。
このような種類のファイルを処理するために、SDelete では最適化 API を利用します。最適化 API を使用すると、SDelete は、圧縮されたファイル、スパース ファイル、および暗号化されたファイルに属するデータが占有している、ディスク上のクラスターを正確に特定できます。SDelete では、当該のファイルのデータが含まれるクラスターを特定したら、ディスクを開いて raw アクセスを行い、そのようなクラスターを上書きすることができます。
空き領域から不要なものを除去するには、また別の課題があります。FAT および NTFS では、空き領域を直接処理する方法をアプリケーションに提供していないため、SDelete では 2 つの方法のいずれかを使用します。1 つ目の方法は、圧縮されたファイル、スパース ファイル、および暗号化されたファイルの場合と同様に、ディスクを開いて raw アクセスを行い、空き領域を上書きするというものです。ただし、この方法には大きな問題があります。SDelete のコードが、NTFS ドライブおよび FAT ドライブの空き領域を計算できるように記述されているとしても (これは簡単な処理ではありません)、システムで実行されているアクティブなファイル操作との競合が発生する危険性があります。たとえば、SDelete がクラスターが空いていると判断したのとちょうど同時に、ファイル システム ドライバー (FAT、NTFS) が、別のアプリケーションで変更を加えているファイルに、そのクラスターを割り当てることを決定したとします。ファイル システム ドライバーはクラスターに新しいデータを書き込み、そのすぐ後に、SDelete が書き込まれたばかりのデータを上書きします。そのため、ファイルの新しいデータは消去されてしまいます。SDelete を使用するとファイル システムのディスク上の構造が破損するため、クラスターがファイル システムのメタデータに割り当てられている場合は問題がさらに悪化します。
2 つ目の方法は SDelete で採用している方法で、空き領域を間接的に上書きするというものです。まず、SDelete は、できるだけ大きなファイルを割り当てます。この際、SDelete は、NT ファイル システム キャッシュのコンテンツが削除され SDelete の領域占有ファイルに関連する不要なデータと置き換えられることがないように、キャッシュされていないファイルの I/O を使用します。キャッシュされていないファイルの I/O はセクター (512 バイト) に合わせて配置される必要があるので、SDelete でそれ以上ファイルのサイズを大きくすることができなくても、SDelete ファイルに割り当てられていない領域がある程度残っている可能性があります。残りの領域を取得するため、SDelete は、今度はできるだけ大きいキャッシュされたファイルを割り当てます。どちらのファイルについても、SDelete では、安全な方法で上書きを実行し、それまで空き領域だったすべてのディスク領域から不要なものが安全に除去されるようにします。
NTFS ドライブでは、2 つのファイルの割り当てと上書きが済んでも、SDelete の任務が完了したとは限りません。SDelete は、NTFS MFT (マスター ファイル テーブル) の既存の空き領域を、1 つの MFT レコードに収まるサイズのファイルで満たすという処理も行う必要があります。MFT レコードのサイズは通常 1 KB で、ディスク上のすべてのファイルまたはディレクトリには、少なくとも 1 つの MFT レコードが必要です。小さなファイルはファイル全体が MFT レコードに格納され、1 つのレコードに収まらないファイルには、MFT の外にあるクラスターが割り当てられます。MFT の空き領域に対処するために SDelete が行う必要があるのは、できるだけ大きなファイルを割り当てることだけです。MFT レコード内の利用可能な領域がすべてファイルで占有されている場合、ディスク上に空いているクラスターは残っていないため (クラスターは SDelete によって既に割り当てられた 2 つのファイルで使用されています)、NTFS ではファイルがそれ以上大きくならないようにします。その後、SDelete では処理を繰り返し実行します。SDelete では、それ以上新しいファイルを作成することができなくなると、MFT 内の以前は空き領域だったレコードが、すべて安全に上書きされたファイルで完全に満たされていると認識します。
削除したファイルの名前を上書きするため、SDelete では、ファイルの名前を 26 回変更します。毎回、ファイル名のすべての文字が特定のアルファベット文字で置き換えられます。使用される文字は毎回異なり、各アルファベット文字が昇順で使用されます。たとえば、"foo.txt" は、1 回目の名前変更では "AAA.AAA" という名前になります。
SDelete でディスクの空き領域から不要なものを除去する際にファイル名を安全に削除できないのは、ファイル名を削除するにはディレクトリ構造を直接操作する必要があるからです。ディレクトリ構造には、削除されたファイル名を含む空き領域が含まれている可能性がありますが、ディレクトリの空き領域を他のファイルに割り当てることはできません。そのため、SDelete では、この空き領域を安全に上書きできるようにこの領域を割り当てることができません。
SDelete のダウンロード
(81 KB)