SDelete v2.05

作成者: Mark Russinovich

公開日: 2023 年 9 月 29 日

DownloadSDelete をダウンロード (304 KB)

はじめに

Windows NT/2000 (Win2K) C2 コンプライアンスの特徴の 1 つは、オブジェクト再利用保護を実装していることです。 つまり、アプリケーションによりファイル領域または仮想メモリが割り当てられると、以前に Windows NT/2K によって割り当てられたリソースに格納されているデータを表示できなくなります。 Windows NT はメモリをゼロにし、ファイルが配置されたディスク上のセクターをゼロにしてから、いずれかの種類のリソースをアプリケーションに提示します。 ただし、オブジェクトの再利用では、ファイルの削除前に占有する領域をゼロにする必要はありません。 これは、Windows NT/2K が、システム リソースへのアクセスをオペレーティング システムにより制御されることを前提として設計されているためです。 ただし、オペレーティング システムが稼働していない場合は、未加工のディスク エディターと回復ツールを使用することで、オペレーティング システムが割り当てを解除したデータを表示および回復することができます。 Win2K の暗号化ファイル システム (EFS) を使用してファイルを暗号化する場合でも、ファイルの暗号化された新しいバージョンが作成された後も、ファイルの元の暗号化されていないファイル データはディスク上に残されます。

削除されたファイル、および EFS で暗号化されたファイルを回復から保護する唯一の方法は、セキュリティで保護された削除アプリケーションを使用することです。 セキュリティで保護された削除アプリケーションでは、ディスク データを回復不能にする手法を使用して、または、弱く削除されたファイルを洗い出す磁気メディアのパターンを読み取ることができる回復技術を使用することでも、削除されたファイルのディスク上のデータを上書きできます。 SDelete (Secure Delete) はこのようなアプリケーションです。 SDelete を使用すると、既存のファイルを安全に削除したり、ディスクの未割り当て部分 (既に削除または暗号化されたファイルを含む) に存在するすべてのファイル データを安全に消去したりできます。 SDelete には、国防総省が策定したクリアおよびサニタイズに関する基準である DOD 5220.22-M が実装されています。SDelete を使用して削除すると、ファイル データが永久に消去されたことを確信することができます。 SDelete はファイル データを安全に削除しますが、空きディスク領域にあるファイル名は削除しないことにご注意ください。

SDelete の使用

SDelete は、いくつかのオプションを使用するコマンド ライン ユーティリティです。 任意の用途で、1 つ以上のファイルやディレクトリを削除したり、論理ディスク上の空き領域をクリーンアップしたりできます。 SDelete では、ディレクトリまたはファイル指定子の一部として、ワイルド カード文字を受け入れます。

使用法:

sdelete [-p passes] [-r] [-s] [-q] [-f] <file or directory [...]>
sdelete [-p passes] [-q] [-z|-c] <drive letter [...]>
sdelete [-p passes] [-q] [-z|-c] <physical disk number [...]>
パラメーター 説明
-c 空き領域をクリーンアップします。
-f 文字のみを含む引数を、ディスクではなくファイル/ディレクトリとして扱うよう強制します。
引数に他の文字 (パス区切り記号やファイル拡張子など) が含まれている場合は不要で。
-p 上書きパスの値を指定します (既定値は 1)。
-q 非表示モードです。
-r 読み取り専用属性を除去します。
-s サブディレクトリを再帰します。
-z 空き領域ゼロ (仮想ディスクの最適化に適しています)。
-nobanner スタートアップ バナーと著作権メッセージを表示しないでください。
  • ディスクをクリーンアップするには、ボリュームを持っていてはいけません。
  • ドライブ文字の場合は、: (たとえば D:) を含めてください。

SDelete のしくみ

特別な属性を持たないファイルの安全な削除は比較的単純な作業です。セキュリティで保護された削除プログラムが、セキュリティで保護された削除パターンでファイルを上書きするだけです。 慎重な対応を要するのは、Windows NT/2K 圧縮ファイル、暗号化ファイル、スパース ファイルを安全に削除することや、ディスクの空き領域を安全にクリーンアップすることです。

圧縮、暗号化、スパースは、NTFS によって 16 クラスター ブロックで管理されています。 このような NTFS ファイルの既存の部分に対してプログラムが書き込む場合は、新しいデータを格納するためにディスクに新しい領域を割り当て、新しいデータが書き込まれてから、ファイルが以前占有していたクラスターの割り当てを解除します。 NTFS では、圧縮ファイルとスパース ファイルの場合、新しい割り当てが既存のものより大きい場合 (新しい圧縮データは古い圧縮データよりも大きくなります) に、データの整合性に関連する理由から、この保守的なアプローチを採用しています。 したがって、このようなファイルの上書きでは、ファイルの内容をディスクから削除できません。

