(57)【要約】【課題】本発明は、バッファオーバーフローに対して、根本的な対処であるプログラムソースの修正や修正パッチの適用を迅速に行えるようにする技術の提供を目的とする。【解決手段】バッファオーバーフロー攻撃の発生を検知すると、プログラム開発者に提供する分析情報として、攻撃の対象となったバッファの存在する場所の情報と、そのバッファを確保した関数の情報とを抽出するとともに、そのバッファ確保からバッファオーバーフロー攻撃までの関数の呼び出し履歴の情報を抽出できる場合には、その情報を抽出する。この分析情報を受けて、プログラム開発者がプログラムを修正し対処情報を作成するので、既知分析情報記憶手段に分析情報に対応付ける形で対処情報を記憶しておき、抽出した分析情報が既知分析情報記憶手段が登録されている場合には、その分析情報に対応付けられる対処情報に基づいてバッファオーバーフロー攻撃に対する対処処理を実行する。【選択図】図１
2006053760.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.
【特許文献１】特開２００１−２１６１６１
【発明の開示】
【発明が解決しようとする課題】
【００１０】
しかしながら、このような従来技術に従っていたのでは、バッファオーバーフローが発生したことを検知することは可能であるものの、その原因の特定が困難であるという問題がある。
【００１１】
したがって、従来技術に従っていると、根本的な対処であるプログラムソースの修正や修正パッチの適用を迅速に行えないという問題がある。
【００１２】
本発明はかかる事情に鑑みてなされたものであって、発生したバッファオーバーフローの原因を明確にすることで、根本的な対処であるプログラムソースの修正や修正パッチの適用を迅速に行えるようにする新たな技術の提供を目的とする。
【課題を解決するための手段】
【００１３】
本発明により実現されるバッファオーバーフロー脆弱性分析システムは、複数のデータ処理装置と分析情報提供装置とがネットワークを介して接続されることで構成されて、バッファオーバーフロー攻撃の対象となったプログラムの修正を行う上で必要となる分析情報を、そのプログラムの開発者に提供するための処理を行う。
【００１４】
〔１〕本発明のデータ処理装置
本発明のデータ処理装置は、上記の分析情報提供処理を実現するために、（イ）バッファオーバーフロー攻撃の発生を検知する検知手段と、（ロ）プログラム開発者に提供する分析情報として、攻撃の対象となったバッファの存在する場所の情報と、そのバッファを確保した関数の情報とを抽出するとともに、そのバッファ確保からバッファオーバーフロー攻撃までの関数の呼び出し履歴の情報を抽出できる場合には、その情報を抽出する抽出手段とを備える。
【００１５】
この構成を採るときにあって、抽出手段は、オーバーフロー発生時のフレームポインタから攻撃対象となったバッファの先頭をまたぐまでスタックトレースを行い、最終的にたどり着くフレームポインタの直前のフレームポインタに近接するリターンアドレスを抽出することで、バッファを確保した関数の情報を抽出することがある。
【００１６】
また、抽出手段は、オーバーフロー発生時のフレームポインタから攻撃対象となったバッファを確保した関数までスタックトレースを行うことで、バッファ確保からバッファオーバーフロー攻撃までの関数の呼び出し履歴の情報を抽出することがある。
【００１７】
また、ヒープメモリ確保関数が呼び出されたときにスタックトップまでスタックトレースを行うことで関数の呼び出し履歴の情報を取得して、その情報をヒープメモリ上に確保されたバッファの情報に対応付けて記憶手段に記録する記録手段が備えられる場合には、抽出手段は、攻撃の対象となったバッファがヒープメモリに存在することを抽出する場合には、記憶手段に記録される情報を参照することで、そのバッファを確保した関数の情報を抽出することがある。
【００１８】
ここで、本発明のデータ処理装置を構成する各処理手段はコンピュータプログラムでも実現できるものであり、このコンピュータプログラムは、適当な記録媒体に記録して提供されたり、ネットワークを介して提供され、本発明を実施する際にインストールされてＣＰＵなどの制御手段上で動作することにより本発明を実現することになる。
【００１９】
〔２〕本発明の分析情報提供装置
本発明の分析情報提供装置は、上記の分析情報提供処理を実現するために、（イ）バッファオーバーフロー攻撃の発生を検知したデータ処理装置より送られてくる、攻撃の対象となったバッファの存在する場所の情報と、そのバッファを確保した関数の情報とを受信するとともに、これらの情報に加えて、そのバッファ確保からバッファオーバーフロー攻撃までの関数の呼び出し履歴の情報が送られてくる場合には、その情報を受信することで、プログラム開発者に提供する分析情報を受信する受信手段と、（ロ）プログラム開発者に提供済みの分析情報を記憶する既知分析情報記憶手段を参照することで、受信手段の受信した分析情報が既にプログラム開発者に提供済みであるのか否かを判断する判断手段と、（ハ）受信手段の受信した分析情報が既知分析情報記憶手段に登録されていない場合に、その受信した分析情報をプログラム開発者に提供する提供手段と、（ニ）受信手段の受信した分析情報が既知分析情報記憶手段に登録されている場合に、その分析情報に対応付けて既知分析情報記憶手段に登録されている対処情報に基づいて、バッファオーバーフロー攻撃に対する対処処理を実行する実行手段とを備える。
【００２０】
この構成を採るときにあって、判断手段は、受信手段の受信した分析情報が既知分析情報記憶手段に登録されているのか否かを判断するにあたって、攻撃対象となったバッファを確保した関数からプログラム修正の施された関数までの呼び出し履歴が同じものとなるものについては、それ以降の関数呼び出し履歴が異なるものであっても同一のものとして扱って判断を行うことがある。
【００２１】
ここで、本発明の分析情報提供装置を構成する各処理手段はコンピュータプログラムでも実現できるものであり、このコンピュータプログラムは、適当な記録媒体に記録して提供されたり、ネットワークを介して提供され、本発明を実施する際にインストールされてＣＰＵなどの制御手段上で動作することにより本発明を実現することになる。
【００２２】
〔３〕本発明の処理について
このように構成される本発明では、データ処理装置は、バッファオーバーフロー攻撃の発生を検知すると、プログラム開発者に提供する分析情報として、攻撃の対象となったバッファの存在する場所の情報と、そのバッファを確保した関数の情報とを抽出するとともに、そのバッファ確保からバッファオーバーフロー攻撃までの関数の呼び出し履歴の情報を抽出できる場合には、その情報を抽出する。
【００２３】
バッファオーバーフローの修正方法は大きく分けて、
（ｉ）確保するバッファのサイズを拡張する
（ii）バッファ書き込み時にバッファサイズをチェックする
という二つが挙げられる。
【００２４】
（ｉ）の修正を行うには、どのバッファをどの程度拡張すべきかを知る必要がある。
【００２５】
そこで、本発明では、バッファを特定するために、バッファが存在する場所とバッファを確保した場所とを利用する。バッファが存在する場所としては、主にスタックメモリとヒープメモリがある。
【００２６】
スタックメモリ上のバッファが確保されるのは、関数が呼び出された直後であり、本発明では、オーバーフロー発生時のフレームポインタから攻撃対象となったバッファの先頭をまたぐまでスタックトレースを行い、最終的にたどり着くフレームポインタの直前のフレームポインタに近接するリターンアドレスを抽出することで、バッファを確保した関数を特定する。
【００２７】
また、ヒープメモリ上のバッファが確保されるのは、ヒープメモリ確保関数が呼ばれたときであり、本発明では、ヒープメモリ確保関数が呼び出されたときにスタックトップまでスタックトレースを行うことで関数の呼び出し履歴の情報（どのようなモジュール構成に従って呼び出されたのかについての情報）を取得して、その情報をヒープメモリ上に確保されたバッファの情報に対応付けて記録しておき、攻撃の対象となったバッファがヒープメモリに存在するときには、その記録情報を参照することで、バッファを確保した関数の情報を特定する。
【００２８】
一方、（ii）の修正を行うには、（ｉ）の情報に加えて、どこでバッファのサイズをチェックするべきかを知る必要がある。バッファサイズのチェックを行うべき契機は、バッファが確保されてからオーバーフローが発生するまでである。
【００２９】
そこで、本発明では、その場所を特定するために、オーバーフロー発生時のフレームポインタからバッファを確保した関数までスタックトレースを行うことで、バッファ確保からバッファオーバーフロー攻撃までの関数の呼び出し履歴の情報を抽出する。
【００３０】
データ処理装置は、このようにして取得した情報をプログラム開発者に提供する分析情報として分析情報提供装置に通知し、これを受けて、分析情報提供装置は、既知分析情報記憶手段を参照することで、通知された分析情報が既にプログラム開発者に提供済みであるのか否かを判断して、未だ提供していないことを判断するときには、通知された分析情報をプログラム開発者に提供する。
【００３１】
この分析情報の提供を受けて、プログラム開発者は、提供された分析情報を元にプログラムを（１）又は（２）の方法で修正し、既知分析情報記憶手段に登録される分析情報に、その修正方法((１）または（２）であることを示す情報）を反映する。さらに、（２）の方法で修正した場合には、既知分析情報記憶手段に登録される分析情報に、そのバッファのサイズチェックを行った場所を反映する。その他に、修正パッチの在処などの対処情報もあれば、それについても既知分析情報記憶手段に登録される分析情報に反映する。
【００３２】
このようにして修正方法を分析情報に反映することで、同一のバッファが異なった関数呼び出し履歴でオーバーフローしたときにも、既知の分析情報であるのか否かの判断を適切に行えるようにする。
【００３３】
そして、分析情報提供装置は、データ処理装置から通知された分析情報が既知分析情報記憶手段に登録されていることを判断する場合には、その分析情報に対応付けて既知分析情報記憶手段に登録されている対処情報に基づいて、そのバッファオーバーフロー攻撃に対する対処処理を実行する。例えば、利用者にその対処情報を提示したり、その対処情報に基づいて自動的に対処するなどの対処処理を実行するのである。
【発明の効果】
【００３４】
本発明によって得られる効果は、根本的な対処であるプログラムソースの修正や修正パッチの適用を迅速に行えるようになることである。
【００３５】
従来のバッファオーバーフロー攻撃に対する検出手法では、バッファオーバーフローが発生したことがわかっても、その原因の特定が困難であるため、根本的な対処であるプログラムソースの修正や修正パッチの適用が遅れてしまっていた。
【００３６】
これに対して、本発明では、発生したバッファオーバーフローが既知の脆弱性か否かを判断し、未知の脆弱性の場合には、プログラムを修正する上で必要な情報を抽出してプログラム開発者に伝達することで、迅速なプログラム修正が可能となる。そして、既知の脆弱性の場合には、プログラム開発者により登録された対処情報を提示したり、その対処情報に従って自動的に対処を行うことで、迅速に修正パッチを適用できるようになる。
【発明を実施するための最良の形態】
【００３７】
次に、本発明の実施の形態について図面を参照して詳細に説明する。
【００３８】
図１に、本発明により実現されるバッファオーバーフロー脆弱性分析システムの一実施形態例を図示する。
【００３９】
この図に示すように、本発明により実現されるバッファオーバーフロー脆弱性分析システムは、バッファオーバーフローを検知するバッファオーバーフロー検知部１と、プログラム開発者がプログラムの修正箇所を特定するための情報（修正箇所情報）を抽出する修正箇所抽出部２と、発生したバッファオーバーフローが既知脆弱性（過去に発生したもの）かどうかを判定する既知脆弱性判定部３と、既知脆弱性情報（バッファオーバーフローの原因や対処情報など）を格納する既知脆弱性情報格納部４と、プログラム開発者と対話することで既知脆弱性情報を既知脆弱性情報格納部４に登録する対話登録部５と、既知脆弱性情報格納部４に格納されている既知脆弱性情報を元に、バッファオーバーフローに対する対処処理を実行する対処部６とから構成される。
【００４０】
ここで、図中に示す７はスタックメモリ、８はヒープメモリ確保関数呼び出し履歴格納部、９はヒープメモリ確保関数呼び出し履歴記録部である。
【００４１】
このヒープメモリ確保関数呼び出し履歴格納部８は、図２に示すように、ヒープメモリ上に確保されたバッファのアドレスに対応付けて、ヒープメモリ確保関数の呼び出し履歴の情報（どのようなモジュール構成に従って呼び出されたのかについての情報）を格納するものであり、ヒープメモリ確保関数呼び出し履歴記録部９は、図３に示すように、ヒープメモリ確保関数が呼び出されるときに（ヒープメモリ上にバッファが確保されるときに呼び出される）、スタックトップまでスタックトレースを行い、ヒープメモリ確保関数が呼び出されるまでの関数履歴を特定して、それをヒープメモリ上に確保されたバッファのアドレスに対応付けてヒープメモリ確保関数呼び出し履歴格納部８に記録する処理を実行する。
【００４２】
このバッファオーバーフロー脆弱性分析システムは、具体的には、図４に示すように、バッファオーバーフロー攻撃の対象となるプログラムを展開する複数の利用者端末１０と修正箇所情報提供装置１１とプログラム開発者端末１２とがネットワーク１３を介して接続されるシステムで構築されるものであり、利用者端末１０には、図１に示したバッファオーバーフロー検知部１／修正箇所抽出部２／ヒープメモリ確保関数呼び出し履歴格納部８／ヒープメモリ確保関数呼び出し履歴記録部９が備えられ、修正箇所情報提供装置１１には、図１に示した既知脆弱性判定部３／既知脆弱性情報格納部４／対話登録部５／対処部６が備えられることになる。
【００４３】
なお、修正箇所情報提供装置１１については、プログラム開発者端末１２に組み込まれる形で用意されることもある。
【００４４】
次に、このように構成されるバッファオーバーフロー脆弱性分析システムの大まかな処理の流れについて説明する。
【００４５】
先ず最初に、バッファオーバーフロー検知部１がバッファオーバーフローを検知すると、オーバーフローの発生したバッファの場所（スタックメモリまたはヒープメモリ）を特定した上で、修正箇所抽出部２に制御を渡す。
【００４６】
これを受けて、修正箇所抽出部２は、バッファを確保した場所（どの関数がバッファを確保したのかの情報）を抽出する。さらに、バッファサイズのチェックを行うべき場所を特定するために、オーバーフロー発生時のフレームポインタを用いてバッファを確保した関数までスタックトレースを行うことで、バッファ確保からバッファオーバーフロー攻撃までの関数の呼び出し履歴を抽出する。そして、このようにして抽出した修正箇所情報を既知脆弱性判定部３に渡す。
【００４７】
これを受けて、既知脆弱性判定部３は、修正箇所抽出部２より渡された修正箇所情報が既知脆弱性情報格納部４に格納されているのか否かをチェックして、その修正箇所情報が既知脆弱性情報格納部４に格納されていないことを判断する場合には、その修正箇所情報を既知脆弱性情報格納部４に格納するとともに、対話登録部５を介して、プログラム開発者にその修正箇所情報を伝達する。
【００４８】
これを受けて、プログラム開発者が既知脆弱性情報（バッファオーバーフローの原因や対処情報など）を入力してくるので、対話登録部５は、それを入力して、既知脆弱性情報格納部４に格納する。
【００４９】
一方、既知脆弱性判定部３は、修正箇所抽出部２より渡された修正箇所情報が既知脆弱性情報格納部４に格納されていることを判断する場合には、該当する既知脆弱性情報からプログラム開発者が作成した対処情報を取得して、それを対処部６に伝達する。
【００５０】
これを受けて、対処部６は、既知脆弱性判定部３から受け取った対処情報を元に、その対処情報を利用者に提示したり、その対処情報に基づいて自動的に対処を行う。
【００５１】
次に、このように構成されるバッファオーバーフロー脆弱性分析システムの詳細な処理について説明する。
【００５２】
〔１〕バッファオーバーフロー検知部１の処理
先ず最初に、バッファオーバーフロー検知部１の処理について説明する。
【００５３】
バッファオーバーフロー検知部１には、本発明者らが先に出願した特願2004-40962で開示したバッファオーバーフロー検知技術を利用することができる。
【００５４】
この本発明者らが開示したバッファオーバーフロー検知技術では、標準コピー関数の呼び出しをプログラム実行時にフックして、コピー先のバッファがスタックメモリに存在しない場合には、ヒープ管理ブロックを探索することで、ヒープメモリ上に確保されたバッファのバッファオーバーフローについても検知できるようにしている。
【００５５】
これまでのバッファオーバーフロー検知の従来技術では、ヒープメモリ上に確保されたバッファのバッファオーバーフローについては検知できないが、この本発明者らが開示したバッファオーバーフロー検知技術では、その検知が可能となるという点に大きな特徴があり、これにより本発明を構成するバッファオーバーフロー検知部１を実現できるようになる。
【００５６】
図５に、本発明者らが開示した発明により構成されるバッファオーバーフロー検知部１の一構成例を図示する。
【００５７】
この図に示すように、バッファオーバーフロー検知部１は、攻撃対象プロセス２０に対して行われるバッファオーバーフロー攻撃を検知するために、バッファオーバーフロー攻撃の検知処理を行う標準コピー関数フック用ライブラリ２１と、攻撃対象プロセス２０に標準コピー関数フック用ライブラリ２１をロードさせる処理を行うライブラリ注入プログラム２２とを備える。
【００５８】
バッファオーバーフロー攻撃とは、コピー元バッファに攻撃用データを書き込むことで実行され、攻撃対象プロセス２０がコピー元及びコピー先のバッファを指定して標準コピー関数を呼び出すことで、コピー元バッファからコピー先バッファへコピーを行うと、コピー先バッファがオーバーフローさせられることでリターンアドレス等が書き換えられてしまうという攻撃である。
【００５９】
バッファオーバーフロー検知部１は、このようなバッファオーバーフロー攻撃を検知する処理を実行するものである。
【００６０】
図６に、この検知処理を実現すべく用意される標準コピー関数フック用ライブラリ２１の一構成例を図示する。
【００６１】
この図に示すように、標準コピー関数フック用ライブラリ２１は、ライブラリがロードされた際にＯＳやローダから呼び出されるライブラリ初期化関数２１０と、各標準コピー関数に対応するフック関数（バッファオーバーフロー攻撃が行われているのか否かを検出する機能を持つ）の集まりである標準コピー関数用フック関数群２１１と、標準コピー関数のエントリポイントのコピー先であるトランポリンコード領域２１２とを備える。
【００６２】
このように構成されるバッファオーバーフロー検知部１では、まず、ライブラリ注入プログラム２２を起動することにより、標準コピー関数フック用ライブラリ２１を攻撃対象プロセス空間内に注入する。
【００６３】
注入された標準コピー関数フック用ライブラリ２１のライブラリ初期化関数２１０は、攻撃対象プロセス２０を書き換えることにより、攻撃対象プロセス２０による標準コピー関数の呼び出しをフックする。このフックによりフック関数に制御が渡り、バッファオーバーフロー攻撃が発生している場合には、フック関数がそれを検知し、攻撃対象プロセス２０を強制終了する。
【００６４】
次に、図７と図８とを用いて、標準コピー関数フック用ライブラリ２１内のライブラリ初期化関数２１０が行う処理について説明する。
【００６５】
ここで、図７中に示す３０は攻撃対象プロセス２０に係るプログラム部分であって、標準コピー関数の一例である“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）によって管理されているため、これを参照することで取得することになる。
【００８６】
図１１に、標準コピー関数用フック関数群２１１を構成するフック関数が実行する処理フローを図示する。
【００８７】
次に、この処理フローに従って、フック関数の実行する処理について詳細に説明する。
【００８８】
フック関数は、図１１の処理フローに示すように、先ず最初に、ステップ３０で、各標準コピー関数の仕様からコピー元バッファのサイズを求める。続いて、ステップ３１で、スタックトップとスタックボトムのアドレスを取得し、続くステップ３２で、フレームポインタ（起点は自関数が呼び出された時点でのフレームポインタ）が指す領域がスタック内であるのかどうかを判断する。
【００８９】
このステップ３２の判断処理に従って、フレームポインタが指す領域がスタック内であることを判断する場合には、ステップ３３に進んで、呼び出し元関数のフレームを取得し、続くステップ３４で、呼び出し元関数のフレームにコピー先バッファが属するのかどうかを判断する。
【００９０】
このステップ３４の判断処理に従って、呼び出し元関数のフレームにコピー先バッファが属さないことを判断する場合には、ステップ３５に進んで、フレームポインタを格納する変数を呼び出し元関数のフレームポインタに更新し、ステップ３２に戻る。
【００９１】
一方、ステップ３４の判断処理に従って、呼び出し元関数のフレームにコピー先バッファが属することを判断する場合には、ステップ３６に進んで、図９に示すように、コピー先バッファの先頭からその呼び出し元関数のフレームポインタの直前までの距離をコピー先バッファのサイズとして求めてから、後述するステップ３９の処理を行う。
【００９２】
一方、ステップ３２の判断処理に従って、フレームポインタが指す領域がスタック内でないことを判断する場合には、ステップ３７に進んで、コピー先バッファがヒープ管理ブロック４２で管理されているかを調べる。
【００９３】
このステップ３７の判断処理に従って、コピー先バッファがヒープ管理ブロック４２で管理されていないことを判断する場合には、バッファサイズのチェックは行わずに、ステップ４１に進んで、トランポリンコード領域２１２（図７の３１）にコピーされた標準コピー関数の先頭部分を呼び出すことにより、標準コピー関数に制御を渡すことで攻撃対象プロセス２０の処理を継続する。
【００９４】
一方、ステップ３７の判断処理に従って、コピー先バッファがヒープ管理ブロック４２で管理されていることを判断する場合には、ステップ３８に進んで、その管理されているバッファサイズに従ってコピー先バッファのサイズを取得する。
【００９５】
続いて、ステップ３９で、取得したコピー元バッファのサイズと取得したコピー先バッファのサイズとを比較して、コピー先バッファのサイズの方がコピー元バッファのサイズよりも小さいことを判断する場合には、バッファオーバーフロー攻撃が行われたことを検出して、ステップ４０に進んで、攻撃対象プロセス２０を強制終了する。
【００９６】
一方、ステップ３９の判断処理に従って、コピー先バッファのサイズの方がコピー元バッファのサイズよりも大きいことを判断する場合には、バッファオーバーフロー攻撃が行われなかったことを検出して、ステップ４１に進んで、トランポリンコード領域２１２（図３の３１）にコピーされた標準コピー関数の先頭部分を呼び出すことにより、標準コピー関数に制御を渡すことで攻撃対象プロセス２０の処理を継続する。
【００９７】
このようにして、フック関数は、攻撃対象プロセス２０が標準コピー関数を呼び出すときに動作に入って、コピー元バッファのサイズとコピー先バッファのサイズとを取得して比較し、それに従って、攻撃対象プロセス２０に対してバッファオーバーフロー攻撃が行われたのか否かを検出するように処理するのである。
【００９８】
この構成に従って、図１に示したバッファオーバーフロー検知部１は、標準コピー関数の呼び出しをプログラム実行時にフックして、コピー先のバッファがスタックメモリに存在しない場合には、ヒープ管理ブロックを探索することで、ヒープメモリ上に確保されたバッファのバッファオーバーフロー攻撃についても検知できるようにしている。
【００９９】
〔２〕修正箇所抽出部２の処理
次に、図１に示した修正箇所抽出部２の処理について説明する。
【０１００】
修正箇所抽出部２は、オーバーフローしたバッファの場所に応じた方法で、バッファを確保した場所の情報（どの関数がバッファを確保したのかの情報）を抽出して、それを既知脆弱性判定部３に渡す処理を行う。
【０１０１】
すなわち、修正箇所抽出部２は、オーバーフローしたバッファがスタックメモリ７上に存在した場合には、図１２に示すように、まず、オーバーフローが発生した際のフレームポインタを用いて、オーバーフローしたバッファの先頭をまたぐまでスタックトレースを行う。その後、最終的にたどり着くフレームポインタの直前のフレームポインタに隣接するリターンアドレスを、オーバーフローしたバッファを確保した場所として抽出する。
【０１０２】
さらに、バッファを確保した関数からバッファオーバーフロー攻撃までの関数がバッファサイズのチェックを行うべき場所となることに対応して、修正箇所抽出部２は、バッファサイズのチェックを行うべき場所として、図１２に示す関数の呼び出し履歴も抽出する。
【０１０３】
このようにして、修正箇所抽出部２は、オーバーフローしたバッファがスタックメモリ７上に存在した場合には、図１３に示すような修正箇所情報（プログラム開発者がプログラムの修正を行う上で必要となる情報）を抽出するように処理するのである。
【０１０４】
一方、修正箇所抽出部２は、オーバーフローしたバッファがヒープメモリ上に存在した場合には、そのバッファのアドレスをキーにして、図２に示すようなデータ構造を持つヒープメモリ確保関数呼び出し履歴格納部８を検索することで、オーバーフローしたバッファを確保した場所を抽出する。
【０１０５】
ヒープメモリ上にバッファを確保するためには、ヒープメモリ確保関数を呼び出す必要がある。そこで、バッファが確保された場所を特定可能とするために、ヒープメモリ確保関数呼び出し履歴記録部９は、あらかじめヒープメモリ確保関数をフックしておき、ヒープメモリ確保関数が呼び出される度に、図１４に示すように、スタックトップまでスタックトレースを行って、ヒープメモリ確保関数が呼ばれるまでの関数履歴をヒープメモリ確保関数呼び出し履歴格納部８（図２に示したデータ構造を持つ）に記録しておく。
【０１０６】
これから、修正箇所抽出部２は、オーバーフローしたバッファがヒープメモリ上に存在した場合には、そのバッファのアドレスをキーにしてヒープメモリ確保関数呼び出し履歴格納部８を検索することで、オーバーフローしたバッファを確保した場所を抽出するのである。
【０１０７】
このようにして、修正箇所抽出部２は、オーバーフローしたバッファがヒープメモリ上に存在した場合には、図１５に示すような修正箇所情報を抽出するように処理するのである。
【０１０８】
次に、図１６に示す処理フローに従って、修正箇所抽出部２の実行する処理について説明する。
【０１０９】
すなわち、修正箇所抽出部２は、バッファオーバーフロー検知部１がバッファオーバーフロー攻撃を検知すると、図１６の処理フローに示すように、先ず最初に、ステップ４０で、バッファオーバーフロー検知部１から通知される検知結果に従って、オーバーフローしたバッファの存在する場所がスタックメモリ上にあるのか、ヒープメモリ上にあるのかを判定する。
【０１１０】
この判定処理に従って、オーバーフローしたバッファがヒープメモリ上にあることを判断する場合には、ステップ４１に進んで、ヒープメモリ確保関数呼び出し履歴格納部８を参照することで、バッファ確保時の関数呼び出し履歴を取得する。
【０１１１】
そして、続くステップ４２で、この取得した関数呼び出し履歴の情報を修正箇所情報（図１５に示すもの）として通知しつつ、既知脆弱性判定部３に制御を渡す。
【０１１２】
一方、オーバーフローしたバッファがスタックメモリ上にあることを判断する場合には、ステップ４３に進んで、オーバーフローしたバッファの先頭をまたぐまでスタックトレースを行うことでバッファを確保した関数を特定する。続いて、ステップ４４で、バッファを確保した関数からオーバーフローした関数までの関数履歴を取得する。
【０１１３】
そして、続くステップ４５で、この特定したバッファ確保の関数の情報と、この取得した関数呼び出し履歴の情報とを修正箇所情報（図１３に示すもの）として通知しつつ、既知脆弱性判定部３に制御を渡す。
【０１１４】
このようにして、修正箇所抽出部２は、オーバーフローしたバッファの場所に応じた方法で修正箇所情報を抽出して、それを既知脆弱性判定部３に通知するように処理するのである。
【０１１５】
〔３〕既知脆弱性判定部３の処理
次に、図１に示した既知脆弱性判定部３の処理について説明する。
【０１１６】
既知脆弱性判定部３は、修正箇所抽出部２より渡された修正箇所情報が既知脆弱性情報格納部４に格納されているのか否かをチェックして、その修正箇所情報が既知脆弱性情報格納部４に格納されていないことを判断する場合には、その修正箇所情報を既知脆弱性情報格納部４に格納するとともに、対話登録部５を介して、プログラム開発者に伝達し、一方、格納されていることを判断する場合には、該当する既知脆弱性情報からプログラム開発者の作成した対処情報を取得して、それを対処部６に伝達する処理を行う。
【０１１７】
図１７に、既知脆弱性情報格納部４に格納される既知脆弱性情報の一例を図示する。
【０１１８】
この図に示すように、既知脆弱性情報格納部４は、既知脆弱性情報として、バッファが存在する場所の情報と、バッファを確保した場所の情報と、バッファオーバーフローの脆弱性についての修正方法の情報と、バッファのサイズチェックを行う場所の情報と、バッファオーバーフローが発生したときの対処情報とを格納する。
【０１１９】
ここで、バッファが存在する場所の情報と、バッファを確保した場所の情報と、バッファのサイズチェックを行う場所の情報とについては、修正箇所抽出部２から修正箇所情報として通知されることになる。
【０１２０】
また、バッファオーバーフローの脆弱性についての修正方法の情報（未修正であるとか、バッファサイズを拡張したとか、バッファサイズをチェックするプログラムを挿入したという情報）については、プログラム開発者が修正箇所抽出部２の抽出した修正箇所情報に基づいてプログラムを修正した場合に、その修正の元となった修正箇所情報に対応付ける形で格納されることになる。
【０１２１】
ここで、このプログラムの修正で、バッファサイズをチェックするプログラムを挿入するという修正方法がとられた場合には、図１７に示すリターンアドレスＹに示すように、どの場所でその修正が行われたのかが記録されることになる。
【０１２２】
また、バッファオーバーフローが発生したときの対処情報（例えば、修正パッチのあるＵＲＬの情報など）については、プログラム開発者により作成されて、修正箇所情報に対応付ける形で格納されることになる。
【０１２３】
図１８に、既知脆弱性判定部３の実行する処理フローを図示する。次に、この処理フローに従って、既知脆弱性判定部３の実行する処理について説明する。
【０１２４】
既知脆弱性判定部３は、修正箇所抽出部２から修正箇所情報が渡されると、図１８の処理フローに示すように、先ず最初に、ステップ５０で、修正箇所抽出部２より受け取った修正箇所情報の“バッファが存在する場所”と“バッファを確保した場所”とが既知脆弱性情報格納部４に存在するのか否かをチェックする。
【０１２５】
このチェック処理に従って、修正箇所抽出部２より受け取った修正箇所情報の“バッファが存在する場所”と“バッファを確保した場所”とが既知脆弱性情報格納部４に存在しないことを判断するときには、ステップ５５に進んで、その受け取った修正箇所情報を既知脆弱性情報格納部４に格納し、続くステップ５６で、対話登録部５を介して、その受け取った修正箇所情報をプログラム開発者へ伝達する。
【０１２６】
これを受けて、プログラム開発者は、伝達された修正箇所情報に従い、この脆弱性を修正するので（バッファサイズを拡張したり、バッファサイズをチェックする修正を行う）、対話登録部５は、それに応じて、既知脆弱性情報格納部４に格納される既知脆弱性情報を更新する。すなわち、修正方法を登録するとともに、対処情報が入力される場合には、それを登録し、そして、バッファサイズをチェックする修正を行った場合には、バッファのサイズチェック場所に実際にサイズチェックした場所をマークすることにより、既知脆弱性情報格納部４に格納される既知脆弱性情報を更新するのである。
【０１２７】
一方、既知脆弱性判定部３は、ステップ５０で、修正箇所抽出部２より受け取った修正箇所情報の“バッファが存在する場所”と“バッファを確保した場所”とが既知脆弱性情報格納部４に存在することを判断するときには、ステップ５１に進んで、その受け取った修正箇所情報に対応付けて格納されている修正方法が“未修正”であるのか否かをチェックする。
【０１２８】
このチェック処理に従って、受け取った修正箇所情報に対応付けられる修正方法が“未修正”であることを判断するときには、ステップ５４に進んで、バッファのサイズチェック場所が全て等しいかどうかを調べ（関数履歴が全て等しいかどうかを調べ）、等しいことを判断するときには、ステップ５７に進んで、既知脆弱性情報格納部４に格納されている該当する対処情報を対処部６へ伝達する。一方、全て等しくないことを判断するときには、ステップ５５に進んで、受け取った修正箇所情報を既知脆弱性情報格納部４に格納し、続くステップ５６で、対話登録部５を介して、その受け取った修正箇所情報をプログラム開発者へ伝達する。
【０１２９】
一方、ステップ５１のチェック処理に従って、受け取った修正箇所情報に対応付けられる修正方法が“未修正”でないことを判断するときには、ステップ５２に進んで、受け取った修正箇所情報に対応付けられる修正方法が“バッファサイズ拡張”であるのか否かをチェックする。
【０１３０】
このチェック処理に従って、受け取った修正箇所情報に対応付けられる修正方法が“バッファサイズ拡張”であることを判断するときには、ステップ５７に進んで、既知脆弱性情報格納部４に格納されている該当する対処情報を対処部６へ伝達する。一方、その修正方法が“バッファサイズ拡張”でないことを判断するとき、すなわち、その修正方法が“バッファサイズチェック”であることを判断するときには、ステップ５３に進んで、バッファを確保した場所から修正箇所までに関してのみ、バッファのサイズチェック場所が等しいかどうかをチェックする。
【０１３１】
このチェック処理に従って、バッファを確保した場所から修正箇所までのサイズチェック場所が等しいことを判断するときには、それ以降の関数履歴に関係なく既知脆弱性情報であると見なして、ステップ５７に進んで、既知脆弱性情報格納部４に格納されている該当する対処情報を対処部６へ伝達する。一方、等しくないことを判断するときには、ステップ５５に進んで、受け取った修正箇所情報を既知脆弱性情報格納部４に格納し、続くステップ５６で、対話登録部５を介して、その受け取った修正箇所情報をプログラム開発者へ伝達する。
【０１３２】
そして、ステップ５７の処理に従って、対処部６へ該当する対処情報が伝達されるときには、これを受けて、対処部６は、利用者にその対処情報（対処法）を提示したり、その対処情報に従って自動的にバッファオーバーフローに対しての対処を実施する。
【０１３３】
このようにして、本発明により実現されるバッファオーバーフロー脆弱性分析システムでは、発生したバッファオーバーフローが既知の脆弱性か否かを判断し、未知の脆弱性の場合には、プログラムを修正する上で必要な情報を抽出してプログラム開発者に伝達することで、迅速なプログラム修正を可能とするとともに、既知の脆弱性の場合には、プログラム開発者により登録された対処情報を提示したり、その対処情報に従って自動的に対処を行うことで、迅速に修正パッチを適用できるようになる。
【図面の簡単な説明】
【０１３４】
【図１】本発明により実現されるバッファオーバーフロー脆弱性分析システムの一実施形態例である。
【図２】ヒープメモリ確保関数呼び出し履歴格納部のデータ構造の説明図である。
【図３】ヒープメモリ確保関数呼び出し履歴記録部の実行する処理フローである。
【図４】本発明により構成されるバッファオーバーフロー脆弱性分析システムのシステム構成例である。
【図５】バッファオーバーフロー検知部の一構成例である。
【図６】標準コピー関数フック用ライブラリの一構成例である。
【図７】ライブラリ初期化関数の行う処理の説明図である。
【図８】ライブラリ初期化関数の実行する処理フローである。
【図９】フック関数の行う処理の説明図である。
【図１０】フック関数の行う処理の説明図である。
【図１１】フック関数の実行する処理フローである。
【図１２】修正箇所抽出部の行う処理の説明図である。
【図１３】修正箇所抽出部の抽出する修正箇所情報の説明図である。
【図１４】ヒープメモリ確保関数呼び出し履歴記録部の行う処理の説明図である。
【図１５】修正箇所抽出部の抽出する修正箇所情報の説明図である。
【図１６】修正箇所抽出部の実行する処理フローである。
【図１７】既知脆弱性情報格納部に格納される既知脆弱性情報の説明図である。
【図１８】既知脆弱性判定部の実行する処理フローである。
【符号の説明】
【０１３５】
１  バッファオーバーフロー検知部
２  修正箇所抽出部
３  既知脆弱性判定部
４  既知脆弱性情報格納部
５  対話登録部
６  対処部
７  スタックメモリ
８  ヒープメモリ確保関数呼び出し履歴格納部
９  ヒープメモリ確保関数呼び出し履歴記録部
【図１】
2006053760.tif 000003
【図２】
2006053760.tif 000004
【図３】
2006053760.tif 000005
【図４】
2006053760.tif 000006
【図５】
2006053760.tif 000007
【図６】
2006053760.tif 000008
【図７】
2006053760.tif 000009
【図８】
2006053760.tif 000010
【図９】
2006053760.tif 000011
【図１０】
2006053760.tif 000012
【図１１】
2006053760.tif 000013
【図１２】
2006053760.tif 000014
【図１３】
2006053760.tif 000015
【図１４】
2006053760.tif 000016
【図１５】
2006053760.tif 000017
【図１６】
2006053760.tif 000018
【図１７】
2006053760.tif 000019
【図１８】
2006053760.tif 000020