【文献】
江藤博明,依田邦和,propolice:スタックスマッシング攻撃検出手法の改良,情報処理学会論文誌,日本,社団法人情報処理学会,2002年12月15日,第43巻,第12号,p.4034-p.4041
(58)【調査した分野】(Int.Cl.,DB名)
主処理実行の前にメモリにプロセス空間を割り当てる機能を有し、戻り先が前記プロセス空間の任意の領域に戻ることができるリターン命令を含む処理を行うプロセッサにおいて、
前記プロセス空間内の第1の領域を特定する第1特定情報を取得する手段と、
前記第1特定情報を記憶する第1記憶手段と、
前記処理からリターン命令を予め検出するリターン命令検出手段と、
前記リターン命令によって戻される所を特定するアドレス情報を取得する手段と、
前記第1特定情報に基づき、前記アドレス情報により特定される所が前記第1の領域内にあるか否かを判定する手段と、
前記判定する手段が、前記特定される所が前記第1の領域内にあると判定した場合に、前記処理を中断する手段と、
を備えるプロセッサ。
主処理実行の前にメモリにプロセス空間を割り当てる機能を有し、戻り先が前記プロセス空間の任意の領域に戻ることができるリターン命令を含む処理を行うプロセッサに行わせる方法が実行可能なプログラムを、コンピュータを用いて作成する方法において、
前記プロセス空間内の第1の領域を特定する第1特定情報を取得するステップと、
前記第1特定情報を記憶するステップと、
前記処理からリターン命令を予め検出するステップと、
前記リターン命令によって戻される所を特定するアドレス情報を取得するステップと、
前記第1特定情報に基づき、前記アドレス情報により特定される所が前記第1の領域内にあるか否かを判定するステップと、
前記判定する手段が、前記特定される所が前記第1の領域内にあると判定した場合に、前記プロセッサが前記処理を中断するステップと、
を前記プロセッサに行わせるように、前記コンピュータが前記リターン命令を書き換えるステップを含む、
プログラム作成方法。
【発明を実施するための形態】
【0018】
本発明の実施形態について、図面を参照して説明する。
【0019】
まず、バッファオーバーフローとバッファオーバーフロー攻撃について説明する。
図1は、C言語により記述されたプログラムがコンピュータ上で動作する場合のプロセス空間の論理的な模式図である。プロセス空間とは、アドレス空間のうちプロセッサ内でのオペレーションシステムの処理によってプロセスに割り当てられた仮想的なアドレス空間をいう。また、アドレス空間とは、一連のメモリアドレスによってアクセス可能なメモリ空間をいう。
図1に示すように、プロセス空間は低位アドレスから高位アドレスへ、テキスト領域、静的領域、ヒープ領域、共有ライブラリ、スタック領域が確保される。テキスト領域には、機械語で翻訳されたプログラムが格納される。静的領域には、グローバル変数などの静的変数が格納される。ヒープ領域は、メモリの動的管理で用いられる。共有ライブラリには、複数のプログラムが共通して利用するライブラリが格納される。スタック領域には、関数の戻り値やローカル変数などの関数で一時的に使用されるデータが格納される。
なお、ここではC言語によりプログラムが記述された例を示したが、C言語と同様のメモリ操作を行う他の言語によって記述された場合も同じである。
【0020】
図2は、バッファオーバーフローによってリターンアドレスが不正なプログラムのコードのアドレスに書き換えられる例を示したスタック領域の模式図である。スタック領域には、ローカル変数などの関数で一時的に使用されるデータを格納するためにバッファ領域が確保されるが、プログラムの動作によってバッファ領域の上限をこえてデータが書き込まれるとバッファ領域以外のスタック領域のデータが上書きされる。これを、バッファオーバーフローという。
【0021】
バッファ領域に格納されるデータは、ファイルからの入力、ネットワークを経由しての入力、キーボードからの入力など、多くはプログラムの外部から読み込まれる。
図2に示すように、不正なプログラムを含むデータを外部からバッファ領域の上限をこえてバッファ領域に読み込ませることで意図的にバッファオーバーフローを生じさせることによりスタック領域に記憶されたリターンアドレスを書き換えて不正なプログラムを実行させることをバッファオーバーフロー攻撃という。
【0022】
リターンアドレスで指示される先は実行形式のプログラム又はライブラリであるので、
図1に説明したように、リターンアドレスはテキスト領域又は共有ライブラリの範囲でなければならない。
一方、バッファオーバーフロー攻撃によって書き換えられたリターンアドレスは本来プログラムが存在すべきではない領域を指示している。本来プログラムが存在すべきではないスタック領域に不正なプログラムが上書きされて実行される例を
図2に示す。
【0023】
本実施形態では、プロセス空間の各領域の開始アドレスと終了アドレスをメモリマップに示される情報から取得する。メモリマップとは、オペレーティングシステムのカーネルにおいてプロセスの状態を示すデータ構造の情報をマッピングしたファイルを指し、例えば、Linux(登録商標)では、/procディレクトリ配下にプロセスIDごとに存在する。
【0024】
図3は、Linux(登録商標)でのメモリマップの例である。符号aに開始アドレスが示され、符号bに終了アドレスが示される。
図1に示すように、スタック領域は、あるアドレスから最高位アドレスまでの連続した領域として設定される(符号f)。また、テキスト領域(符号d)と共有ライブラリ(符号e)は、いずれもアクセス権限(符号c)がr−x(読込可、書込不可、実行可)であることから識別ができる。
メモリマップによってプロセス空間の各領域の正確な開始アドレスと終了アドレスを得ることができるために処理の確実性が向上する。
以下、実施例では、オペレーションシステムとしてLinux(登録商標)を例として説明するが、メモリマップが取得できる他のオペレーションシステムによるものであってもよい。
【実施例1】
【0025】
本実施例は、テキスト領域又は共有ライブラリ以外の領域を第1の領域とした処理装置である。スタートアップルーチンを実行することでメモリマップを取得し、メモリマップに示される情報から取得したテキスト領域と共有ライブラリの開始アドレスと終了アドレスを格納する複数組の専用レジスタセットを有し、処理手段を実施する内部命令を有するプロセッサを備えることを特徴とする。
内部命令は、アセンブリ言語のよるリターン命令(RET命令)にニーモニックに対応する
図7に示す処理フローを実施する機械語命令である。なお、以下、実施例の記述においては、アセンブリ言語のよるリターン命令をRET命令と記述する。
【0026】
図4は、処理装置1の構成を示すブロック図である。本実施例に係るプロセッサ100は、汎用レジスタ121の他にテキスト領域と共有ライブラリの開始アドレスを格納する開始レジスタ123と終了アドレスを格納する終了レジスタ124の複数組からなる専用レジスタセット122を有する。
処理装置1は、図示しないが外部との入出力装置や記憶装置や表示装置などを含むことができる。
【0027】
次に、スタートアップルーチンについて説明する。
図5は、一般的なコンピュータにおいてハードウェアとアプリケーションプログラムを結び付けるカーネルの概念図である。例えば、アプリケーションプログラムがプロセッサにプログラムの実行を指示する際には、システムコールによってカーネルに処理が渡り、処理が終了すると処理を戻す(exit)。スタートアップルーチンはカーネルの一種で、アプリケーションプログラムの主処理の実行前にアプリケーションプログラムの実行ファイルにリンクされてスタックの設定やライブラリの初期化などを行う。
本実施例は、スタートアップルーチンによって、アプリケーションプログラムの主処理の実行前にメモリマップに示される情報からメモリ上のテキスト領域と共有ライブラリの開始アドレスと終了アドレスを取得されることを特徴とする。
【0028】
メモリマップに示される情報からテキスト領域と共有ライブラリの開始アドレスと終了アドレスを取得する処理ステップについて説明する。
図6は、
図4で示される処理装置1がスタートアップルーチンによりテキスト領域と共有ライブラリの開始アドレスと終了アドレスを取得する手順を示すフローチャートである。本実施例では、テキスト領域と共有ライブラリの開始アドレスと終了アドレスが第1特定情報である。
処理装置1は、アプリケーションプログラムの主処理の実行前にアプリケーションプログラムの実行ファイルにリンクされたスタートアップルーチンを実行することで、アプリケーションプログラムの実行ファイルのメモリマップを取得する(ステップS100)。メモリマップは開始アドレスの低位から高位へ昇順にソートする(ステップS110)。
メモリマップには
図3で示された情報が含まれている。メモリマップの先頭から順に判定を行う(ステップS120)。アクセス権限がr−x(読込可、書込不可、実行可)の場合にテキスト領域又は共有ライブラリと判定し(ステップS130)、開始アドレスと終了アドレスを同一の専用レジスタセット122にある開始レジスタ123と終了レジスタ124にそれぞれ格納する(ステップS140)。本実施例では、レジスタセットが第1記憶手段である。
【0029】
次に、
図7は、
図4に示されるプロセッサ100において、演算ユニット120が行う処理の手順を示すフローチャートである。戻り先がプロセス空間の任意の領域に戻ることができるRET命令の処理と比較すると、本実施例でのRET命令の処理には
図7のaで示される部分の処理が追加されている。
【0030】
次に、RET命令を検出し、その被演算子として指示されるリターンアドレスを取得する処理ステップについて説明する。
図4で示される処理装置1において、外部との入出力装置や記憶装置からロードされたアプリケーションプログラムは機械語に翻訳された実行命令としてメモリ150のテキスト領域に格納される。プロセッサ100の制御ユニット110では、フェッチ111により実行命令が取得されデコーダ112を経て演算ユニット120へ制御情報が送られる。この際、演算ユニット120がRET命令を検出した場合、RET命令の被演算子として指示されるリターンアドレスを取得する。
【0031】
次に、リターンアドレスがメモリ上のいずれの領域を指示しているか判定する処理ステップについて説明する。
図4で示される処理装置1の演算ユニット120が、RET命令の被演算子として指示されるリターンアドレスを取得(ステップS200)した後、同一の専用レジスタセット122にある開始レジスタ123と終了レジスタ124に格納されている開始アドレスと終了アドレスの範囲かどうかの判定(ステップS220)を行う。
【0032】
次に、リターンアドレスがメモリ上の不正な領域を指示している場合には不正なプログラムの実行を未然に阻止する処理ステップについて説明する。
リターンアドレスの指示先がテキスト領域又は共有ライブラリである場合はリターンアドレスにジャンプ(ステップS250)し、リターンアドレスの指示先がテキスト領域又は共有ライブラリ以外の領域(第1の領域)の場合はプログラムの実行を強制的に終了する(ステップS240)。リターンアドレスの指示先がテキスト領域又は共有ライブラリ以外の領域(第1の領域)の場合とは、リターンアドレスがテキスト領域の開始アドレス以上終了アドレス以下の範囲でも共有ライブラリの開始アドレス以上終了アドレス以下の範囲でもない場合である。
【0033】
以上の説明のとおり、本実施例によれば不正にリターンアドレスが書き換えられた場合に、リターンアドレスの指示先がテキスト領域又は共有ライブラリ以外の領域(第1の領域)の場合はプログラムの実行を強制的に終了することでバッファオーバーフローによる不正なプログラムの実行を防止することができる。
また、プロセッサの内部処理で行うために高速な処理が可能であるとともに、アプリケーションプログラム個別の修正作業が不要であり、プログラムの作成に使用される高級言語に依存しない。
【実施例2】
【0034】
本実施例は、スタック領域を第1の領域とした処理装置である。スタートアップルーチンを実行することでメモリマップを取得し、メモリマップに示される情報から取得したスタック領域の開始アドレスと終了アドレスを格納する一組の専用レジスタセットを有し、処理手段を実施する内部命令を有するプロセッサを備えることを特徴とする。
内部命令は、RET命令にニーモニックに対応する
図9に示す処理フローを実施する機械語命令である。
【0035】
図4は、処理装置1の構成を示すブロック図である。本実施例に係るプロセッサ100は、汎用レジスタ121の他にスタック領域の開始アドレスを格納する開始レジスタ123と終了アドレスを格納する終了レジスタ124の一組からなる専用レジスタセット122を有する。スタック領域はひとつの連続した領域なので専用レジスタセット122は一組で足りる。
処理装置1は、図示しないが外部との入出力装置や記憶装置や表示装置などを含むことができる。
【0036】
本実施例は、スタートアップルーチンによって、アプリケーションプログラムの主処理の実行前にメモリマップに示される情報からメモリ上のスタック領域の開始アドレスと終了アドレスを取得されることを特徴とする。
【0037】
メモリマップに示される情報からスタック領域の開始アドレスと終了アドレスを取得する処理ステップについて説明する。
図8は、
図4で示される処理装置1がスタートアップルーチンによりスタック領域の開始アドレスと終了アドレスを取得する手順を示すフローチャートである。
処理装置1は、アプリケーションプログラムの主処理の実行前にアプリケーションプログラムの実行ファイルにリンクされたスタートアップルーチンを実行することで、アプリケーションプログラムの実行ファイルのメモリマップを取得する(ステップS300)。メモリマップは開始アドレスの低位から高位へ昇順にソートする(ステップS310)。
メモリマップには
図3で示された情報が含まれている。メモリマップの先頭から順に判定を行う(ステップS320)。スタック領域は最高位アドレスまでの連続した領域として設定されるためにメモリマップの最終行を参照する(ステップS330)。終了アドレスを終了レジスタ124に格納する(ステップS330)。本実施例では、レジスタセットが第1記憶手段である。
処理装置1は、当該プロセスのスタックサイズ上限値を取得する(ステップS350)。Linux(登録商標)の場合はulimit−a(シェルスクリプトがbashの場合)などの命令で確認することができる。16進数の演算により得たスタック領域の終了アドレスからスタックサイズ上限値の差分値(スタック領域下限値)を開始レジスタ123にスタック領域の開始アドレスとして格納する(ステップS360)。
メモリマップに示された開始アドレスをそのまま開始レジスタ123に格納しないのはスタック領域のサイズは動的に変更されるが上限値をこえて変更されることはないためである。本実施例では、スタック領域のスタック領域下限値と終了アドレスが第1特定情報である。
【0038】
次に、
図9は、
図4に示されるプロセッサ100において、演算ユニット120が行う処理の手順を示すフローチャートである。戻り先がプロセス空間の任意の領域に戻ることができるRET命令の処理と比較すると、本実施例でのRET命令の処理には
図9のaで示される部分の処理が追加されている。
【0039】
次に、RET命令を検出し、その被演算子として指示されるリターンアドレスを取得する処理ステップについて説明する。
図4で示される処理装置1において、外部との入出力装置や記憶装置からロードされたアプリケーションプログラムは機械語に翻訳された実行命令としてメモリ150のテキスト領域に格納される。プロセッサ100の制御ユニット110では、フェッチ111により実行命令が取得されデコーダ112を経て演算ユニット120へ制御情報が送られる。この際、演算ユニット120がRET命令を検出した場合、RET命令の被演算子として指示されるリターンアドレスを取得する。
【0040】
次に、リターンアドレスがメモリ上のいずれの領域を指示しているか判定する処理ステップについて説明する。
処理装置1の演算ユニット120が、RET命令の被演算子として指示されるリターンアドレスを取得(ステップS400)した後、開始レジスタ123に格納されている開始アドレスとリターンアドレスの値の大小について判定(ステップS410)を行う。リターンアドレスがスタック領域下限値よりも大きい又は等しいならばスタック領域を指示していると判定する。
【0041】
次に、リターンアドレスがメモリ上の不正な領域を指示している場合には不正なプログラムの実行を未然に阻止する処理ステップについて説明する。
リターンアドレスがスタック領域下限値よりも小さければリターンアドレスにジャンプ(ステップS430)し、リターンアドレスがスタック領域下限値よりも大きい又は等しいならばプログラムの実行を強制的に終了する(ステップS420)。
【0042】
以上の説明のとおり、本実施例によれば不正にリターンアドレスが書き換えられた場合に、リターンアドレスの指示先がスタック領域である場合はプログラムの実行を強制的に終了することでバッファオーバーフローによる不正なプログラムの実行を防止することができる。
また、プロセッサの内部処理で行うために高速な処理が可能であるとともに、アプリケーションプログラム個別の修正作業が不要であり、プログラムの作成に使用される高級言語に依存しない。
実施例1と比べると、不正なプログラムがスタック領域に書き込まれている場合に限定されるが、専用レジスタセットが一組で足りるとの特徴を有する。
【実施例3】
【0043】
本実施例は、テキスト領域又は共有ライブラリ以外の領域を第1の領域とした処理装置である。本実施例は、バッファオーバーフローにより不正にリターンアドレスが書き換えられた場合には不正なプログラムの実行を未然に阻止するようにアプリケーションプログラムのアセンブリコードに命令を追加することを特徴とする。
【0044】
図10は、本実施例による処理装置3の構成を示すブロック図である。処理装置3は、プロセッサ300、メモリマップ取得部310、逆アセンブラ320、リターン命令検出部330、命令挿入部340、アセンブラ350、メモリ360を備えた装置である。
【0045】
本実施例はアプリケーションプログラムの実行ファイルが実行される前に動作する。
メモリマップ取得部310は、メモリマップに示される情報からテキスト領域と共有ライブラリの開始アドレスと終了アドレスを取得する。本実施例では、テキスト領域と共有ライブラリの開始アドレスと終了アドレスが第1特定情報である。
リターン命令検出部330は、RET命令を検出する。
命令挿入部340は、RET命令の被演算子として指示されるリターンアドレスを取得するためのリターンアドレス取得命令、リターンアドレスがメモリ上のいずれの領域を指示しているか判定するための判定命令、リターンアドレスがメモリ上の不正な領域を指示している場合には不正なプログラムの実行を未然に阻止する強制終了命令を挿入する。
【0046】
図11は、処理装置3においてメモリマップ取得部310がテキスト領域と共有ライブラリの開始アドレスと終了アドレスを取得する手順を示すフローチャートである。
【0047】
処理装置3は、実行しようとするアプリケーションプログラムの実行ファイルのメモリマップを取得する(ステップS500)。メモリマップは開始アドレスの低位から高位へ昇順にソートする(ステップS510)。メモリマップには
図3で示された情報が含まれている。メモリマップの先頭から順に判定を行う(ステップS520)。アクセス権限がr−x(読込可、書込不可、実行可)の場合にテキスト領域又は共有ライブラリと判定し(ステップS720)、リターンアドレスを保存するための領域をメモリ360に確保したうえで開始アドレスと終了アドレスを格納する(ステップS540)。本実施例では、メモリが第1記憶手段である。
【0048】
図12及び
図13は、逆アセンブラ320、リターン命令検出部330、命令挿入部340、アセンブラ350が行う処理の手順を示すフローチャートである。
処理装置3は、逆アセンブラ320によって対象となるアプリケーションプログラムを逆アセンブルする(ステップS600)。
その後、リターン命令検出部330ではRET命令かを判定する(ステップS620)。RET命令ならば命令挿入部340へ処理を渡す。
【0049】
処理装置3は、命令挿入部340ではアプリケーションプログラムのアセンブリコードのRET命令の前に次の3つの命令を挿入する。
まず、RET命令の被演算子として指示されるリターンアドレスを取得するリターンアドレス取得命令を挿入(ステップS630)する。
次に、リターンアドレスがテキスト領域又は共有ライブラリを指示しているかを判定する判定命令を挿入(ステップS640)する。
リターンアドレスがテキスト領域又は共有ライブラリを指示しているかの判定は、リターンアドレスがリターンアドレスを保存するための領域に格納されているテキスト領域及び共有ライブラリの開始アドレスと終了アドレスの範囲かどうかの判定による。
次に、リターンアドレスがテキスト領域又は共有ライブラリを指示していなければプログラムを強制的に終了する強制終了命令を挿入(ステップS650)する。リターンアドレスの指示先がテキスト領域又は共有ライブラリ以外の領域(第1の領域)の場合とは、リターンアドレスがテキスト領域の開始アドレス以上終了アドレス以下の範囲でも共有ライブラリの開始アドレス以上終了アドレス以下の範囲でもない場合である。
【0050】
図12に示す手順により命令挿入部340により命令が挿入される(ステップS640及びステップS650)ことで、テキスト領域が拡張されている。このため、
図13に示すように命令が挿入されたアセンブリコードをアセンブルにより実行ファイルとした後(ステップS700)、再度、逆アセンブルを行ったアセンブルコード(ステップS740)について再度取得したメモリマップから得たテキスト領域の開始アドレスと終了アドレスで更新を行う(ステップS750)。その後、アセンブラ350によってアセンブルして対象となるアプリケーションプログラムの実行ファイルを完成する(ステップS760)。
【0051】
以上の説明のとおり、本実施例によれば不正にリターンアドレスが書き換えられた場合に、リターンアドレスの指示先がテキスト領域と共有ライブラリのいずれでもない場合はプログラムの実行を強制的に終了するようにアプリケーションプログラムに命令を追加することでバッファオーバーフローによる不正なプログラムの実行を未然に防止することができるプログラムに変換する。
また、処理装置が、自動的にアセンブリコードへの命令追加を行うために、アプリケーションプログラム個別の修正作業が不要であり、プログラムの作成に使用される高級言語に依存しない。
【実施例4】
【0052】
本実施例は、スタック領域を第1の領域とした処理装置である。バッファオーバーフローにより不正にリターンアドレスが書き換えられた場合には不正なプログラムの実行を未然に阻止するようにアプリケーションプログラムのアセンブリコードに命令を追加することを特徴とする。
【0053】
図10は、本実施例による処理装置3の構成を示すブロック図である。処理装置3は、プロセッサ300、メモリマップ取得部310、逆アセンブラ320、リターン命令検出部330、命令挿入部340、アセンブラ350、メモリ360を備えた装置である。
【0054】
本実施例はアプリケーションプログラムの実行ファイルが実行される前に動作する。
メモリマップ取得部310は、メモリマップに示される情報からスタック領域の開始アドレスと終了アドレスを取得する。
リターン命令検出部330は、RET命令を検出する。
命令挿入部340は、RET命令の被演算子として指示されるリターンアドレスを取得するためのリターンアドレス取得命令、リターンアドレスがメモリ上のいずれの領域を指示しているか判定するための判定命令、リターンアドレスがメモリ上の不正な領域を指示している場合には不正なプログラムの実行を未然に阻止する強制終了命令を挿入する。
【0055】
図14は、処理装置3においてメモリマップ取得部310がスタック領域の開始アドレスと終了アドレスを取得する手順を示すフローチャートである。
処理装置3は、実行しようとするアプリケーションプログラムの実行ファイルのメモリマップを取得する(ステップS800)。メモリマップは開始アドレスの低位から高位へ昇順にソートする(ステップS810)。メモリマップには
図3で示された情報が含まれている。メモリマップの先頭から順に判定を行う(ステップS820)。スタック領域は最高位アドレスまでの連続した領域として設定されるためにメモリマップの最終行を参照する(ステップS830)。リターンアドレスを保存するための領域をメモリ360に確保したうえで終了アドレスを格納する(ステップS840)。
次に、処理装置3は、当該プロセスのスタックサイズ上限値を取得する(ステップS850)。Linux(登録商標)の場合はulimit−a(シェルスクリプトがbashの場合)などの命令で確認することができる。16進数の演算により得たスタック領域の終了アドレスからスタックサイズ上限値の差分値(スタック領域下限値)を保存するための領域をメモリ360に確保したうえで格納する(ステップS860)。本実施例では、メモリが第1記憶手段である。
メモリマップに示された開始アドレスをそのままリターンアドレスを保存するための領域に格納しないのはスタック領域のサイズは動的に変更されるが上限値をこえて変更されることはないためである。本実施例では、スタック領域のスタック領域下限値と終了アドレスが第1特定情報である。
【0056】
図15は、逆アセンブラ420、命令挿入部430、アセンブラ440が行う処理の手順を示すフローチャートである。
処理装置3は、逆アセンブラ420によって対象となるアプリケーションプログラムを逆アセンブルする(ステップS900)。
その後、リターン命令検出部330ではRET命令かを判定する(ステップS920)。RET命令ならば命令挿入部430へ処理を渡す。
処理装置3は、命令挿入部430ではアプリケーションプログラムのアセンブリコードのRET命令の前に次の3つの命令を挿入する。
まず、RET命令の被演算子として指示されるリターンアドレスを取得するリターンアドレス取得命令を挿入(ステップS930)する。
次に、リターンアドレスがスタック領域を指示しているかを判定する判定命令を挿入(ステップS940)する。
リターンアドレスがスタック領域を指示しているかの判定は、リターンアドレスがスタック領域下限値よりも大きい又は等しいならばリターンアドレスがスタック領域を指示していると判定する。
次に、リターンアドレスがスタック領域を指示していればプログラムを強制的に終了する強制終了命令を挿入(ステップS950)する。これにより、リターンアドレスがメモリ上の不正な領域を指示している場合には不正なプログラムの実行を未然に阻止する。
【0057】
以上の説明のとおり、本実施例によれば不正にリターンアドレスが書き換えられた場合に、リターンアドレスの指示先がスタック領域である場合はプログラムの実行を強制的に終了するようにアプリケーションプログラムに命令を追加することでバッファオーバーフローによる不正なプログラムの実行を未然に防止することができる。
また、処理装置が、自動的にアセンブリコードへの命令追加を行うために、アプリケーションプログラム個別の修正作業が不要であり、プログラムの作成に使用される高級言語に依存しない。
実施例3と比べると、不正なプログラムがスタック領域に書き込まれている場合に限定されるが、プログラムの実行サイズが小さいので更新処理が速いとの特徴を有する。
本発明は、メモリ上の各領域の開始アドレスと終了アドレスを取得し、アセンブリ言語によるリターン命令を検出し、その被演算子として指示されるリターンアドレスを取得し、リターンアドレスがメモリ上のいずれの領域