2009年6月3日

DelphiのASLR/DEP(NX)サポート

ASLR(Address Space Layout Randomization)とは、実行ファイルからリンクされるDLLをユーザメモリ空間上に配置するときにその位置をランダムにすることにより特定のアドレスに既知のDLLがロードされていることを前提とした攻撃を防ぐもので、Windows Vistaで導入されました。
一方DEP/NX(Data Execution Prevention/Non-eXecutable)とはNXであるとマークしたメモリ空間上の領域でコードを実行することを禁止することによりバッファオーバランなどを利用した攻撃を防ぐもので、Windows XP SP2で導入されました。

Delphiでは2007以降でASLRおよびDEP/NXをサポートするようになりました。またDelphiのデバッガも2007以降でDEP/NXに対応した(DEP/NXが有効なWindows上でもエラーにならないようにした)とのことです。

ASLRを有効にするにはソースコード上で

{$DYNAMICBASE ON}
または

{$SETPEOPTFLAGS $40}
とします(コマンドライン版では"–dynamicbase"スイッチを使用します)。

DEP/NXを有効にするにはソースコード上で

{$SETPEOPTFLAGS $100}
とします。

ASLRとDEP/NXを同時に有効したい場合はソースコード上で

{$SETPEOPTFLAGS $140}
とすれば1回の指定で済みます。

コンパイラ指令$SETPEFLAGS/$SETPEOPTFLAGSはDelphiのヘルプのPE ヘッダーフラグ(Delphi)(英語ヘルプ)にあるように、PEファイルヘッダのCharacteristicsフィールドとPEファイルオプションヘッダのDLLCharacteristicsフィールド上のフラグをセットする(指定は累積されます)ためのもので、これらのコンパイラ指令はプロジェクトソース(*.dpr/*.dpk)に記述するのが望ましいとのことです。PEファイルヘッダのCharacteristicsフィールドとPEファイルオプションヘッダのDLLCharacteristicsフィールドの詳細はIMAGE_FILE_HEADER Structure (Windows)(PEファイルヘッダ)およびIMAGE_OPTIONAL_HEADER Structure (Windows)(PEファイルオプションヘッダ)を参照してください。

元ねたはMichael Howard's Web Log : CodeGear’s new Delphi 2007 supports ASLR and NXMike Devery » Delphi 2007 supports ASLR and NXChris’ CodeGear Debugger Blog » The Delphi 2007 Debugger and DEP/NX (Internet Archive)あたり。

2011/05/05追記: Chris Hesikさんの"Chris’ CodeGear Debugger Blog"のInternet Archiveのリンクを追加。

0 件のコメント: