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 によるこの興味深い記事を読むことを忘れないでください。