DelphiとC++Builderはバージョン「11.1」で、Windowsアプリケーション向けのいくつかのPEセキュリティフラグをデフォルトで有効にしています。いくつかのフラグはすでに利用可能になっていますが、少し見つけにくい場所にあります。
Delphiでは、いくつかのASLRおよびその他の推奨されるWindowsセキュリティフラグをコマンドラインのオプションとしてずっとサポートしてきました。これらのフラグをより簡単に利用できるようにするために、最新の11.1リリースでは、特定のリンカ―オプションをIDEで設定可能にするとともに、これらをデフォルトで有効にしました。これにより、Delphi / C++Builder双方のプロジェクトで、これらのオプション用いたアプリケーションを容易にビルドできるようになりました。
Table of Contents
Windows PEフラグの詳細
Data Execution Prevention (DEP)
データ実行防止。システムがメモリの1つ以上のページを実行不可能としてマークし、これらのメモリ領域からコードが実行されないようにして、バッファオーバーランの悪用を防止します。詳細については、Microsoftのドキュメントを参照してください。
Address Space Layout Randomization (ASLR)
アドレス空間配置のランダム化。実行可能ファイルのベース、スタック、ヒープ、ライブラリの位置など、プロセスの主要なデータ領域のアドレス空間の位置をランダムに配置します。メモリ破損の脆弱性悪用を防止します。詳細については、Wikipediaを参照してください。
High-entropy 64-bit ASLR(64bitアプリケーションのみ)
言葉のとおり、ASLRを64ビットアドレス空間全体で使用できるようにします。詳細については、Microsoftのドキュメントを参照してください。
Terminal Services
ターミナルサーバー対応(TSAWARE)アプリケーションを作成します。これはセキュリティとは関係がありません。詳細については、Microsoftのドキュメントを参照してください。
RAD StudioにおけるWindows PEセキュリティフラグサポートの改善
以前コンパイラフラグとしてのみ提供してきたこれらのフラグについて、11.1ではRAD Studio IDEのリンカーオプションとして設定可能にしました。DelphiおよびC++向けのWindowsコンパイラ設定を以下に示します。
いくつかの注意事項
ASLRコンパイラ構成は、ランタイムパッケージを使用するDelphiアプリケーションでは期待どおりに機能します。一方、実行可能ファイル内でライブラリにリンクするプログラムの場合、遅延ロードされるDLL関数を参照する方法と競合するため、予期された動作が妨げられます。これは、11.1リリース後に発見された問題であり、近い将来に修正版を提供する予定です。
以下のように、ランタイムパッケージを含むアプリケーションの場合には、SysInternals Process Explorerで見ることができるように適切な構成となっています。
一般的に、これらのフラグはセキュリティを強化し、低レベルのコードを使用するアプリケーションが機能しなくなる可能性がある点に注意してください。例えば、DEPフラグとの競合に起因して、一部の古いActiveXコントロールがIDEで機能しなくなっていることが報告されています。
アプリケーションに問題が発生したときは、これらのフラグを無効にすることができます。しかし、一部の企業では、使用するすべてのソフトウェアがMicrosoftが推奨するセキュリティフラグをすべて有効にしてアプリケーションを構築することを必要要件とするようになってきているため、問題の解決に一時的なフラグ無効化を選択するのではなく、セキュリティリスクのある低レベルコードに関する根本的な調査を実施することを推奨します。