(57)【要約】【課題】動的リンカが標準コピー関数の呼び出しをフックする機能を備えていない環境においても、スタックスマッシング攻撃を検出できるようにすることを目的とする。【解決手段】攻撃対象プロセスが呼び出すコピー関数のエントリポイントを取得して、そのエントリポイントをフック関数へジャンプする命令に書き換える際に上書きされることになる命令をコピーすることで、フック関数により呼び出されるときに、それらの命令を実行してからコピー関数に制御を渡す処理を実行する処理部を生成し、それに続けて、そのエントリポイントをフック関数へジャンプする命令に書き換える。そして、そのジャンプ命令により呼び出されるフック関数によって、攻撃対象プロセスがコピー関数を呼び出す際に指定するコピー元及びコピー先のバッファのサイズを取得し比較することで、コピー元バッファに攻撃用データが書き込まれているのか否かを判断する。【選択図】図３
2005234740.tif 000002
【特許請求の範囲】
【請求項１】
コピー元バッファに攻撃用データを書き込むことによりコピー先バッファをオーバーフローさせることで行われるスタックスマッシング攻撃に対しての防御方法であって、
攻撃対象プロセスが呼び出すコピー関数のエントリポイントを取得して、そのエントリポイントをフック関数へジャンプする命令に書き換える際に上書きされることになる命令をコピーすることで、該フック関数により呼び出されるときに、該命令を実行してから該コピー関数に制御を渡す処理を実行する処理部を生成する第１の過程と、
上記エントリポイントをフック関数へジャンプする命令に書き換える第２の過程と、
上記ジャンプする命令により呼び出されるフック関数によって、攻撃対象プロセスが上記コピー関数を呼び出す際に指定するコピー元及びコピー先のバッファのサイズを取得して、それらを比較することで攻撃用データが書き込まれているのか否かを判断し、攻撃用データが書き込まれている場合には、処理を強制終了し、攻撃用データが書き込まれていない場合には、上記処理部を呼び出す第３の過程とを備えることを、
特徴とするスタックスマッシング攻撃防御方法。
【請求項２】
請求項１に記載のスタックスマッシング攻撃防御方法において、
上記第２の過程では、上記エントリポイントを実行中のスレッドが存在しない状態を作り出してから、上記エントリポイントをフック関数へジャンプする命令に書き換えることを、
特徴とするスタックスマッシング攻撃防御方法。
【請求項３】
請求項１又は２に記載のスタックスマッシング攻撃防御方法において、
上記第３の過程では、スタックを探索することでコピー先バッファのサイズを取得するときにあって、スタックボトムまで探索してもコピー先バッファのサイズを取得できない場合には、ヒープ領域を管理するヒープ管理ブロックを探索することでコピー先バッファのサイズを取得することを、
特徴とするスタックスマッシング攻撃防御方法。
【請求項４】
請求項３に記載のスタックスマッシング攻撃防御方法において、
上記第３の過程では、スレッド環境ブロックを参照することでスタックボトムを取得することを、
特徴とするスタックスマッシング攻撃防御方法。
【請求項５】
請求項１ないし４のいずれか１項に記載のスタックスマッシング攻撃防御方法において、
上記強制終了に続けて、攻撃対象プロセスを再起動する過程を備えることを、
特徴とするスタックスマッシング攻撃防御方法。
【請求項６】
コピー元バッファに攻撃用データを書き込むことによりコピー先バッファをオーバーフローさせることで行われるスタックスマッシング攻撃に対しての防御装置であって、
攻撃対象プロセスが呼び出すコピー関数のエントリポイントを取得して、そのエントリポイントをフック関数へジャンプする命令に書き換える際に上書きされることになる命令をコピーすることで、該フック関数により呼び出されるときに、該命令を実行してから該コピー関数に制御を渡す処理を実行する処理部を生成する生成手段と、
上記エントリポイントをフック関数へジャンプする命令に書き換える書換手段と、
上記ジャンプする命令により呼び出されるフック関数によって、攻撃対象プロセスが上記コピー関数を呼び出す際に指定するコピー元及びコピー先のバッファのサイズを取得して、それらを比較することで攻撃用データが書き込まれているのか否かを判断し、攻撃用データが書き込まれている場合には、処理を強制終了し、攻撃用データが書き込まれていない場合には、上記処理部を呼び出す実行手段とを備えることを、
特徴とするスタックスマッシング攻撃防御装置。
【請求項７】
請求項６に記載のスタックスマッシング攻撃防御装置において、
上記書換手段は、上記エントリポイントを実行中のスレッドが存在しない状態を作り出してから、上記エントリポイントをフック関数へジャンプする命令に書き換えることを、
特徴とするスタックスマッシング攻撃防御装置。
【請求項８】
請求項６又は７に記載のスタックスマッシング攻撃防御装置において、
上記実行手段は、スタックを探索することでコピー先バッファのサイズを取得するときにあって、スタックボトムまで探索してもコピー先バッファのサイズを取得できない場合には、ヒープ領域を管理するヒープ管理ブロックを探索することでコピー先バッファのサイズを取得することを、
特徴とするスタックスマッシング攻撃防御装置。
【請求項９】
請求項８に記載のスタックスマッシング攻撃防御装置において、
上記実行手段は、スレッド環境ブロックを参照することでスタックボトムを取得することを、
特徴とするスタックスマッシング攻撃防御装置。
【請求項１０】
請求項６ないし９のいずれか１項に記載のスタックスマッシング攻撃防御装置において、
上記強制終了に続けて、攻撃対象プロセスを再起動する再起動手段を備えることを、
特徴とするスタックスマッシング攻撃防御装置。
【請求項１１】
請求項１ないし５のいずれか１項に記載のスタックスマッシング攻撃防御方法の実現に用いられる処理をコンピュータに実行させるためのスタックスマッシング攻撃防御プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コピー元バッファに攻撃用データを書き込むことによりコピー先バッファをオーバーフローさせることで行われるスタックスマッシング攻撃を防御するためのスタックスマッシング攻撃防御方法及びその装置と、そのスタックスマッシング攻撃防御方法の実現に用いられるスタックスマッシング攻撃防御プログラムとに関する。
【背景技術】
【０００２】
スタックメモリ上には、サブルーチン呼び出しの際に呼び出し元へ戻るためのリターンアドレスや、フレームポインタや、サブルーチン内でのみ利用される局所変数等が格納され、さらに、オペレーティングシステムによっては例外ハンドラ（例外発生時に実行されるサブルーチン）のアドレス等が格納される。
【０００３】
これから、サブルーチン内でのみ利用される局所変数として宣言されたバッファに対して、バッファの境界を越えて書き込みが発生すると、リターンアドレス等が書き換わることになる。
【０００４】
スタックスマッシング攻撃は、この書き換えによりプロセスの処理フローを変更して、任意の命令を実行させるという攻撃である。
【０００５】
スタックスマッシング攻撃は、具体的には、コピー元のバッファに攻撃用データを書き込むことで実行され、攻撃用データが書き込まれると、攻撃対象のプロセスが標準コピー関数（呼び出し元のプロセスにより指定されるコピー元のバッファからコピー先のバッファへのコピー処理を実行する関数）を呼び出してコピーを行うと、コピー先のバッファがオーバーフローしてリターンアドレス等が書き換わり、これにより攻撃が行われることになる。
【０００６】
このスタックスマッシング攻撃に対する防御を実現する従来技術として、動的リンカを使って、標準的なメモリコピー関数の呼び出しをプロセス実行時にフックすることで、コピー先のバッファのサイズをあらかじめチェックして、バッファオーバーフローを検出するという手法がある（例えば、非特許文献１参照）。
【０００７】
これにより、スタックスマッシング攻撃によるサーバの乗っ取りやデータの改竄といった不正侵入からホストを防御できるようになる。
【０００８】
なお、『関数をフックする』とは、ある関数が呼び出されるときに制御を横取りすることをいう。デバッグ目的で、ある関数が正確に呼び出されているのかを調べるために、一旦制御を横取りしてログ出力する、といった利用方法がある。
【非特許文献１】White Paper 「Libsafe: Protecting critical elements of stacks.」"http://www.research.avayalabs.com/project/libsafe/" A.Baratloo, N.Singh, and T.Tsai, December 1999.
【発明の開示】
【発明が解決しようとする課題】
【０００９】
しかしながら、動的リンカを使って、標準的なメモリコピー関数のコピー先のバッファサイズをあらかじめチェックして、バッファオーバーフローを検出するという従来技術は、次のような欠点を有している。
【００１０】
（１）１点目は、動的リンカが標準コピー関数の呼び出しをフックする機能を備えていなければ実現できない、という欠点である。
【００１１】
（２）２点目は、スタックスマッシング攻撃を検知した後に、攻撃対象のプロセスを強制終了することから、攻撃対象がサービスを提供するプロセスであった場合に、人手によりプロセスを再起動するまでサービス停止状態が続いてしまう、という欠点である。
【００１２】
（３）３点目は、スタック上のバッファのサイズしか取得できないことから、スタック以外の領域で発生するバッファオーバーフローに関しては検出できない、という欠点である。
【００１３】
本発明はかかる事情に鑑みてなされたものであって、その目的は、動的リンカが標準コピー関数の呼び出しをフックする機能を備えていない環境においても、スタックスマッシング攻撃を検出できるようにすることである。
【００１４】
本発明の他の目的は、スタックスマッシング攻撃を検出した後に発生するサービス停止問題を緩和できるようにすることである。
【００１５】
さらに本発明の他の目的は、コピー先バッファがスタック上に存在しない場合にも、バッファオーバーフローの検出を行うことができるようにすることで、スタックスマッシング攻撃を検出できるようにすることである。
【課題を解決するための手段】
【００１６】
この目的を達成するために、本発明のスタックスマッシング攻撃防御装置は、コピー元バッファに攻撃用データを書き込むことによりコピー先バッファをオーバーフローさせることで行われるスタックスマッシング攻撃に対して防御するために、（１）攻撃対象プロセスが呼び出すコピー関数のエントリポイントを取得して、そのエントリポイントをフック関数へジャンプする命令に書き換える際に上書きされることになる命令をコピーすることで、フック関数により呼び出されるときに、それらの命令を実行してからコピー関数に制御を渡す処理を実行する処理部を生成する生成手段と、（２）そのエントリポイントをフック関数へジャンプする命令に書き換える書換手段と、（３）そのジャンプする命令により呼び出されるフック関数によって、攻撃対象プロセスがコピー関数を呼び出す際に指定するコピー元及びコピー先のバッファのサイズを取得して、それらを比較することで攻撃用データが書き込まれているのか否かを判断し、攻撃用データが書き込まれている場合には、処理を強制終了し、攻撃用データが書き込まれていない場合には、生成手段により生成された処理部を呼び出す実行手段と、（４）攻撃対象プロセスの強制終了に続けて、攻撃対象プロセスを再起動する再起動手段とを備えるように構成する。
【００１７】
この構成を採るときに、書換手段は、エントリポイントを実行中のスレッドが存在しない状態を作り出してから、エントリポイントをフック関数へジャンプする命令に書き換えるように処理する。
【００１８】
また、実行手段は、スタックを探索することでコピー先バッファのサイズを取得するときにあって、スタックボトム（固定でない実行環境のときには、スレッド環境ブロックを参照することで取得される）まで探索してもコピー先バッファのサイズを取得できない場合には、ヒープ領域（プロセスの実行時に動的にバッファを割り当てる場合に使われる領域）を管理するヒープ管理ブロックを探索することで、コピー先バッファのサイズを取得するように処理する。
【００１９】
ここで、以上の各処理手段が動作することで実現される本発明のスタックスマッシング攻撃防御方法はコンピュータプログラムで実現できるものであり、このコンピュータプログラムは、半導体メモリなどのような適当な記録媒体に記録して提供されたり、ネットワークを介して提供され、本発明を実施する際にインストールされてＣＰＵなどの制御手段上で動作することにより本発明を実現することになる。
【００２０】
このように構成される本発明のスタックスマッシング攻撃防御装置では、攻撃対象プロセスが呼び出すコピー関数のエントリポイントを取得して、そのエントリポイントをフック関数へジャンプする命令に書き換える際に上書きされることになる命令をコピーすることで、フック関数により呼び出されるときに、それらの命令を実行してからコピー関数に制御を渡す処理を実行する処理部を生成し、それに続けて、そのエントリポイントをフック関数へジャンプする命令に書き換える。
【００２１】
ここで、このジャンプ命令への書き換えにあたって、エントリポイントを実行中のスレッドが存在しない状態を作り出してから、その書き換えを行うことになる。
【００２２】
この後、攻撃対象プロセスが動作に入って、コピー元及びコピー先のバッファを指定してコピー関数を呼び出すと、フック関数へのジャンプ命令に従ってフック関数に制御が渡り、その指定されるコピー元及びコピー先のバッファのサイズを取得する。
【００２３】
ここで、コピー元バッファのサイズについてはコピー関数の仕様に基づいて取得し、コピー先バッファのサイズについては、スタックを探索することで取得することになるが、スタックボトムまで探索してもコピー先バッファのサイズを取得できない場合には、攻撃対象プロセスにより指定されるコピー先バッファのアドレスを使ってヒープ領域を管理するヒープ管理ブロックを探索することでコピー先バッファのサイズを取得することになる。
【００２４】
このようにしてコピー元及びコピー先のバッファのサイズを取得すると、それらを比較することで攻撃用データが書き込まれているのか否かを判断して、攻撃用データが書き込まれている場合には、処理を強制終了し、それに続けて、攻撃対象プロセスを再起動する。一方、攻撃用データが書き込まれていない場合には、生成された処理部を呼び出すことで、処理を継続する。
【発明の効果】
【００２５】
本発明によれば、動的リンカが標準コピー関数の呼び出しをフックする機能を備えていない環境においても、プログラムコードを書き換えることでコピー関数の呼び出しをフックすることができるようになることで、スタックスマッシング攻撃を検出することが可能になる。
【００２６】
さらに、本発明によれば、スタックスマッシング攻撃を検知した直後に、攻撃対象のプロセスを再起動するようにしているので、自動的にサービス停止状態から回復することが可能になる。
【００２７】
さらに、本発明によれば、コピー先バッファがスタック上に存在しない場合に、ヒープ管理ブロックからコピー先バッファのサイズを取得し、コピー元バッファのサイズと比較することでバッファオーバーフローを検出するようにしているので、コピー先バッファがスタック上に存在しない場合にも、スタックスマッシング攻撃を検出することが可能になる。
【発明を実施するための最良の形態】
【００２８】
以下、本発明の実施の形態について図面を参照して詳細に説明する。
【００２９】
図１に、本発明により実現されるスタックスマッシング攻撃防御システムのシステム構成例を図示する。
【００３０】
この図に示すように、本発明により実現されるスタックスマッシング攻撃防御システムは、攻撃対象プロセス１に対して行われるスタックスマッシング攻撃を防御するために、スタックスマッシング攻撃の防御処理を行う標準コピー関数フック用ライブラリ１０と、攻撃対象プロセス１に標準コピー関数フック用ライブラリ１０をロードさせる処理を行うライブラリ注入プログラム２０と、攻撃対象プロセス１を再起動する処理を行うプロセス再起動プログラム３０とを備える。
【００３１】
スタックスマッシング攻撃とは、コピー元バッファに攻撃用データを書き込むことで実行され、攻撃対象プロセス１がコピー元及びコピー先のバッファを指定して標準コピー関数を呼び出すことで、コピー元バッファからコピー先バッファへコピーを行うと、コピー先バッファがオーバーフローさせられることでリターンアドレス等が書き換えられてしまうという攻撃である。
【００３２】
本発明により実現されるスタックスマッシング攻撃防御システムは、このようなスタックスマッシング攻撃に対する防御を実行するものである。
【００３３】
図２に、この防御処理を実現すべく用意される標準コピー関数フック用ライブラリ１０の一実施形態例を図示する。
【００３４】
この図に示すように、標準コピー関数フック用ライブラリ１０は、ライブラリがロードされた際にＯＳやローダから呼び出されるライブラリ初期化関数１００と、各標準コピー関数に対応するフック関数（スタックスマッシング攻撃が行われているのか否かを検出する機能を持つ）の集まりである標準コピー関数用フック関数群１０１と、標準コピー関数のエントリポイントのコピー先であるトランポリンコード領域１０２とを備える。
【００３５】
次に、図１を用いて、本発明によるスタックスマッシング攻撃防御についての大まかな処理の流れについて説明する。
【００３６】
まず、ライブラリ注入プログラム２０を起動することにより、標準コピー関数フック用ライブラリ１０を攻撃対象プロセス空間内に注入する。
【００３７】
注入された標準コピー関数フック用ライブラリ１０のライブラリ初期化関数１００は、攻撃対象プロセス１を書き換えることにより、攻撃対象プロセス１による標準コピー関数の呼び出しをフックする。このフックによりフック関数に制御が渡り、スタックスマッシング攻撃が発生している場合には、フック関数がそれを検知し、プロセス再起動プログラム３０を呼び出して強制終了する。
【００３８】
プロセス再起動プログラム３０は、攻撃対象プロセス１が強制終了するまで待機し、攻撃対象プロセス１が強制終了すると、攻撃対象プロセス１を再起動した後、ライブラリ注入プログラム２０を呼び出すことで、再度、標準コピー関数フック用ライブラリ１０を攻撃対象プロセス空間内に配置する。
【００３９】
次に、図３と図４とを用いて、標準コピー関数フック用ライブラリ１０内のライブラリ初期化関数１００が行う処理について説明する。
【００４０】
ここで、図３中に示す３０１は攻撃対象プロセス１に係るプログラム部分であって、標準コピー関数の一例である“strcpy関数”の呼び出し部分と、その“strcpy関数”の先頭部分とを示している。ここで、“strcpy関数”の呼び出しの際に指定される"dst" はコピー先バッファのアドレスを示し、“strcpy関数”の呼び出しの際に指定される"src" はコピー元バッファのアドレスを示している。
【００４１】
また、３０２は図２のトランポリンコード領域１０２に対応している。また、３０３はライブラリ初期化関数１００が実行された直後の“strcpy関数”の呼び出し部分と、その“strcpy関数”の先頭部分とを示している。また、３０４はライブラリ初期化関数１００が実行された直後のトランポリンコード領域３０２を示している。また、３０５は“strcpy関数”に対応するフック関数を示している。
【００４２】
標準コピー関数フック用ライブラリ１０内のライブラリ初期化関数１００は、先ず最初に、３０１にある“strcpy関数”の先頭部分を、３０２のトランポリンコード領域内にある空きスペースにコピーする。この結果、３０２は３０４に示す状態になる。
【００４３】
続いて、３０１にある“strcpy関数”の先頭部分を、この“strcpy関数”に対応するフック関数にジャンプする命令（jmp hook-strcpy)に書き換える。この結果、３０１は３０３に示す状態になる。
【００４４】
これにより、攻撃対象プロセス１から“strcpy関数”が呼び出されると、ジャンプ命令に従って、３０５に示すこの“strcpy関数”に対応するフック関数に制御が渡り、バッファサイズのチェックを行うことができるようになる。
【００４５】
このフック関数は、バッファサイズをチェックした結果、スタックスマッシング攻撃が発生していないことを判断するときには、“call trampoline-strcpy”という命令コードに従って、トランポリンコード領域３０４にコピーされた“strcpy関数”の先頭部分を実行し、その後、トランポリンコード領域３０４に記述される“jmp strcpy+N”という命令コードに従って、“strcpy関数”に制御を戻すことになる。
【００４６】
図４に、標準コピー関数フック用ライブラリ１０内のライブラリ初期化関数１００が実行する処理フローを図示する。
【００４７】
次に、この処理フローに従って、ライブラリ初期化関数１００の実行する処理について詳細に説明する。
【００４８】
ライブラリ初期化関数１００は、図４の処理フローに示すように、先ず最初に、Ｓ４０１で、ライブラリ初期化関数１００を処理するスレッド以外の全てのスレッドを一時停止する。
【００４９】
続いて、Ｓ４０２で、標準コピー関数のエントリポイントを取得し、続くＳ４０３で、その取得したエントリポイントをフック関数へジャンプする命令に書き換える際に上書きされることになる命令を、トランポリンコード領域１０２（図３の３０２）へコピーする。
【００５０】
続いて、Ｓ４０４で、標準コピー関数のエントリポイント（後述する処理で書き換えることになる）を実行中のスレッドが存在しないかどうかを判断して、存在する場合には、Ｓ４０５に進んで、標準コピー関数のエントリポイントを実行中のスレッドを再開し、処理を進めてエントリポイントが実行中とならないようにした後に再度停止してから、Ｓ４０４に戻る。
【００５１】
そして、Ｓ４０４に戻ることを繰り返していくことで、全スレッドが標準コピー関数のエントリポイントを実行していない状態を作り出すと、Ｓ４０６に進んで、ＣＰＵの命令キャッシュの内容を消去する。続いて、Ｓ４０７で、標準コピー関数のエントリポイントをフック関数へジャンプする命令に書き換える。
【００５２】
続いて、Ｓ４０８で、全ての標準コピー関数のエントリポイントを書き換えたかどうか判断して、まだ書き換えていない標準コピー関数のエントリポイントがある場合には、Ｓ４０２に戻る。
【００５３】
そして、Ｓ４０２に戻ることを繰り返していくことで、全ての標準コピー関数のエントリポイントを書き換えたことを判断すると、Ｓ４０９に進んで、全てのスレッドを再開して、処理を終了する。
【００５４】
このようにして、ライブラリ初期化関数１００は、攻撃対象プロセス１により呼び出される標準コピー関数のエントリポイントをフック関数へジャンプする命令に書き換えることにより、攻撃対象プロセス１による標準コピー関数の呼び出しをフックしてフック関数に制御が渡るように処理するのである。
【００５５】
次に、図５〜図７を用いて、標準コピー関数用フック関数群１０１を構成するフック関数が行う処理について説明する。
【００５６】
ここで、図５及び図６中に示す５０１は攻撃対象プロセス１のスタックメモリ（呼び出された関数についての情報を記録するフレームが関数を単位としてスタックされている）を示し、図６中に示す５０２はヒープメモリ（プロセスの実行時に動的にバッファを割り当てる場合に使われるメモリ領域）を示し、図６中に示す５０３はヒープメモリ５０２を管理するヒープ管理ブロックを示している。
【００５７】
フック関数は、攻撃対象プロセス１のスタックメモリ５０１を探索対象として、現在のフレームポインタが指す領域から呼び出し元関数のフレームポインタを順に辿ることで、コピー先バッファの先頭（攻撃対象プロセス１が標準コピー関数を呼び出すときに指定したコピー先バッファのアドレス）がどの関数フレームに属するのかを求めて、その属する関数フレームを求めると、図５に示すように、コピー先バッファの先頭からその求めた関数フレームの持つフレームポインタの直前までの距離をコピー先バッファのサイズとして求める。
【００５８】
このようにして、フック関数は、現在のフレームポインタが指す領域から呼び出し元関数のフレームポインタを順に辿ることになるが、図６に示すように、コピー先バッファの先頭がヒープメモリ５０２上を指している場合は、スタックメモリ５０１にはコピー先バッファが存在しないので、最終的にスタックボトムに到達することになる。
【００５９】
これから、フック関数は、フレームポインタを順に辿ることでスタックボトムに到達すると、コピー先バッファが動的に割り当てられたことでヒープメモリ５０２に存在する可能性があることを考慮して、図６に示すように、ヒープ管理ブロック５０３でコピー先バッファが管理されているかどうかを探し出し（コピー先バッファの先頭アドレスが管理されているのかをチェックすることで探し出し）、管理されている場合には、その管理されているバッファサイズをコピー先バッファのサイズとして求める。
【００６０】
ここで、スタックメモリ５０１のスタックボトムのアドレスについては実行環境によって固定であることがあり、その場合には、その固定値をスタックボトムとして取得することになるが、スタックボトムが固定ではない実行環境では、スレッド環境ブロック（ＴＥＢ：Thread Environment Block）によって管理されているため、これを参照することで取得することになる。
【００６１】
図７に、標準コピー関数用フック関数群１０１を構成するフック関数が実行する処理フローを図示する。
【００６２】
次に、この処理フローに従って、フック関数の実行する処理について詳細に説明する。
【００６３】
フック関数は、図７の処理フローに示すように、先ず最初に、Ｓ７０１で、各標準コピー関数の仕様からコピー元バッファのサイズを求める。続いて、Ｓ７０２で、スタックトップとスタックボトムのアドレスを取得し、続くＳ７０３で、フレームポインタ（起点は自関数が呼び出された時点でのフレームポインタ）が指す領域がスタック内であるのかどうかを判断する。
【００６４】
このＳ７０３の判断処理に従って、フレームポインタが指す領域がスタック内であることを判断する場合には、Ｓ７０４に進んで、呼び出し元関数のフレームを取得し、続くＳ７０５で、呼び出し元関数のフレームにコピー先バッファが属するのかどうかを判断する。
【００６５】
このＳ７０５の判断処理に従って、呼び出し元関数のフレームにコピー先バッファが属さないことを判断する場合には、Ｓ７０６に進んで、フレームポインタを格納する変数を呼び出し元関数のフレームポインタに更新し、Ｓ７０３に戻る。
【００６６】
一方、Ｓ７０５の判断処理に従って、呼び出し元関数のフレームにコピー先バッファが属することを判断する場合には、Ｓ７０７に進んで、図５に示すように、コピー先バッファの先頭からその呼び出し元関数のフレームポインタの直前までの距離をコピー先バッファのサイズとして求める。
【００６７】
一方、Ｓ７０３の判断処理に従って、フレームポインタが指す領域がスタック内でないことを判断する場合には、Ｓ７０８に進んで、コピー先バッファがヒープ管理ブロック５０３で管理されているかを調べる。
【００６８】
このＳ７０８の判断処理に従って、コピー先バッファがヒープ管理ブロック５０３で管理されていないことを判断する場合には、バッファサイズのチェックは行わずに、Ｓ７１２に進んで、トランポリンコード領域１０２（図３の３０２）にコピーされた標準コピー関数の先頭部分を呼び出すことにより、標準コピー関数に制御を渡すことで処理を継続する。
【００６９】
一方、Ｓ７０８の判断処理に従って、コピー先バッファがヒープ管理ブロック５０３で管理されていることを判断する場合には、Ｓ７０９に進んで、その管理されているバッファサイズに従ってコピー先バッファのサイズを取得する。
【００７０】
続いて、Ｓ７１０で、取得したコピー元バッファのサイズと取得したコピー先バッファのサイズとを比較して、コピー先バッファのサイズの方がコピー元バッファのサイズよりも小さいことを判断する場合には、スタックスマッシング攻撃が行われたことを検出して、Ｓ７１１に進んで、プロセス再起動プログラム３０を呼び出してから攻撃対象プロセス１を強制終了する。
【００７１】
一方、Ｓ７１０の判断処理に従って、コピー先バッファのサイズの方がコピー元バッファのサイズよりも大きいことを判断する場合には、スタックスマッシング攻撃が行われなかったことを検出して、Ｓ７１２に進んで、トランポリンコード領域１０２（図３の３０２）にコピーされた標準コピー関数の先頭部分を呼び出すことにより、標準コピー関数に制御を渡すことで攻撃対象プロセス１の処理を継続する。
【００７２】
このようにして、フック関数は、攻撃対象プロセス１が標準コピー関数を呼び出すときに動作に入って、コピー元バッファのサイズとコピー先バッファのサイズとを取得して比較し、それに従って、攻撃対象プロセス１に対してスタックスマッシング攻撃が行われたのか否かを検出して、スタックスマッシング攻撃が行われたことを検出する場合には、プロセス再起動プログラム３０を呼び出してから攻撃対象プロセス１を強制終了し、一方、スタックスマッシング攻撃が行われなかったことを検出する場合には、標準コピー関数に制御を渡すことで攻撃対象プロセス１の処理を継続するように処理するのである。
【００７３】
図８に、プロセス再起動プログラム３０が実行する処理フローを図示する。
【００７４】
次に、この処理フローに従って、プロセス再起動プログラム３０の実行する処理について詳細に説明する。
【００７５】
プロセス再起動プログラム３０は、フック関数から呼び出されると、図８の処理フローに示すように、先ず最初に、Ｓ８０１で、攻撃対象プロセス１が終了するまで待機し、攻撃対象プロセス１が終了すると、続くＳ８０２で、攻撃対象プロセス１を再起動する。
【００７６】
続いて、Ｓ８０３で、ライブラリ注入プログラム２０を呼び出すことで、標準コピー関数フック用ライブラリ１０を攻撃対象プロセス１に注入して、終了する。
【００７７】
このようにして、プロセス再起動プログラム３０は、フック関数から呼び出されると、フック関数の処理に従って攻撃対象プロセス１が強制終了した後、攻撃対象プロセス１を再起動することで、スタックスマッシング攻撃を受けた攻撃対象プロセス１を再起動するように処理するのである。
【００７８】
以上に説明したように、本発明によれば、動的リンカが標準コピー関数の呼び出しをフックする機能を備えていない環境においても、プログラムコードを書き換えることでコピー関数の呼び出しをフックすることができるようになることで、スタックスマッシング攻撃を検出することができるようになる。
【図面の簡単な説明】
【００７９】
【図１】本発明により実現されるスタックスマッシング攻撃防御システムのシステム構成例である。
【図２】標準コピー関数フック用ライブラリの一実施形態例である。
【図３】ライブラリ初期化関数の行う処理の説明図である。
【図４】ライブラリ初期化関数の実行する処理フローである。
【図５】フック関数の行う処理の説明図である。
【図６】フック関数の行う処理の説明図である。
【図７】フック関数の実行する処理フローである。
【図８】プロセス再起動プログラムの実行する処理フローである。
【符号の説明】
【００８０】
１      攻撃対象プロセス
１０    標準コピー関数フック用ライブラリ
２０    ライブラリ注入プログラム
３０    プロセス再起動プログラム
１００  ライブラリ初期化関数
１０１  標準コピー関数用フック関数群
１０２  トランポリンコード領域
【図１】
2005234740.tif 000003
【図２】
2005234740.tif 000004
【図３】
2005234740.tif 000005
【図４】
2005234740.tif 000006
【図５】
2005234740.tif 000007
【図６】
2005234740.tif 000008
【図７】
2005234740.tif 000009
【図８】
2005234740.tif 000010