■Windows Server 2003 Service Pack1には,Windows XP SP2と同様に,データ実行防止機能が実装される。これは,メモリーのデータ領域でのプログラム実行を阻止することで,コンピュータ・ウイルスなどによる攻撃を防ぐ機能である。
■データ実行防止機能には,大きく分けてハードウエアによるものと,ソフトウエアによるものの2つがある。ハードによるデータ実行防止機能は,Athlon 64など特定のCPUを搭載したコンピュータだけで有効である。
Windows Server 2003 Service Pack 1(SP1)には,Windows XP SP2と同様に,データ実行防止(Data Execution Prevention=DEP)機能が実装される。これは,バッファ・オーバーフロー(またはバッファ・オーバーラン)攻撃による不正プログラムの実行を阻止する仕組みである。 BlasterやSasserなどのように,世間を騒がしたコンピュータ・ウイルス(ワーム)の中には,ネットワークに接続しただけで感染してしまうものがある。そのようなウイルスは,バッファ・オーバーフローと呼ぶプログラムの欠陥を突いて攻撃するが,DEPはこのような攻撃を防止する。 DEPには,AMD64対応CPUの拡張ウイルス防止機能やIntel製CPUのExecute Disable Bit機能などを利用したハードウエアによるものと,ソフトウエアによるものがある。本連載の最終回は,データ実行防止機能について説明する。
標準ですべてのプログラムが対象になる Windows Server 2003 SP1のDEPは,標準ですべてのプログラムが対象になる。Windows XP SP2では,重要なWindowsのプログラムおよびサービスについてのみ有効だったのに比べると,その影響範囲は広い。
(1)を選ぶと,DEPの有効範囲がWindowsのシステム・プログラムに限定される。ユーザー・プログラムにDEPは効かない。DEPの適用範囲となる「Windowsのシステム・プログラム」は,sysmain.sdbファイル内に列挙されている。主にWindowsディレクトリ内の実行ファイルが対象になっているが,すべてではない。例えばInternet Explorerは対象外である。
例外リストはレジストリ内に保存されており,そのキーはHKEY_LOCAL_MACHINE\
DEPのオプションは全部で4つ
指定可能なオプションは,
(1)は[データ実行防止]画面の[重要なWindowsのプログラムおよびサービスについてのみ有効にする]オプションに相当する。(2)は同様に,[次に選択するものを除くすべてのプログラムおよびサービスについてDEPを有効にする]オプションに相当する(デフォルト)。 (3)はDEPを完全に無効にする。(4)はDEPを例外なく有効にする。これら2つのオプションは[データ実行防止]画面では設定できず,直接boot.iniファイルを編集したときだけ有効である。
不正なプログラムの実行を阻止するテータ実行防止機能 このうちハードウエアDEPは,あらかじめメモリーに対してプログラム領域またはデータ領域といった目印を付けておき,データ領域でプログラムが実行されようとしたときに例外(実行時エラー)を発生する機能である。この機能はNX(NoExecute)とも呼ばれ,OpteronやAthlon 64などAMD64アーキテクチャのCPUが備える「拡張ウイルス防止機能(Enhanced Virus Protection=EVP)」や,モデル・ナンバーの末尾に「J」が付いたPentium 4などが備えるExecute Disable Bit(EDB)機能などを利用した処理である。ちなみにEVPとEDBは,CPUメーカーの名称が異なるだけで同じ機能である。トランスメタやVIA Technologiesも同様の機能を自社製のx86互換プロセッサに実装することを発表している。だが,Pentium IIIやCeleronなど,NX機能を備えていない既存のCPUを使ったコンピュータでは利用できない。 それに対してソフトウエアDEPはすべてのCPUで有効だが,不正なプログラムからシステムを保護するアプローチがハードウエアDEPとは異なる。ソフトウエアDEPは,プログラムが備えている例外ハンドラが安全であることを確認する。この処理は,すべてのバッファ・オーバーフロー攻撃を防げるわけではないが,一部のコンピュータ・ウイルスが自分自身のカモフラージュのために使っている攻撃方法に対しても効果がある。 では,ハードウエアDEPとソフトウエアDEPについて,それぞれ詳しく説明しよう。
スタック上のデータを書き換えるバッファ・オーバーフロー攻撃 Pentium 4やAthlonなどx86アーキテクチャのプロセッサでは,1つの連続したメモリー領域(主記憶)をプログラム・コードの格納領域とデータの格納領域に分けて利用する。データ格納領域は用途によって,さらにヒープと呼ぶOSの管理下にあるメモリー領域と,スタックと呼ぶデータの一時格納領域に分かれる。ヒープ領域とスタック領域は,データ格納用という点では同じだが,使用方法や用途など,いくつか異なる点がある。 ヒープ領域を使うには,OSのAPI(アプリケーション・プログラミング・インターフェース)を使って必要な容量を確保する必要がある。そしてヒープ領域のデータには,そのデータが格納されるアドレスを指定してアクセスする。
スタックにデータを格納するとESPレジスタの値がデータの大きさだけ小さくなり,スタックからデータを読み出すとESPレジスタの値がデータの大きさだけ大きくなる。つまり,データをスタック領域に格納する場合はアドレスの上位から下位に向かって書き込まれ,読み出す場合はアドレスの下位から上位に向かって読み出されるわけだ。例えばA,B,Cという3つのデータをスタックに格納すると,アドレスの下位から上位に向かってC,B,Aという順にデータが並ぶことになる。この状態のときにスタックからデータを読み出すと,C,B,Aという順に取り出せる。
|