データ実行防止
データ実行防止 (DEP) は、Windows XP および Windows Server 2003 以降のオペレーティング システムに組み込まれているシステム レベルのメモリ保護機能です。 DEP を使用すると、システムは 1 ページ以上のメモリを非実行可能としてマークできます。 メモリ領域を非実行可能としてマークすると、そのメモリ領域からコードを実行できないため、バッファー オーバーランの悪用が困難になります。
DEP を使用すると、既定のヒープ、スタック、メモリ プールなどのデータ ページからコードが実行されなくなります。 アプリケーションが保護されているデータ ページからコードを実行しようとすると、メモリ アクセス違反の例外が発生し、例外が処理されない場合は、呼び出し元のプロセスが終了します。
DEP は、すべての悪用に対する包括的な防御を意図したものではありません。これは、アプリケーションをセキュリティで保護するために使用できる別のツールであることを目的としています。
データ実行防止のしくみ
アプリケーションが保護されたページからコードを実行しようとすると、アプリケーションは状態コード STATUS_ACCESS_VIOLATIONで例外を受け取ります。 アプリケーションでメモリ ページからコードを実行する必要がある場合は、適切な仮想 メモリ保護 属性を割り当てて設定する必要があります。 割り当てられたメモリは、メモリの割り当て時 に、PAGE_EXECUTE、 PAGE_EXECUTE_READ、 PAGE_EXECUTE_READWRITE、または PAGE_EXECUTE_WRITECOPY としてマークする必要があります。 malloc 関数と HeapAlloc 関数を呼び出すことによって行われたヒープ割り当ては、実行可能ではありません。
アプリケーションは、既定のプロセス ヒープまたはスタックからコードを実行できません。
DEP は、ブート構成データの実行なしのページ保護ポリシー設定に従って、システムの起動時に構成されます。 アプリケーションは、 GetSystemDEPPolicy 関数を呼び出すことによって、現在のポリシー設定を取得できます。 ポリシー設定に応じて、アプリケーションは SetProcessDEPPolicy 関数を呼び出すことによって、現在のプロセスの DEP 設定を変更できます。
プログラミングの考慮事項
アプリケーションでは 、VirtualAlloc 関数を使用して、適切なメモリ保護オプションを使用して実行可能メモリを割り当てることができます。 アプリケーションは、少なくとも PAGE_EXECUTE メモリ保護オプションを設定することをお勧めします。 実行可能コードが生成されたら、アプリケーションでメモリ保護を設定して、割り当てられたメモリへの書き込みアクセスを禁止することをお勧めします。 アプリケーションでは、 VirtualProtect 関数を使用して、割り当てられたメモリへの書き込みアクセスを禁止できます。 書き込みアクセスを許可しない場合、プロセス アドレス空間の実行可能領域に対する最大限の保護が保証されます。 可能な限り最小の実行可能アドレス空間を使用するアプリケーションを作成し、メモリの悪用に公開されるメモリの量を最小限に抑える必要があります。
また、アプリケーションの仮想メモリのレイアウトを制御し、実行可能領域を作成する必要もあります。 これらの実行可能領域は、非実行可能領域よりも低いメモリ領域に配置する必要があります。 実行可能領域を非実行可能領域の下に配置することで、バッファー オーバーフローがメモリの実行可能領域にオーバーフローするのを防ぐことができます。
アプリケーションの互換性
一部のアプリケーション機能は DEP と互換性がありません。 動的なコード生成 (Just-In-Time コード生成など) を実行し、生成されたコードを実行アクセス許可で明示的にマークしないアプリケーションでは、DEP を使用しているコンピューターで互換性の問題が発生する可能性があります。 Active Template Library (ATL) バージョン 7.1 以前に書き込まれたアプリケーションは、非実行可能としてマークされたページでコードの実行を試みることができます。これにより、NX エラーがトリガーされ、アプリケーションが終了します。詳細については、「 SetProcessDEPPolicy」を参照してください。 DEP と互換性のないアクションを実行するほとんどのアプリケーションは、正しく機能するように更新する必要があります。
少数の実行可能ファイルとライブラリに、イメージ ファイルのデータ セクションに実行可能コードが含まれている場合があります。 場合によっては、アプリケーションがデータ セクションにコードの小さなセグメント (一般にサンクと呼ばれる) を配置する場合があります。 ただし、DEP は、セクションに実行可能属性が適用されていない限り、メモリに読み込まれるイメージ ファイルのセクションを非実行可能としてマークします。
したがって、データ セクション内の実行可能コードをコード セクションに移行するか、実行可能コードを含むデータ セクションを明示的に実行可能としてマークする必要があります。 実行可能な属性 IMAGE_SCN_MEM_EXECUTE、実行可能コードを含むセクションの対応するセクション ヘッダーの [特性 ] フィールドに追加する必要があります。 セクションに属性を追加する方法の詳細については、リンカーに含まれているドキュメントを参照してください。