4

Windows には、シャットダウン時にページ ファイルをクリアするオプションがあることを知っています。

Windows は、実際の物理/仮想メモリが範囲内または範囲外になったときに特別なことを行いますか?

たとえば、認識可能な文字列をメモリ内の変数に書き込むアプリケーション A を実行し、アプリケーションを閉じたとします。次に、アプリケーション B を実行します。アプリケーション B は大量のメモリを割り当て、内容を初期化せずに、アプリケーション A によって書き込まれた既知の文字列を検索します。

アプリケーション B がアプリケーション A によって書き込まれた文字列を取得する可能性はありますか? または、Windows はメモリを使用可能にする前にスクラブしますか?

4

1 に答える 1

10

Windows、他のプロセスに割り当てる前に、プロセスによって返された解放されたメモリを "スクラブ" します。このタスク専用のカーネル スレッドがあります。

ゼロ ページスレッドは最も低い優先度で実行され、空きページをゼロ化されたページ リストに移動する前にゼロ化します[1]

ゼロページ スレッド


機密データをページング ファイルに保持することを心配するよりも、そもそも (使用後に) メモリに保持し続けることを心配する必要があります。シャットダウン時にページ ファイルをクリアすることは、既定の動作ではありません。また、システム クラッシュ ダンプには、RAM に「プレーンテキスト」で保存されている機密情報が含まれます。

メモリがプロセスに割り当てられている限り、Windows はメモリを「スクラブ」しません(明らかに)。むしろ、そうするのはプログラム (mer) に任されています。この目的のために、SecureZeroMemory()関数を使用できます。

この関数は関数として定義されRtlSecureZeroMemory()ます ( を参照WinBase.h)。の実装RtlSecureZeroMemory()はインラインで提供され、どのバージョンの Windows でも使用できます (「 」を参照WinNT.h) 。

一部の C++ コンパイラは呼び出しを完全に削除してZeroMemory()最適化できるため、データがすぐに上書きされるようにする場合の代わりに、この関数を使用してください。ZeroMemory()

WCHAR szPassword[MAX_PATH];

/* Obtain the password */
if (GetPasswordFromUser(szPassword, MAX_PATH))
{    
    UsePassword(szPassword);
}

/* Before continuing, clear the password from memory */
SecureZeroMemory(szPassword, sizeof(szPassword));

Raymond Chen によるこの興味深い記事を読むことを忘れないでください。

于 2013-08-22T16:28:27.080 に答える