(注:記事は執筆時の情報に基づいており,現在では異なる場合があります)

 x86プロセッサに,セキュリティ強化に向けた,NXなどと呼ばれる新しい機能が搭載されつつある。この機能を活用して,バッファ・オーバーフローを悪用した攻撃の一部を防御する方策を紹介する。

*        *        *        *

 x86プロセッサに,セキュリティ強化に向けた新しい機能が搭載されつつある。不正侵入やウイルスの被害が深刻化する中,セキュリティに対するユーザーの関心はかつてないまでに高まっている。これを受け,セキュリティ機能の搭載の有無がセールスを左右すると見て,米Intel社や米Advanced Micro Devices社(AMD)らが手を打ち始めたためである。

 先行したのは,AMD社だ。同社の製品であるOpteron(出荷開始は2003年4月)やAthlon64(同年9月),Sempron(2004年7月)の各プロセッサは,特定のメモリー・ページにプログラム実行を禁止する非実行属性を設定できる。この機能は,使用するフラグの名前を取って「NX」(No Execution)と呼ばれる。

 既に,OS側のNX対応も進んでいる。例えば,64ビット拡張対応のx86プロセッサ向けLinuxカーネルには,NXを活用して,バッファ・オーバーフローを悪用した攻撃の一部を防御できる機能が搭載されている。また,NXを活用したセキュリティ機構を装備する「Windows XP SP2」の提供が国内でも2004年9月2日に始まった。

 米Intel社が販売するプロセッサも,2004年9月22日発表の「Celeron D 340」を皮切りに,32ビット/64ビットにかかわらずNX(相当)機能を順次搭載する。当面は,LGA775パッケージ対応のプロセッサ(Pentium4やCeleron D)が先行してNX機能に対応する。対応プロセッサには,プロセッサ・ナンバーの末尾に「J」を付けて識別できるようにするという。Xeonプロセッサや,PentiumM/CeleronMプロセッサについても順次対応する予定である。なおIntel社は,NX機能のことをXD(eXecute Disable)と呼ぶ。同社の資料を参照する場合は,注意が必要である。

 このほか,米Transmeta社が2004年9月に発表したモバイル機器向けプロセッサ「Efficeon TM8800」がNX機能をサポートしている。台湾VIA Technologies社のx86互換プロセッサも今後の対応を表明している。

 なお,NX機能は64ビット・プロセッサならではのものではない。しかし,対応を始めたのがAMD64アーキテクチャのプロセッサであり,Linuxでは64ビット対応と関連付けて実装された経緯がある。そのため,その活用方法について,ここで紹介する。

スタックを悪用して侵入

図1●バッファ・オーバーフローで不正プログラムを実行
スタックに格納される変数をあふれさせることで,同じくスタックに格納される関数の戻りアドレスを書き換えられる。こうすると関数の終了時に任意のプログラムを実行できる。

 NX機能を活用すると,バッファ・オーバーフローを悪用した攻撃の一部を防御できる。バッファ・オーバーフローとは,プログラムが用意する一時記憶領域(バッファ)のサイズを超えた入力で発生する「バッファあふれ」のことである。

 バッファ・オーバーフローを悪用する手口の代表が,不正プログラムを含んだ多量のコードを送り込んで関数の「戻りアドレス」を書き換える手法だ。戻りアドレスをうまく設定すると,送り込んだ不正プログラムを関数の終了時に稼働できる。もしもサーバーの入力部分でバッファ・オーバーフローが生じれば,リモートからシェルを起動されて簡単に不正侵入を許す。

 このような攻撃シナリオが成立するのは,C/C++プログラムでの「スタック」と呼ばれる先入れ後出し型の記憶領域の利用特性による。 C/C++では,関数中で使用するローカル変数や,関数の実行終了時にどの部分から(呼び出し元の)プログラムを再開するかを示した戻りアドレスをスタックに記録する。変数(バッファ)と戻りアドレスを共にスタックに格納するため,変数の最大サイズを超えてデータが書き込まれると戻りアドレスまで書き換えられる危険がある(図1[拡大表示])。

 この攻撃シナリオを妨害する方法の一つが,スタックやヒープ領域*1などのデータ記憶領域でのプログラム実行の禁止である。こうすれば,いくら戻りアドレスを書き換えても,バッファに送り込んだ不正なコードを実行できなくなる。現在では,ほとんどのプロセッサが,特定のメモリー・ページにプログラムの実行を禁止する属性を設定できる。