これらの種類のファイルを処理するために、SDelete は defragmentation API を活用します。 defragmentation API を使用すると、SDelete は、圧縮、スパース、暗号化ファイルに属するデータがディスク上のどのクラスターを占有しているかを正確に判断できます。 SDelete がファイルのデータを含むクラスターを認識すると、生アクセス用にディスクを開き、それらのクラスターを上書きすることができます。

空き領域のクリーンアップに、もう 1 つの課題があります。 FAT と NTFS はアプリケーションが空き領域に直接対処する手段を提供しないため、SDelete に 2 つのオプションのいずれかが含まれます。 1 つ目は、圧縮、スパース、暗号化ファイルの場合と同様に、生アクセス用にディスクを開き、空き領域を上書きできることです。 このアプローチには大きな問題があります。SDelete が NTFS ドライブと FAT ドライブの空き領域部分を完全に計算できるようにコード化されている場合でも (簡単ではない)、システム上で実行されているアクティブなファイル操作と競合するリスクがあります。 たとえば、SDelete がクラスターの空きを判断し、その時点でファイル システム ドライバー (FAT、NTFS) が、別のアプリケーションによって変更中のファイルにクラスターを割り当てることを決定したとします。 ファイル システム ドライバーが新しいデータをクラスターに書き込むと、SDelete が実行され、書き込まれたばかりのデータが上書きされます。つまり、ファイルの新しいデータは消去されます。 SDelete がファイル システムのディスク上の構造を破損させるため、クラスターがファイル システム メタデータに割り当てられている場合、問題はさらに悪化します。

2 つ目の方法では、SDelete が、空き領域を間接的に上書きします。 まず、SDelete は可能な限り大きいファイルを割り当てます。 SDelete は、キャッシュされていないファイル I/O を使用してこれを行うため、NT ファイル システム キャッシュの内容がクリアされ、SDelete の領域を多く占有するファイルに関連付けられている役に立たないデータに置き換えられることはありません。 キャッシュされていないファイル I/O はセクター (512 バイト) にアラインされている必要があるため、SDelete がファイルをもう拡張できない場合でも、SDelete ファイルに割り当てられていない残りの領域が存在する可能性があります。 残りの領域を取得するには、次に SDelete が可能な限り大きいキャッシュ済みファイルを割り当てます。 これらの両方のファイルに対して、SDelete はセキュリティで保護された上書きを実行し、以前に空いていたすべてのディスク領域が安全にクリーンアップされるようにします。

NTFS ドライブでは、この 2 つのファイルを割り当てて上書きした後に、SDelete のジョブが必ずしも実施されるとは限りません。 また、SDelete は、NTFS MFT (マスター ファイル テーブル) の既存の空き部分も、MFT レコード内に収まるファイルでいっぱいにする必要があります。 通常、MFT レコードのサイズは 1 KB で、ディスク上のいかなるファイルまたはディレクトリにも、少なくとも 1 つの MFT レコードが必要です。 小さいファイルは MFT レコード内に完全に格納されますが、レコード内に収まらないファイルは MFT の外部にあるクラスターに割り当てられます。 すべての SDelete が MFT の空き領域を確保するためにすべきことは、可能な限り大きいファイルを割り当てることです。ファイルが MFT Record NTFS 内のすべての使用可能な領域を占有していると、ディスクに空きクラスターが残らないためファイルの拡張を妨げることになります (以前に SDelete が割り当てた 2 つのファイルによって保持されています)。 その後、SDelete はプロセスを繰り返します。 SDelete が新しいファイルを作成できなくなった場合、MFT 内にある以前の空きレコードがすべて、安全に上書きされたファイルでいっぱいになったことを意味します。

削除したファイルのファイル名を上書きするために、SDelete はファイルの名前を 26 回変更し、ファイル名の各文字を連続するアルファベット文字に置き換えます。 たとえば、最初の名前が "foo.txt" の場合、"AAA.AAA" になります。

ディスクの空き領域をクリーンアップするときに SDelete がファイル名を安全に削除しないのは、削除するにはディレクトリ構造を直接操作する必要があるからです。 ディレクトリ構造は、削除されたファイル名を含む空き領域を持つことができますが、ディレクトリの空き領域は他のファイルに割り当てることはできません。 そのため、SDelete には、この空き領域を安全に上書きできるように割り当てる方法がありません。

DownloadSDelete をダウンロード (304 KB)

実行場所:

  • クライアント: Windows 10以降。
  • サーバー: Windows Server 2012 およびそれ以降。
  • Nano Server: 2016 以降。