(57)【要約】【課題】既存のオペレーションシステムを改変することなくプログラム実行時のオーバーヘッドを低減し、バッファオーバーフローを検出する。【解決手段】コンピュータ１は、プログラム３４からの要求に応じてメモリ３１内にバッファメモリ領域を割り当てるとともに、当該バッファメモリ領域に隣接する前後のアドレスにダミーメモリ領域を割り当てる割当ステップと、ダミーメモリ領域のアドレスをデバックレジスタ３３に登録する登録ステップと、当該コンピュータ１のハードウェアのデバック機能を用いてデバックレジスタ３３に登録されたダミーメモリ領域のデータ更新を検出することにより、バッファメモリのオーバーフローを検出する。【選択図】図２
2009259078.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータが行う、プログラムの実行時に発生するバッファオーバーフローを検出する方法であって、
前記コンピュータは、
前記プログラムからの要求に応じてメモリ内にバッファメモリ領域を割り当てるとともに、当該バッファメモリ領域に隣接する前後のアドレスにダミーメモリ領域を割り当てる割当ステップと、    
前記ダミーメモリ領域のアドレスを、デバックレジスタに登録する登録ステップと、
当該コンピュータのハードウェアのデバック機能を用いて前記デバックレジスタに登録された前記ダミーメモリ領域のデータ更新を検出することにより、バッファメモリのオーバーフローを検出する検出ステップと、を行うこと  
を特徴とするバッファオーバーフロー検出方法。
【請求項２】
請求項１記載のバッファオーバーフロー検出方法であって、
前記割当ステップは、スタックメモリ内に、前記バッファメモリおよび前記ダミーメモリ領域を割り当てること
を特徴とするバッファオーバーフロー検出方法。
【請求項３】
請求項１または請求項２記載のバッファオーバーフロー検出方法であって、
前記コンピュータは、
ソースプログラムを解析し、バッファメモリ領域の割り当て要求を検出すると、当該割り当て要求の前後にダミーメモリ領域の割り当て処理、および当該ダミー領域のメモリアドレスをデバックレジスタに登録する処理をソースプログラムに追加する前処理ステップと、
前記前処理ステップにより前処理されたソースプログラムをコンパイルし、実行可能なプログラムに変換するコンパイルステップと、をさらに行うこと
を特徴とするバッファオーバーフロー検出方法。
【請求項４】
請求項３記載のバッファオーバーフロー検出方法であって、
前記前処理ステップは、メモリ内の連続したメモリアドレス上のメモリ領域の確保要求を前記バッファメモリ領域の割り当て要求として検出し、当該割り当て要求の前後にダミーメモリ領域の割り当て処理、および当該ダミー領域のメモリアドレスをデバックレジスタに登録する処理をソースプログラムに追加すること
を特徴とするバッファオーバーフロー検出方法。
【請求項５】
請求項３記載のバッファオーバーフロー検出方法であって、
前記前処理ステップは、ソースプログラムを解析し、所定の識別子が付加され箇所をバッファメモリ領域の割り当て要求として検出し、当該割り当て要求の前後にダミーメモリ領域の割り当て処理、および当該ダミー領域のメモリアドレスをデバックレジスタに登録する処理をソースプログラムに追加すること
を特徴とするバッファオーバーフロー検出方法。
【請求項６】
コンピュータが実行する、アプリケーションプログラムの実行時に発生するバッファオーバーフローを検出する検出プログラムであって、
前記コンピュータに、
前記アプリケーションプログラムから要求に応じてメモリ内にバッファメモリ領域を割り当てるとともに、当該バッファメモリ領域に隣接する前後のアドレスに、ダミーメモリ領域を割り当てる割当ステップと、
前記ダミーメモリ領域のアドレスを、デバックレジスタに登録する登録ステップと、
当該コンピュータのハードウェアのデバック機能を用いて前記デバックレジスタに登録された前記ダミーメモリ領域のデータ更新を検出することにより、バッファメモリのオーバーフローを検出する検出ステップと、を行うこと
を特徴とするバッファオーバーフロー検出プログラム。
【請求項７】
プログラムの実行時に発生するバッファオーバーフローを検出するバッファオーバーフロー検出装置であって、
ソースプログラムを解析し、バッファメモリ領域の割り当て要求を検出すると、当該割り当て要求の前後にダミーメモリ領域の割り当て処理、および当該ダミー領域のメモリアドレスをデバックレジスタに登録する処理をソースプログラムに追加する前処理手段と、
前記前処理手段により前処理されたソースプログラムをコンパイルし、実行可能なプログラムに変換するコンパイル手段と、
前記実行可能なプログラムを実行する実行手段と、を有し、
前記実行手段は、前記実行可能なプログラムを実行することにより、
前記実行可能なプログラムからの要求に応じてメモリ内にバッファメモリ領域を割り当てるとともに、当該バッファメモリ領域に隣接する前後のアドレスに、ダミーメモリ領域を割り当て、
前記ダミーメモリ領域のアドレスをデバックレジスタに登録し、
当該バッファオーバーフロー検出装置のハードウェアのデバック機能を用いて前記デバックレジスタに登録された前記ダミーメモリ領域のデータ更新を検出することにより、バッファメモリのオーバーフローを検出すること  
を特徴とするバッファオーバーフロー検出装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの実行中に発生するバッファメモリのオーバーフローを検出する技術に関する。
【背景技術】
【０００２】
プログラム中でメモリ破壊を行っている箇所を検出する方法として、例えば特許文献１にメモリエリアの前後にバリアを確保し、バリアの値をプログラムステップ毎に監視してバリアの破壊（メモリ破壊）を検出する方法が記載されている。
【０００３】
また、バッファメモリに関しては、例えば特許文献２にバッファメモリ領域確保要求があったときに、物理ページが存在しない仮想ページを用意し、要求のあったメモリ領域をこの仮想ページの直前に割り当てることで、バッファメモリのオーバーフロー発生時にページフォルトを発生させることでバッファメモリの破壊を検出するバッファメモリ管理方法が記載されている。
【特許文献１】特開２０００−５７００８
【特許文献２】特開２０００−４０００８
【発明の開示】
【発明が解決しようとする課題】
【０００４】
特許文献１のメモリ破壊を検出する方法は、プログラムを１ステップ実行する毎にバリア（メモリ）の破壊をチェックする必要があるため、プログラム実行時のオーバーヘッドが大きい。また、特許文献２のバッファメモリ管理方法では、バッファメモリを確保する際に、ページ割当を行うのはオペレーションシステム（ＯＳ）である。したがって、バッファメモリを仮想ページの直前に割り当てるようにページ割当方法を変更するためには、オペレーションシステムの改造が必要となる。
【０００５】
本発明は上記事情に鑑みてなされたものであり、本発明の目的は、既存のオペレーションシステムを改変することなくプログラム実行時のオーバーヘッドを低減し、バッファオーバーフローを検出することにある。
【課題を解決するための手段】
【０００６】
本発明は、コンピュータが行う、プログラムの実行時に発生するバッファオーバーフローを検出する方法であって、前記コンピュータは、前記プログラムからの要求に応じてメモリ内にバッファメモリ領域を割り当てるとともに、当該バッファメモリ領域に隣接する前後のアドレスにダミーメモリ領域を割り当てる割当ステップと、前記ダミーメモリ領域のアドレスを、デバックレジスタに登録する登録ステップと、当該コンピュータのハードウェアのデバック機能を用いて前記デバックレジスタに登録された前記ダミーメモリ領域のデータ更新を検出することにより、バッファメモリのオーバーフローを検出する検出ステップと、を行うこと。
【０００７】
また、本発明は、コンピュータが実行する、アプリケーションプログラムの実行時に発生するバッファオーバーフローを検出する検出プログラムであって、前記コンピュータに、前記アプリケーションプログラムから要求に応じてメモリ内にバッファメモリ領域を割り当てるとともに、当該バッファメモリ領域に隣接する前後のアドレスに、ダミーメモリ領域を割り当てる割当ステップと、前記ダミーメモリ領域のアドレスを、デバックレジスタに登録する登録ステップと、当該コンピュータのハードウェアのデバック機能を用いて前記デバックレジスタに登録された前記ダミーメモリ領域のデータ更新を検出することにより、バッファメモリのオーバーフローを検出する検出ステップと、を行う。
【０００８】
また、本発明は、プログラムの実行時に発生するバッファオーバーフローを検出するバッファオーバーフロー検出装置であって、ソースプログラムを解析し、バッファメモリ領域の割り当て要求を検出すると、当該割り当て要求の前後にダミーメモリ領域の割り当て処理、および当該ダミー領域のメモリアドレスをデバックレジスタに登録する処理をソースプログラムに追加する前処理手段と、前記前処理手段により前処理されたソースプログラムをコンパイルし、実行可能なプログラムに変換するコンパイル手段と、前記実行可能なプログラムを実行する実行手段とを有し、前記実行手段は、前記実行可能なプログラムを実行することにより、前記実行可能なプログラムからの要求に応じてメモリ内にバッファメモリ領域を割り当てるとともに、当該バッファメモリ領域に隣接する前後のアドレスに、ダミーメモリ領域を割り当て、前記ダミーメモリ領域のアドレスをデバックレジスタに登録し、当該バッファオーバーフロー検出装置のハードウェアのデバック機能を用いて前記デバックレジスタに登録された前記ダミーメモリ領域のデータ更新を検出することにより、バッファメモリのオーバーフローを検出する。
【発明の効果】
【０００９】
本発明によれば、既存のオペレーションシステムを改変することなくプログラム実行時のオーバーヘッドを低減し、バッファオーバーフローを検出することができる。
【発明を実施するための最良の形態】
【００１０】
＜第１の実施形態＞
以下、本発明の第１の実施形態について説明する。
【００１１】
図１は、本発明の第１の実施形態であるバッファオーバーフロー検出装置（以下、「検出装置」）１の機能ブロック図である。図示する検出装置１は、前処理部１１と、コンパイル部１２と、実行部１３と、デバック部１４と、プログラム記憶部１５とを有する。
【００１２】
前処理部１１は、プログラム記憶部１５にあらかじめ記憶されたソースプログラムをコンパイルする前に前処理を行い、前処理済みソースプログラムを生成してプログラム記憶部１６に出力する。すなわち、前処理部１１は、ソースプログラムの字句解析を行い、ソースプログラムの中で所定の条件を満たす字句が記載された箇所を検出すると、ソースプログラムを変更し、前処理済みソースプログラムを生成する。ソースプログラムの変更は、例えば、所定の命令または宣言の追加、削除、変更などである。
【００１３】
コンパイル部１２は、プログラム記憶部１６に出力された前処理済みソースプログラムを入力として読み込み、字句解析を行い、実行部１３（ＣＰＵ）が実行可能なプログラムに変換し、プログラム記憶部１５に出力する。実行部１３は、実行可能プログラムを実行し、バッファオーバーフローを検出する。
【００１４】
デバック部１４は、検出装置１のＣＰＵ（ハードウェア）のデバック機能であって、プログラム記憶部１５の実行可能プログラム（アプリケーションプログラム等）の実行時に発生するエラーを検出する。すなわち、ＣＰＵは、当該ＣＰＵ内部にある複数のデバックレジスタに登録された、所定のアドレスのメモリを監視し、当該メモリにおけるデータの変更を検知する。
【００１５】
図２に、ＣＰＵとデバックレジスタの模式図を示す。あらかじめメモリ３１内の特定のアドレスをデバックレジスタ３３に登録し、実行可能プログラム３４を実行することにより、デバックレジスタ３３に登録されたアドレスに対して更新が発生すると、ＣＰＵ３２は、これを検知して割り込みを発生させる。そして、ＣＰＵ３２は、実行中のプログラム３４の一部である割込関数（割込ハンドラ）３５を呼び出すことができる。なお、割込関数３５は、あらかじめプログラム記憶部１５に記憶されている実行可能プログラムの中の一部（関数、サブルーチン等）であって、所定のエラー処理（例えば、実行中のプログラム３４の強制終了、ログ情報の取得等）を行う。この割込関数が呼び出されたことにより、実行部１３（実行中のプログラム３４）は、バッファオーバーフローを検出する。
【００１６】
図３に、本実施形態のソースプログラムの構造を示す。なお、本実施形ではＣ言語、Ｃ＋＋言語などを例として説明するが、プログラミング言語はこれらに限定されない。
【００１７】
図示するソースプログラムは、少なくとも１つの関数２１を有する。関数２１は、所定の処理を実行して結果を返す一連の命令群であり、少なくとも１つの引数を有する場合がある。関数２１は、変数宣言部２２と処理内容記述部２３とを含む。変数宣言部２２には、関数２１内でのみ使用されるローカル変数が記述（宣言）される。変数宣言部２２で記述されたローカル変数は、プログラムの実行時に記述された順序に従って、検出装置１が備えるメモリ内のスタックメモリ上に配置される。処理内容記述部２３には、ローカル変数を用いた処理手順が記述される。
【００１８】
上記説明した検出装置１は、例えば、少なくともＣＰＵと、メモリと、ＨＤＤ等の外部記憶装置とを備えた汎用的なコンピュータシステムを用いることができる。このコンピュータシステムにおいて、ＣＰＵがメモリ上にロードされたプログラムを実行することにより、検出装置１の各機能が実現される。なお、検出装置１は、必要に応じて入力装置および出力装置を備えることとしてもよい。
【００１９】
次に、本実施形態の検出装置１のバッファオーバーフロー検出処理について説明する。
【００２０】
本実施形態では、スタックメモリ上のバッファのバッファオーバーフローを検出する。スタックメモリは、プログラム起動時に検出装置１のメモリの中に確保されるメモリ領域であり、関数を呼び出しの際に使用される。バッファは、メモリの中に確保されるメモリ領域であって、本実施形態ではスタックメモリ上に確保されるものとする。メモリ中に確保されるバッファは、論理的に連続したメモリ領域であって、他のメモリ領域と隣接して存在する。プログラム実行中に、バッファとして確保されたメモリ領域を超えるデータが入力された場合、この領域にデータがオーバーフローし（溢れてしまい）、オーバーフローしたデータは隣接するメモリ領域へと書き込まれ、すなわちバッファオーバーフローが発生する。
【００２１】
図４および図５は、本実施形態のバッファオーバーフロー検出処理のフローチャートである。
【００２２】
まず、前処理部１１は、プログラム記憶部１５に格納されたソースプログラムを読み込み、各関数について以下の処理を行う。すなわち、図４に示すように、前処理部１１は、関数２１の変数宣言部２２に記述されたローカル変数および引数のうち、連続したメモリアドレス上のメモリ領域の確保を宣言しているもの（以下、「バッファ変数」）を検出する。バッファ変数としては、例えば、配列として宣言されているものなどが考えられる。バッファ変数を検出した場合、前処理部１１は、変数宣言部２２のバッファ変数が記述されている箇所の前後にダミー変数の宣言を記述（追加）する（Ｓ１１）。なお、バッファ変数の前に宣言したダミー変数を第１のダミー変数とし、バッファ変数の後に宣言したダミー変数を第２のダミー変数とする。
【００２３】
そして、前処理部１１は、変数宣言部２２の最後に、ｌｏｎｇ型の変数宣言を２つ追加する。このｌｏｎｇ型の変数は、ＣＰＵ内のデバックレジスタ用の変数（以下、「デバックレジスタ退避変数」）である（Ｓ１２）。なお、前処理部１１は、これらのデバック退避レジスタ変数の変数名を、乱数により生成する。
【００２４】
そして、前処理部１１は、処理内容記述部２３の先頭に、現時点において各デバックレジスタに登録されている値を取得し、Ｓ１２で宣言したデバックレジスタ退避変数に入力する処理（命令）を追加する（Ｓ１３）。
【００２５】
そして、前処理部１１は、処理内容記述部２３のＳ１３で追加した処理の直後に、Ｓ１１で宣言した第１のダミー変数および第２のダミー変数のアドレスを、デバックレジスタに登録する処理を追加する（Ｓ１４）。
【００２６】
そして、前処理部１１は、関数２１の末尾に当該関数２１を抜ける命令がある場合は当該命令の直前に、また、関数２１の末尾に当該関数２１を抜ける命令がない場合は当該関数２１の末尾に、デバックレジスタ退避変数に格納した値をデバックレジスタに登録する（戻す）処理を追加する（Ｓ１５）。前処理部１１は、ソースプログラムの各関数２１に上記Ｓ１１からＳ１５の前処理を行うことにより、前処理済みソースプログラムを生成し、プログラム記憶部１５に出力する。
【００２７】
コンパイル部１２は、前処理済みソースプログラムを、ＣＰＵが実行可能なプログラムに変換（コンパイル）し、実行可能なプログラムをプログラム記憶部１５に出力する（Ｓ１６）。
【００２８】
そして、実行部１３は、実行可能プログラムを実行する（Ｓ１７）。図５に、Ｓ１７の処理のフローチャートを示す。実行可能プログラムが実行されることにより、所定の関数が呼び出され、Ｓ１１で宣言された第１のダミー変数、バッファ変数、および第２のダミー変数が順に、スタックメモリ上に割り当てられる（Ｓ２１）。
【００２９】
図６に、スタックメモリのメモリマップの概略図を示す。図示するように、バッファ変数のメモリ領域６２の前後に隣接して、第１のダミー変数のメモリ領域６１および第２のダミー変数のメモリ領域６３が割り当てられている。
【００３０】
そして、Ｓ１３で追加された処理により、関数が呼び出される前にデバックレジスタに格納されている値がデバックレジスタ退避変数に格納される（Ｓ２２）。そして、Ｓ１４で追加された処理により、スタックメモリに確保された第１のダミー変数のメモリ領域６１および第２のダミー変数のメモリ領域６３のアドレスが、デバックレジスタに登録される（Ｓ２３）。
【００３１】
これにより、ＣＰＵのデバック機能であるデバック部１４は、デバックレジスタに登録された、ダミー変数のメモリ領域６１、６３を監視し、処理内容記述部の処理を実行することによる当該メモリ領域６１、６３におけるデータの変更を検知する。前述のとおり、バッファオーバーフローは、確保されたバッファ変数のメモリ領域６２のサイズを越えるデータを書き込むことによって発生し、オーバーフローしたデータは隣接する第１のダミー変数のメモリ領域６１および／または第２のダミー変数のメモリ領域６３に書き込まれる。すなわち、バッファオーバーフローが発生すると、第１のダミー変数のメモリ領域６１および／または第２のダミー変数のメモリ領域６３が書き換わる。
【００３２】
ダミー変数のメモリ領域６１、６３のデータが更新されたことを検知した場合（Ｓ２４：ＹＥＳ）、デバック部１４は割り込みを発生させ、割込関数を呼び出す。そして、この割り込みを検知することにより、実行部１３（実行中のプログラム３４）は、バッファオーバーフローの発生を検知する（Ｓ２５）。なお、割込関数を実行することにより、所定のエラー処理（実行中のプログラム・関数の強制終了、ログ情報の収集等）が行われる。
【００３３】
一方、ダミー変数のメモリ領域６１、６３のデータが更新されない場合（Ｓ２４：ＮＯ）、関数が正常に実行され、Ｓ１５で追加された処理により、デバックレジスタ退避変数に格納した値をデバックレジスタに再登録し、当該関数を終了する。これにより、当該関数の処理を実行している間、デバックレジスタの値がデバックレジスタ退避変数に退避され、当該関数を実行する前のデバックレジスタの値が保証される。
【００３４】
＜第２の実施形態＞
以下、本発明の第２の実施形態について説明する。
【００３５】
本実施形態では、プログラムの外部から入力されたデータをバッファに格納する際に発生するバッファオーバーフローを検出する。なお、本実施形態のバッファオーバーフロー検出装置は、図１と同様であるためここでは説明を省略する。
【００３６】
本実施形態では、プログラム開発者がソースプログラムを作成する際に、プログラムの外部から入力されるデータを格納するためのメモリ領域の確保（割り当て）を宣言する際に、所定の識別子を付加しておく。この識別子が付加されたメモリ領域の確保を宣言しているものを、本実施形態では「バッファ変数」とし、第１の実施形態で説明した図４および図５に示すバッファオーバーフロー検出処理と同様の処理を行う。
【００３７】
すなわち、前処理部１１は、プログラム記憶部１５に格納されたソースプログラムを読み込み、関数の変数宣言部に記述された所定の識別子が付加されたバッファ変数を検出し、当該バッファ変数が記述されている箇所の前後に第１のダミー変数および第２のダミー変数の宣言を記述する（Ｓ１１）。そして、前処理部１１は、変数宣言部の最後に、デバックレジスタ退避変数を２つ追加する（Ｓ１２）。そして、前処理部１１は、処理内容記述部の先頭に、現時点において各デバックレジスタに登録されている値を取得し、デバックレジスタ退避変数に入力する処理を追加する（Ｓ１３）。そして、前処理部１１は、第１のダミー変数および第２のダミー変数のアドレスを、デバックレジスタに登録する処理を追加する（Ｓ１４）。そして、前処理部１１は、関数の末尾にデバックレジスタ退避変数に格納した値をデバックレジスタに再登録する処理を追加する（Ｓ１５）。コンパイル部１２は、前処理済みソースプログラムを、実行可能プログラムに変換する（Ｓ１６）。そして、実行部１３は、実行可能プログラムを図５に示すように実行する（Ｓ１７）。
【００３８】
なお、第１の実施形態のバッファ変数はスタックメモリ上に割り当てられたが、本実施形態のバッファ変数はスタックメモリに限定されず、メモリ内のいずれかの領域に割り当てられる。
【００３９】
以上説明した第１および第２の実施形態では、ハードウェア（ＣＰＵ）のデバック機能を用いてバッファオーバーフローを検出する。すなわち、バッファメモリの前後に割り当てられたダミーメモリ領域のアドレスをデバックレジスタに登録することにより、バッファオーバーフローを検出する。デバックレジスタは、既存のオペレーションシステムを改造することなく、プログラムが利用（アクセス）することができる。これにより、第１および第２の実施形態では、オペレーションシステムを改造することなく、バッファオーバーフローを検出することができる。
【００４０】
また、第１および第２の実施形態では、バッファメモリの前後に割り当てられたダミーメモリ領域のアドレスをデバックレジスタに登録することでバッファオーバーフローを検出する。これにより、デバックレジスタへの登録処理を除き、プログラムの実行によるオーバーヘッドは生じない。すなわち、デバックレジスタへの登録処理は、関数の呼び出し時にのみ行われるため、プログラムの実行によるオーバーヘッドが抑えることができる。
【００４１】
また、第１および第２の実施形態では、デバックレジスタに登録されたダミーメモリ領域のデータが書き換えられたタイミングで、即座にバッファオーバーフローを検出することができる。これにより、バッファオーバーフローに起因する２次的なプログラム誤動作による被害を防止することができる。また、バッファオーバーフローを故意に発生させることにより、不正なコードを実行させるバッファオーバーフロー攻撃からプログラムを保護することができる。
【００４２】
なお、本発明は上記実施形態に限定されるものではなく、その要旨の範囲内で数々の変形が可能である。
【図面の簡単な説明】
【００４３】
【図１】本発明の実施形態に係るバッファオーバーフロー検出装置の機能ブロック図である。
【図２】バッファオーバーフロー検出装置のＣＰＵとデバックレジスタとを模式的に示す図である。
【図３】ソースプログラムの一例を示すものである。
【図４】バッファオーバーフロー検出処理のフローチャートである。
【図５】バッファオーバーフロー検出処理のフローチャートである。
【図６】メモリマップの一例を示すものである。
【符号の説明】
【００４４】
１    バッファオーバーフロー検出装置
１１  前処理部
１２  コンパイル部
１３  実行部
１４  デバック部
１５  プログラム記憶部
２１  関数
２２  変数宣言部
２３  処理内容記述部
３１  メモリ
３２  ＣＰＵ
３３  デバックレジスタ
【図１】
2009259078.tif 000003
【図２】
2009259078.tif 000004
【図３】
2009259078.tif 000005
【図４】
2009259078.tif 000006
【図５】
2009259078.tif 000007
【図６】
2009259078.tif 000008