(57)【特許請求の範囲】
【請求項１】
変換対象であるプログラムに含まれる分岐命令のうち、当該分岐命令に対応する被演算子が示すジャンプ先のアドレスにジャンプすることを示す分岐命令を検出する検出部と、
前記プログラムに、機械語命令を記憶させるメモリ領域を示すアドレス範囲を記憶部に書き込む処理を示す命令文を挿入するアドレス範囲書き込み命令文挿入部と、
前記検出部によって検出された分岐命令が含まれる前記プログラムの箇所に、前記被演算子が示すジャンプ先のアドレスが前記記憶部に書き込まれたアドレス範囲内であるか否かを判定し、当該ジャンプ先のアドレスが前記記憶部に書き込まれたアドレス範囲内であれば当該分岐命令を実行し、当該ジャンプ先のアドレスが前記記憶部に書き込まれたアドレス範囲内でなければ当該分岐命令を実行しない処理を示す命令文を挿入する命令文挿入部と、
を備えることを特徴とする変換装置。
【請求項２】
前記命令文挿入部は、前記検出部が検出した分岐命令が含まれる前記プログラムの箇所に、前記検出部によって検出された分岐命令の被演算子が、共有ライブラリに含まれる関数を示すか否かを判定し、当該被演算子が、共有ライブラリに含まれる関数であれば当該分岐命令を実行し、当該被演算子が、共有ライブラリに含まれる関数でなければ当該分岐命令を実行しない処理を示す命令文を挿入する
ことを特徴とする請求項１に記載の変換装置。
【請求項３】
前記プログラムは、アセンブリプログラムである
ことを特徴とする請求項１又は請求項２に記載の変換装置。
【請求項４】
コンピュータを用いた変換方法であって、
前記コンピュータが備える検出部が、変換対象であるプログラムに含まれる分岐命令のうち、当該分岐命令に対応する被演算子が示すジャンプ先のアドレスにジャンプすることを示す分岐命令を検出するステップと、
前記コンピュータが備えるアドレス範囲書き込み命令文挿入部が、前記プログラムに、機械語命令を記憶させるメモリ領域を示すアドレス範囲を記憶部に書き込む処理を示す命令文を挿入するステップと、
前記コンピュータが備える命令文挿入部が、検出した分岐命令が含まれる前記プログラムの箇所に、前記被演算子が示すジャンプ先のアドレスが前記記憶部に書き込まれたアドレス範囲内であるか否かを判定し、当該ジャンプ先のアドレスが前記記憶部に書き込まれたアドレス範囲内であれば当該分岐命令を実行し、当該ジャンプ先のアドレスが前記記憶部に書き込まれたアドレス範囲内でなければ当該分岐命令を実行しない処理を示す命令文を挿入するステップと、
を備えることを特徴とする変換方法。
【請求項５】
コンピュータに、
変換対象であるプログラムに含まれる分岐命令のうち、当該分岐命令に対応する被演算子が示すジャンプ先のアドレスにジャンプすることを示す分岐命令を検出するステップと、
前記プログラムに、機械語命令を記憶させるメモリ領域を示すアドレス範囲を記憶部に書き込む処理を示す命令文を挿入するステップと、
検出した分岐命令が含まれる前記プログラムの箇所に、前記被演算子が示すジャンプ先のアドレスが前記記憶部に書き込まれたアドレス範囲内であるか否かを判定し、当該ジャンプ先のアドレスが前記記憶部に書き込まれたアドレス範囲内であれば当該分岐命令を実行し、当該ジャンプ先のアドレスが前記記憶部に書き込まれたアドレス範囲内でなければ当該分岐命令を実行しない処理を示す命令文を挿入するステップと、
を実行させる変換プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、バッファオーバーフローに対するセキュリティ技術に関する。
【背景技術】
【０００２】
コンピュータ上でプログラムが動作する際には、実行開始時にそのプログラムを実行するためのメモリ空間が確保される。このメモリ空間には、外部から入力されるデータを一時的に格納するための特別なメモリ領域が存在する。このメモリ領域はスタックやヒープという名称で呼ばれている。このメモリ領域を超えたデータがプログラムに対して入力され、そのメモリ領域に対して、プログラムが予め想定した範囲を超えてデータが記憶されることにより不正な動作を起こすバッファオーバーフローが知られている。バッファオーバーフローは、プログラムが実行を制御するために管理している特殊なアドレス自体を外部から上書きし、その書き換えられたアドレスが、同様に外部から入力された不正な動作を起こすデータを指し示すことにより発生する。すなわち、バッファオーバーフローは、プログラムの逐次実行では発生せず、必ず分岐命令に伴って発生する。このようなバッファオーバーフローが起きると、攻撃者によって用意された不正なプログラムがコンピュータ上で実行されたり、これによりコンピュータが乗っ取られたりすることがある。特許文献１には、ソースプログラムを解析し、このようなバッファオーバーフローの原因と考えられる箇所を検出することが記載されている。特許文献２には、バッファオーバーフローによる攻撃が発生した際に、バッファオーバーフローの原因と考えられる箇所を検出することが記載されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００６−３１３６３号公報
【特許文献２】特開２００６−５３７６０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、攻撃が発生した後にバッファオーバーフローの原因と考えられる箇所を検出する方法では、事後的な解決ができるとしても、未知の脆弱性を突かれる新たな攻撃を防ぐことはできない。ソースプログラムにおいてバッファオーバーフローの原因と考えられる箇所を検出する方法では、一般的に容易とはいえない脆弱性の回避方法をソースコードレベルで熟知していなければ適切な対策ができないこと等から、効率良く運用することは困難であった。そこで、より簡単に、より確実にバッファオーバーフローに対するセキュリティ対策を行うことが望ましい。
【０００５】
本発明は、このような状況に鑑みてなされたもので、バッファオーバーフローの発生を防ぐようにプログラムを変換する変換装置、変換方法、変換プログラムを提供する。
【課題を解決するための手段】
【０００６】
上述した課題を解決するために、本発明は、変換対象であるプログラムに含まれる分岐命令のうち、分岐命令に対応する被演算子が示すジャンプ先のアドレスにジャンプすることを示す分岐命令を検出する検出部と、プログラムに、機械語命令を記憶させるメモリ領域を示すアドレス範囲を記憶部に書き込む処理を示す命令文を挿入するアドレス範囲書き込み命令文挿入部と、検出部によって検出された分岐命令が含まれるプログラムの箇所に、被演算子が示すジャンプ先のアドレスが記憶部に書き込まれたアドレス範囲内であるか否かを判定し、ジャンプ先のアドレスが記憶部に書き込まれたアドレス範囲内であれば分岐命令を実行し、ジャンプ先のアドレスが記憶部に書き込まれたアドレス範囲内でなければ分岐命令を実行しない処理を示す命令文を挿入する命令文挿入部と、を備えることを特徴とする。
【０００８】
また、本発明は、命令文挿入部は、検出部が検出した分岐命令が含まれるプログラムの箇所に、検出部によって検出された分岐命令の被演算子が、共有ライブラリに含まれる関数を示すか否かを判定し、被演算子が、共有ライブラリに含まれる関数であれば分岐命令を実行し、被演算子が、共有ライブラリに含まれる関数でなければ分岐命令を実行しない処理を示す命令文を挿入することを特徴とする。
【０００９】
また、本発明は、プログラムは、アセンブリプログラムであることを特徴とする。
【００１０】
また、本発明は、コンピュータを用いた変換方法であって、コンピュータが備える検出部が、変換対象であるプログラムに含まれる分岐命令のうち、分岐命令に対応する被演算子が示すジャンプ先のアドレスにジャンプすることを示す分岐命令を検出するステップと、コンピュータが備えるアドレス範囲書き込み命令文挿入部が、プログラムに、機械語命令を記憶させるメモリ領域を示すアドレス範囲を記憶部に書き込む処理を示す命令文を挿入するステップと、コンピュータが備える命令文挿入部が、検出した分岐命令が含まれるプログラムの箇所に、被演算子が示すジャンプ先のアドレスが記憶部に書き込まれたアドレス範囲内であるか否かを判定し、ジャンプ先のアドレスが記憶部に書き込まれたアドレス範囲内であれば分岐命令を実行し、ジャンプ先のアドレスが記憶部に書き込まれたアドレス範囲内でなければ分岐命令を実行しない処理を示す命令文を挿入するステップと、を備えることを特徴とする変換方法である。
【００１１】
また、本発明は、コンピュータに、変換対象であるプログラムに含まれる分岐命令のうち、分岐命令に対応する被演算子が示すジャンプ先のアドレスにジャンプすることを示す分岐命令を検出するステップと、コンピュータが備えるアドレス範囲書き込み命令文挿入部が、プログラムに、機械語命令を記憶させるメモリ領域を示すアドレス範囲を記憶部に書き込む処理を示す命令文を挿入するステップと、検出した分岐命令が含まれるプログラムの箇所に、被演算子が示すジャンプ先のアドレスが記憶部に書き込まれたアドレス範囲内であるか否かを判定し、ジャンプ先のアドレスが記憶部に書き込まれたアドレス範囲内であれば分岐命令を実行し、ジャンプ先のアドレスが記憶部に書き込まれたアドレス範囲内でなければ分岐命令を実行しない処理を示す命令文を挿入するステップと、を実行させる変換プログラムである。
【発明の効果】
【００１２】
以上説明したように、本発明によれば、変換装置が、変換対象であるプログラムに含まれる分岐命令のうち、分岐命令に対応する被演算子が示すジャンプ先のアドレスにジャンプすることを示す分岐命令を検出する検出部と、検出部によって検出された分岐命令が含まれるプログラムの箇所に、ジャンプ先のアドレスが予め定められたアドレスであるか否かを判定し、ジャンプ先のアドレスが予め定められたアドレスであれば分岐命令を実行し、ジャンプ先のアドレスが予め定められたアドレスでなければ分岐命令を実行しない処理を示す命令文を挿入する命令文挿入部と、を備えるようにしたので、バッファオーバーフローの発生を防ぐようにプログラムを変換することができる。
【図面の簡単な説明】
【００１３】
【図１】本発明の一実施形態による変換装置の構成例を示すブロック図である。
【図２】本発明の一実施形態によるオブジェクトプログラムがコンピュータ上で動作する際にメモリ上に確保される領域の例を示す図である。
【図３】本発明の一実施形態によるオブジェクトプログラムに含まれるシンボルテーブルのデータ例を示す図である。
【図４】本発明の一実施形態による本実施形態による変換装置の動作例を示すフローチャートである。
【図５】本発明の一実施形態によるコンピュータにおいてオブジェクトプログラムが実行される際のデータの流れを示す図である。
【図６】本発明の一実施形態によって生成されたオブジェクトプログラムをコンピュータが実行する際の動作例を示すフローチャートである。
【発明を実施するための形態】
【００１４】
以下、本発明の一実施形態について、図面を参照して説明する。
図１は、本実施形態による変換装置１００の構成を示すブロック図である。変換装置１００は、記憶部１１０と、コンパイラ１２０と、プリアセンブラ１３０と、アセンブラ１４０とを備えたコンピュータ装置である。変換装置１００は、ソースプログラムをコンパイルしてアセンブリプログラムを生成し、アセンブリプログラムを変換して機械語（マシンコード）によるオブジェクトプログラムを生成する。ここでは、ソースプログラムはＣ言語で記述されたプログラムであるとして説明する。
【００１５】
ここで、オブジェクトプログラムがコンピュータ上で動作する際のメモリ操作について説明し、バッファオーバーフローの根本的な発生原因について説明する。図２は、一般的なオブジェクトプログラムがコンピュータ上で動作する際にメモリ上に確保される領域の例を示す図である。ここでは、「０ｘ００００００００」から「０ｘＦＦＦＦＦＦＦＦ」までのアドレスをもつ２ＧＢのメモリ上におけるアドレス空間の例を示している。メモリ上には、符号ａに示すカーネルモードのアドレス空間と、符号ｂに示すスタックセグメントと、符号ｃに示す共有ライブラリと、符号ｄに示すヒープセグメントと、符号ｅに示すデータセグメントと、符号ｆに示すテキストセグメントとのメモリ領域が確保される。
【００１６】
スタックセグメントには、自動変数等のデータが記憶される。記憶されるデータ量が予め割り当てられたメモリ領域よりも多くなると、アドレスが小さくなる方向に向かってスタックセグメントが拡張される。スタックセグメントには、プログラムに対する動的な入力値や、プログラムにおける子関数からのリターンアドレスが記憶される。
共有ライブラリには、プログラムの実行時に複数の関数から共有して利用されるユーザ独自の関数を実行するプログラム等が記憶される。
ヒープセグメントには、動的にメモリを割り付けることで動的変数を記憶することができ、アドレスが大きくなる方向に向かって領域が拡張される。
データセグメントには、静的変数、大域変数等のデータが記憶される。例えば、初期化なし静的変数であるＢＳＳ（block started by symbol）や、初期化あり静的変数であるデータ等が記憶される。
テキストセグメントには、機械語命令等が記憶される。
【００１７】
上述のように、プログラムにおける子関数からのリターンアドレスはスタックセグメントに記憶される。ここで、スタックセグメントは入力されるデータ量に応じて拡張される。このため、定められたデータ量を超えてデータが入力されると、入力されたデータによってリターンアドレスが上書きされることがある（バッファオーバーフロー）。そこで、攻撃対象のプログラムに対して大量のデータとともに不正なプログラムを入力してスタック上に記憶させておき、リターンアドレスを不正なプログラムが記憶されたアドレスに書き換えると、リターンアドレスに命令がジャンプした際に不正なプログラムが実行されることになる。
【００１８】
このように、バッファオーバーフローによる攻撃は、命令がジャンプした際のジャンプ先のアドレスが、本来プログラムが記憶されている領域ではないスタックセグメント等の領域内である場合に起きる。すなわち、本来プログラムが記憶されている領域は共有ライブラリとテキストセグメントとのいずれかであるため、命令がジャンプした際のジャンプ先のアドレスが、このいずれでもない場合には、不正な動作であると推定できる。そこで、本実施形態では、ソースプログラムをコンパイルして生成されたアセンブリプログラムを解析し、分岐命令のジャンプ先のアドレスが共有ライブラリとテキストセグメントとのいずれでもない場合にはプログラムの実行を強制終了させる命令文を挿入する。これにより、アセンブリプログラムをセキュアなアセンブリプログラムに変換する。このように変換したセキュアアセンブリプログラムをアセンブラにより機械語に変換し、オブジェクトプログラムを生成する。このようにして生成されたオブジェクトプログラムは、バッファオーバーフローによる攻撃を受けた際にはプログラムの実行を強制終了するため、不正なプログラムを実行することがない。以下、このようにアセンブリプログラムをセキュアアセンブリプログラムに変換する実施形態について、詳細に説明する。
【００１９】
図１に戻り、記憶部１１０には、ソースプログラムをオブジェクトプログラムに変換するために使用するデータが記憶される。例えば、記憶部１１０には、ソースプログラム（符号ａ）、アセンブリプログラム（符号ｂ）、セキュアアセンブリプログラム（符号ｃ）、オブジェクトプログラム（符号ｄ）等が記憶される。ここでは、ソースプログラムは予め記憶されているものとし、ソースプログラムに基づいて他のプログラムが生成され、記憶される。
【００２０】
コンパイラ１２０は、記憶部１１０に記憶されているソースプログラムを読み出し、読み出したソースプログラムに基づいてアセンブリプログラムを生成し、生成したアセンブリプログラムを記憶部１１０に記憶させる。アセンブリプログラムは、アセンブリ言語で書かれたプログラムである。
プリアセンブラ１３０は、コンパイラ１２０によって生成されて記憶部１１０に記憶されたアセンブリプログラムを読み出して変換し、セキュアアセンブリプログラムを生成して記憶部１１０に記憶させる。プリアセンブラ１３０は、アドレス範囲書き込み命令文挿入部１３１と、検出部１３２と、命令文挿入部１３３とを備えている。
【００２１】
アドレス範囲書き込み命令文挿入部１３１は、変換対象であるアセンブリプログラムに、機械語がテキストセグメントとして配置されるアドレス範囲を、記憶部である汎用レジスタに書き込む処理を示す第１の命令文を挿入する。具体的には、アドレス範囲書き込み命令文挿入部１３１は、図２において、符号Ａと符号Ｂとによって示されるような、テキストセグメントにおいて機械語が記憶されたアドレス範囲の上限値のアドレスと下限値のアドレスとを、汎用レジスタに書き込むための第１の命令文を自身の記憶領域に予め記憶しておき、アセンブリプログラムの冒頭部分に挿入する。このようなテキストセグメントのアドレス範囲は、プログラム実行開始時に決定される。ここで、機械語が記憶されたアドレス範囲の上限値のアドレスと下限値のアドレスは、例えばＵＮＩＸ（登録商標）オペレーティングシステムの場合は、プロセス毎に存在するｍｍ−ｓｔｒｕｃｔ構造体に格納されている。
【００２２】
検出部１３２は、変換対象であるアセンブリプログラムに含まれる分岐命令のうち、その分岐命令に対応する被演算子（オペランド）が示すジャンプ先のアドレスにジャンプすることを示す分岐命令を検出する。例えば、検出部１３２は、記憶部１１０に記憶されているアセンブリプログラムに含まれる命令文を一行ずつ読み出す。そして、読み出した命令文が予め定められた分岐命令であるか否かを判定する。予め定められた分岐命令とは、例えば、「ＪＭＰ」、「ＪＣＸＺ」、「ＪＥＣＸＺ」、「ＬＯＯＰ」、「ＣＡＬＬ」、「ＲＥＴ」等の分岐命令であり、検出部１３２は、このような分岐命令を予め自身の記憶領域に記憶しておく。このような分岐命令は、被演算子が対応付けられ、その被演算子が示すジャンプ先のアドレスにジャンプすることを示す命令文である。
【００２３】
命令文挿入部１３３は、検出部１３２によって検出された分岐命令が含まれるプログラムの箇所に、ジャンプ先のアドレスが予め定められたアドレスであるか否かを判定し、そのジャンプ先のアドレスが予め定められたアドレスであればその分岐命令を実行し、そのジャンプ先のアドレスが予め定められたアドレスでなければその分岐命令を実行しない処理を示す命令文を挿入する。
【００２４】
ここで、分岐命令に対応する被演算子は、ジャンプ先のアドレスを直接示す値である場合と、共有ライブラリに示される関数を示す文字列によって間接的にジャンプ先のアドレスを示す場合とが存在する。ここで、ジャンプ先のアドレスを直接示す値である場合は、上述のテキストセグメントに記憶されている命令にジャンプする場合である。一方、共有ライブラリに示される関数を示す文字列によって間接的にジャンプ先のアドレスを示す場合は、上述の共有ライブラリに記憶されている関数にジャンプする場合である。そこで、命令文挿入部１３３は、このようなふたつの場合を判定するふたつの命令文を挿入する。
【００２５】
すなわち、命令文挿入部１３３は、分岐命令に対応する被演算子が示すアドレスが、上述のアドレス範囲書き込み命令文挿入部１３１によって挿入された第１の命令文が実行されることによって汎用レジスタに書き込まれたアドレス範囲内であるか否かを判定し、その被演算子が示すアドレスが汎用レジスタに書き込まれたアドレス範囲内であればその分岐命令を実行し、その被演算子が示すアドレスが汎用レジスタに書き込まれたアドレス範囲内でなければその分岐命令を実行しない処理を示す第２の命令文を自身の記憶領域に予め記憶しておく。第２の命令文は、例えば被演算子が示すアドレスをＸとし、テキストセグメントのアドレス範囲の上限値をＡとし、下限値をＢとすると、「ＣＭＰ  Ａ＜Ｘ」と「ＣＭＰ  Ｂ＞Ｘ」とのような命令文である。命令文挿入部１３３は、この第２の命令文を、検出部１３２によって検出された分岐命令が含まれるプログラムの箇所に挿入する。ここで、命令文挿入部１３３が第２の命令文を挿入する箇所は、例えば検出部１３２によって検出された分岐命令の直前である。
【００２６】
また、命令文挿入部１３３は、分岐命令に対応する被演算子が、共有ライブラリに含まれる関数を示すか否かを判定し、その被演算子が、共有ライブラリに含まれる関数であればその分岐命令を実行し、その被演算子が、共有ライブラリに含まれる関数でなければその分岐命令を実行しない処理を示す第３の命令文を自身の記憶領域に予め記憶しておく。ここで、分岐命令に対応する被演算子が共有ライブラリに含まれる関数を示すか否かは、オブジェクトプログラムに含まれるシンボルテーブルを参照することにより判定できる。図３は、オブジェクトプログラムに含まれるシンボルテーブルのデータ例を示す図である。シンボルテーブルには、シンボル名と、データ型と、アドレスとが対応付けられて記憶される。シンボル名は、対象を示す記号であり、例えばユーザ関数を示す文字列が対応付けられる。データ型は、シンボル名が示す対象のデータ型である。アドレスは、シンボル名が示す対象が記憶されているメモリ上のアドレスである。命令文挿入部１３３は、このようなシンボルテーブルを参照して、分岐命令に対応する被演算子がシンボルテーブルに含まれるものであるか否かを判定する第３の命令文を、検出部１３２によって検出された分岐命令が含まれるプログラムの箇所に挿入する。命令文挿入部１３３が第３の命令文を挿入する箇所は、例えば検出部１３２によって検出された分岐命令の直前であり、第２の命令文の直後である。
【００２７】
また、命令文挿入部１３３は、上述の第２の命令文と第３の命令文とを挿入した箇所の直後に、第２の命令文に基づく処理によって被演算子が示すアドレスがテキストセグメント内でないと判定され、かつ第３の命令文に基づく処理によって被演算子が示す関数が共有ライブラリに含まれないと判定された場合に、プログラムの実行を強制終了させる第４の命令文を挿入する。
【００２８】
アセンブラ１４０は、プリアセンブラ１３０によって生成されて記憶部１１０に記憶されたセキュアアセンブリプログラムを読み出し、機械語によるオブジェクトプログラムを生成する。
【００２９】
次に、図面を参照して、本実施形態による変換装置１００の動作例を説明する。図４は、本実施形態による変換装置１００の動作例を示すフローチャートである。
ここでは、ソースプログラムに基づいてコンパイラ１２０によってアセンブリプログラムが生成され、記憶部１１０に記憶されているものとする。プリアセンブラ１３０は、記憶部１１０に記憶されている変換対象のアセンブリプログラムを読み出す（ステップＳ１）。アドレス範囲書き込み命令文挿入部１３１は、読み出したアセンブリプログラムの冒頭部分に、アドレス範囲書き込み命令文である第１の命令文を挿入する（ステップＳ２）。
【００３０】
そして、検出部１３２は、アセンブリプログラムに含まれる命令文を一行ずつ読み出す（ステップＳ３）。検出部１３２は、読み出した命令文が定められた分岐命令であるか否かを判定する（ステップＳ４）。検出部１３２は、読み出した命令文が定められた分岐命令でないと判定すると（ステップＳ４：ＮＯ）、ステップＳ７に進む。検出部１３２が、読み出した命令文が定められた分岐命令であると判定すると（ステップＳ４：ＹＥＳ）、命令文挿入部１３３が、その分岐命令に対応する被演算子が示すアドレスはテキストセグメント内であるか否かを判定する第２の命令文を挿入する（ステップＳ５）。また、命令文挿入部１３３は、被演算子が示す文字列がシンボルテーブルに含まれるか否かを判定する第３の命令文を挿入する（ステップＳ６）。さらに、命令文挿入部１３３は、第２の命令文と第３の命令文との後に第４の命令文を挿入する。プリアセンブラ１３０が読み出したアセンブリプログラムに含まれる全ての命令文についてステップＳ３からステップＳ６の処理を行っていなければ、ステップＳ７に戻る。アセンブリプログラムに含まれる全ての命令文についてステップＳ３からステップＳ６の処理を行うと、命令文挿入部１３３は、命令文を挿入したセキュアアセンブリプログラムを、記憶部１１０に記憶させる。アセンブラ１４０は、記憶部１１０に記憶されたセキュアアセンブリプログラムに基づいて、オブジェクトプログラムを生成し、記憶部１１０に記憶させる。
【００３１】
次に、このように生成されたオブジェクトプログラムが実行する際の動作例を説明する。図５は、コンピュータ２００においてオブジェクトプログラムが実行される際のデータの流れを示す図である。符号ａに示すオブジェクトプログラムが、符号ｂに示すメモリ上にロードされ実行されると、符号ｃに示すＣＰＵによって命令が実行され、メモリ上のデータが更新される。例えば、符号ｄに示す制御ユニットが、メモリ上のテキストセグメントから命令文を読み出し（フェッチ）、読み出した命令文を解析し（デコード）、符号ｄに示す演算ユニットが、解析された命令を実行する。命令の実行の際には、メモリからデータが読み出されて符号ｆに示す汎用レジスタに書き込まれ、符号ｇに示す演算器によって演算される。演算結果は汎用レジスタに書き込まれ、メモリに記憶される。
【００３２】
図６は、本実施形態の変換装置１００によって生成されたオブジェクトプログラムをコンピュータ２００が実行する際の動作例を示すフローチャートである。
コンピュータ２００は、ディスクに記憶されているオブジェクトプログラムをメモリ上に読み出すと、制御ユニットが、オブジェクトプログラムに含まれる第１の命令文に基づく処理を実行し、テキストセグメントのアドレス範囲を示す値を汎用レジスタに書き込む。また、制御ユニットは、オブジェクトプログラムに含まれる命令を読み出し（ステップＳ１１）、読み出す命令が定められた分岐命令でなければ（ステップＳ１２：ＮＯ）、プリアセンブラ１３０によって命令文は挿入されていないため、通常のデコード処理を行い（ステップＳ１６）、演算ユニットが演算する。
【００３３】
制御ユニットが読み出す命令が定められた分岐命令であれば（ステップＳ１２：ＹＥＳ）、プリアセンブラ１３０によって挿入された第２の命令文に基づいて、被演算子が示すアドレスと汎用レジスタに記憶されたアドレス範囲とを比較することにより、被演算子が示すアドレスがテキストセグメント内か否かを判定する（ステップＳ１３）。被演算子が示すアドレスがテキストセグメント内であると判定すると（ステップＳ１３：ＹＥＳ）、ステップＳ１６に進む。
【００３４】
被演算子が示すアドレスがテキストセグメント内でないと判定すると（ステップＳ１３：ＮＯ）、プリアセンブラ１３０によって挿入された第３の命令文に基づいて、被演算子が示す文字列がシンボルテーブルに含まれるか否かを判定する（ステップＳ１４）。被演算子が示す文字列がシンボルテーブルに含まれると判定すると（ステップＳ１４：ＹＥＳ）、ステップＳ１６に進む。被演算子が示す文字列がシンボルテーブルに含まれないと判定すると（ステップＳ１４：ＮＯ）、プリアセンブラ１３０によって挿入された第４の命令文に基づいて、処理を強制終了する（ステップＳ１５）。
【００３５】
なお、本実施形態では、変換対象のソースプログラムはＣ言語によって記述されたものである例を示したが、Ｃ＋＋等、上述のようにメモリを使用する他の言語によって記述されたものであってもよい。
【００３６】
また、本実施形態では、アドレス範囲書き込み命令文挿入部１３１が、プリアセンブラの冒頭部分に第１の命令文を挿入する例を示した。ただし、テキストセグメントのアドレス範囲は、分岐命令が実行される前までに汎用レジスタに書き込まれていればよいため、検出部１３２が最初に検出した分岐命令文の直前に挿入することもできる。
【００３７】
また、本実施形態では、第２の命令文の後に第３の命令文を挿入する例を示したが、第３の命令文の後に第２の命令文を挿入してもよい。また、第２の命令文と第３の命令文とのいずれかのみを挿入することによっても、セキュリティを向上することができる。
また、本実施形態では、アセンブリプログラムに対して、ジャンプ先のアドレスが予め定められたアドレスでなければプログラムの実行を強制終了する第４の命令文を挿入する例を示したが、第４の命令文には、さらにその時点の実行時のメモリ状態やジャンプ先のアドレスの値等をログファイル等に記憶させる処理を含ませることもできる。このようにすれば、どのような攻撃がされたかを事後的に解析することを支援できる。
【００３８】
また、本実施形態において説明したようなプリアセンブラ１３０の機能は、統合開発環境（IDE：Integrated Development Environment）等の開発ツールにおいてソースプログラムからオブジェクトプログラムを生成する過程に組み込むことにより、従来の開発環境に効率良く利用することができる。
【００３９】
以上説明したように、本実施形態の変換装置１００によれば、定められたアドレスに記憶されたアドレスではないアドレスの命令を実行しようとすると処理の実行を強制終了するため、バッファオーバーフローによる攻撃を防ぐことができる。これにより、バッファオーバーフローについて、ソースプログラムのバグの問題として捉えるのではなく、外部から与えられた不正アドレスへのジャンプという本質的な問題として捉え、不正アドレスへのジャンプ時に処理を強制終了させることができる。
【００４０】
なお、本発明における処理部の機能を実現するためのプログラムをコンピュータ読み取り可能な記録媒体に記録して、この記録媒体に記録されたプログラムをコンピュータシステムに読み込ませ、実行することによりアセンブリプログラムの変換を行ってもよい。なお、ここでいう「コンピュータシステム」とは、ＯＳや周辺機器等のハードウェアを含むものとする。また、「コンピュータシステム」は、ホームページ提供環境（あるいは表示環境）を備えたＷＷＷシステムも含むものとする。また、「コンピュータ読み取り可能な記録媒体」とは、フレキシブルディスク、光磁気ディスク、ＲＯＭ、ＣＤ−ＲＯＭ等の可搬媒体、コンピュータシステムに内蔵されるハードディスク等の記憶装置のことをいう。さらに「コンピュータ読み取り可能な記録媒体」とは、インターネット等のネットワークや電話回線等の通信回線を介してプログラムが送信された場合のサーバやクライアントとなるコンピュータシステム内部の揮発性メモリ（ＲＡＭ）のように、一定時間プログラムを保持しているものも含むものとする。
【００４１】
また、上記プログラムは、このプログラムを記憶装置等に格納したコンピュータシステムから、伝送媒体を介して、あるいは、伝送媒体中の伝送波により他のコンピュータシステムに伝送されてもよい。ここで、プログラムを伝送する「伝送媒体」は、インターネット等のネットワーク（通信網）や電話回線等の通信回線（通信線）のように情報を伝送する機能を有する媒体のことをいう。また、上記プログラムは、前述した機能の一部を実現するためのものであっても良い。さらに、前述した機能をコンピュータシステムにすでに記録されているプログラムとの組み合わせで実現できるもの、いわゆる差分ファイル（差分プログラム）であっても良い。
【符号の説明】
【００４２】
１００  変換装置
１１０  記憶部
１２０  コンパイラ
１３０  プリアセンブラ
１３１  アドレス範囲書き込み命令文挿入部
１３２  検出部
１３３  命令文挿入部
１４０  アセンブラ
【図１】
0005820754.tif 000002
【図２】
0005820754.tif 000003
【図３】
0005820754.tif 000004
【図４】
0005820754.tif 000005
【図５】
0005820754.tif 000006
【図６】
0005820754.tif 000007