(57)【要約】【課題】スタックスマッシングを防止するバッファオーバーフロー検出を高速に行うマイクロプロセッサを提供する。【解決手段】手続き呼び出し動作で呼び出された手続きプログラムで戻り番地が保存される時に戻り番地と戻り番地の保存番地とを別途保存し、呼び出し元への戻り動作で戻り番地が読み出され時に、別途保存した戻り番地と値を比較して、不一致の場合にバッファオーバーフローが発生したことを検知するバッファオーバーフロー検出回路を付加する。【選択図】図１
2009230479.tif 000002
【特許請求の範囲】
【請求項１】
手続き呼び出し分岐命令を有し、呼び出し元への戻り番地をメモリに保存できるマイクロプロセッサであって、
前記呼び出し元への戻り番地を前記メモリに保存する保存動作を検出する保存検出手段と、
前記保存検出手段で検出された保存動作における戻り番地と、その戻り番地を保存する保存番地とを記憶する前記メモリとは異なる記憶手段と、
前記メモリの前記保存番地からの読み出し動作を検出する読み出し検出手段と、
前記読み出し検出手段で読み出し動作を検出した時に、前記メモリから読み出した戻り番地と前記記憶手段から読み出した戻り番地とを比較して、その比較内容が一致しない時にバッファオーバーフローが発生していることを検出するバッファオーバーフロー検出手段と
を有することを特徴とするマイクロプロセッサ。
【請求項２】
前記記憶手段は、前記保存番地をタグとし前記戻り番地をデータとする組をエントリとして記憶するＣＡＭメモリで構成されることを特徴とする請求項１に記載のマイクロプロセッサ。
【請求項３】
前記保存検出手段は、手続き呼び出し分岐命令実行後、レジスタの内容をメモリに保存させるストア命令で手続き呼び出し分岐命令において前記呼び出し元への戻り番地を記憶するレジスタの内容が前記メモリに保存されることを検出することを特徴とする請求項１に記載のマイクロプロセッサ。
【請求項４】
前記読み出し検出手段は、戻り番地と保存番地が前記記憶手段に記憶された後、メモリからレジスタにデータを読み出すロード命令の読み出し番地が前記記憶手段に記憶された保存番地と一致することを検出することを特徴とする請求項１に記載のマイクロプロセッサ。
【請求項５】
手続き呼び出し分岐命令を有し、呼び出し元への戻り番地をメモリに保存できるマイクロプロセッサであって、
手続き呼び出し分岐命令が実行される時に呼び出し元への戻り番地を保存するレジスタ識別情報を記憶するレジスタ識別情報記憶手段と、
前記手続き呼び出し分岐命令が実行された後に、ストア命令が実行される時に前記レジスタ識別情報記憶手段に記憶された前記レジスタ識別情報で識別されるレジスタに保存されていたデータがメモリに保存される場合に、保存番地と保存データとを同時に記憶する前記メモリとは異なる記憶手段と、
前記ストア命令が実行された後に、ロード命令が実行される時に前記記憶手段の前記保存番地より前記メモリから読み出されるデータと、前記記憶手段に同時に記憶された前記保存データとを比較して、その比較内容が一致しない時にバッファオーバーフローが発生していることを検出するバッファオーバーフロー検出手段と
を有することを特徴とするマイクロプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、スタックスマッシング攻撃によるバッファオーバーフロー発生を検出する技術に関する。
【背景技術】
【０００２】
近年、コンピュータシステムを使用者の意図しないように動作させて被害を与える悪質プログラムの存在が問題となっている。悪質プログラムを実行させる方法には、バッファオーバーフローを利用する方法があり、その中でも特に、スタックのオーバーフローを利用するスタックスマッシング（ｓｔａｃｋ  ｓｍａｓｈｉｎｇ）と呼ばれる方法が利用されることが多い。
【０００３】
スタックスマッシング発生の様子を、図８を用いて簡単に説明する。悪意プログラムによる手続きＸが呼び出された時、（ａ）に示すように通常の手続き呼び出し手順で行われるように、スタックポインタレジスタ（ＳＰ）とフレームポインタレジスタ（ＦＰ）を更新して、手続きＸ用のスタック領域が確保される。このスタック領域には、プロセッサのレジスタや処理において使用するデータなどが通常保存されている。そして、この手続きＸから新たな手続きＹを呼び出せるように、スタックポインタ（ＳＰ）＋２０のアドレスに手続きＸの呼び出し元への戻り番地（Ｒｅｔｕｒｎ Ａｄｄｒ．）が保存される。
【０００４】
しかし、手続きＸの処理プログラムの例えば入力データをデータバッファに保存する処理において、スタック領域に確保したデータバッファサイズ以上のデータが入力されると、入力データの数の上限の確認がなされていないシステム関数などが利用された場合、（ｂ）に示すようにデータバッファサイズを超えて書込みが行われる。
【０００５】
このようにすると、手続きＸの処理で最初に保存した手続き呼び出し元への戻り番地（Ｒｅｔｕｒｎ Ａｄｄｒ．）の情報は、あふれたデータで上書きされて、手続きＸの処理の終了段階で悪意プログラムが書き換えた戻り番地（Ｒｅｔｕｒｎ Ａｄｄｒ．）の命令を実行させるようすることができる。
【０００６】
この問題に対して、スタックに保存された戻り番地（Ｒｅｔｕｒｎ Ａｄｄｒ．）とスタック中の配列などのバッファ領域との間にガード変数を格納して、手続き呼び出し元への復帰動作時に、ガード変数の有効性を確認してから戻り番地を読み込むようにすることでスタックスマッシングを防止する技術がある（例えば、特許公報１参照。）。
【０００７】
また、コンピュータのプロセッサとキャッシュメモリに改造を加えて、手続きＸの呼び出し時に戻り番地（Ｒｅｔｕｒｎ Ａｄｄｒ．）をキャッシュメモリに書込む時に、同時にその複製（レプリカ）をキャッシュメモリ内に保存し、呼び出し元へのリターン時にメモリから読み出された戻り番地（Ｒｅｔｕｒｎ Ａｄｄｒ．）とレプリカデータとを比較回路で比較して、一致することを確認するようにしてスタックスマッシングを防止する技術がある（例えば、特許公報２参照。）。
【特許文献１】特開２００１−２１６１６１号公報
【特許文献２】特開２００５−３３８９４６号公報
【発明の開示】
【発明が解決しようとする課題】
【０００８】
しかしながら、ガード変数を用いソフトウェアによってバッファオーバーフローを検出する方法は、検出手順のプログラムコードを挿入できるようにした拡張コンパイラなどを用いることでソースプログラムの修正量を減少させることができるが、手続きＸの呼び出し時および呼び出し元へのリターン時に、戻り番地（Ｒｅｔｕｒｎ Ａｄｄｒ．）をチェックするための余分なプログラムコードが挿入されることに伴う実行時間のオーバーヘッドが生じるという問題がある。
【０００９】
また、プロセッサとキャッシュメモリの一部を改良しハードウェアによってバッファオーバーフローを検出する方法は、プログラムの再コンパイルの量を減少させるとともに、プログラム実行時間のオーバーヘッドが少なくなるが、手続きＸの呼び出しの繰り返しが多い時にも１００％の検出を維持するためには、キャッシュメモリに保存される戻り番地のレプリカデータの追い出しを生じさせないＷａｙ数の多いキャッシュメモリが必要となり、回路規模が増加する問題となる。回路規模の増加を抑制するため、Ｗａｙ数が少ないキャッシュメモリを使用する場合は、レプリカデータの記憶領域が不足してレプリカデータが追い出されて１００％の検出ができない問題がある。
【００１０】
本発明は、上記問題を解決するためになされたもので、実行時間のオーバーヘッドの少ないハードウェアによるバッファオーバーフロー検出を可能としながら、少ない付加回路規模で１００％のバッファオーバーフロー検出を実現するプロセッサを提供することを目的とする。
【課題を解決するための手段】
【００１１】
上記目的を達成するために、本発明のマイクロプロセッサは、手続き呼び出し分岐命令を有し、呼び出し元への戻り番地をメモリに保存できるマイクロプロセッサであって、前記呼び出し元への戻り番地を前記メモリに保存する保存動作を検出する保存検出手段と、前記保存検出手段で検出された保存動作における戻り番地と、その戻り番地を保存する保存番地とを記憶する前記メモリとは異なる記憶手段と、前記メモリの前記保存番地からの読み出し動作を検出する読み出し検出手段と、前記読み出し検出手段で読み出し動作を検出した時に、前記メモリから読み出した戻り番地と前記記憶手段から読み出した戻り番地とを比較して、その比較内容が一致しない時にバッファオーバーフローが発生していることを検出するバッファオーバーフロー検出手段とを有することを特徴とする。
【発明の効果】
【００１２】
本発明によれば、呼び出し元手続きへの復帰の際に、あらかじめスタック領域に保存された戻り番地と保護されたＣＡＭメモリ中に保存された戻り番地をハードウェアで比較することで、バッファオーバーフローの検出が可能となる。このバッファオーバーフロー検出の一連の処理で、ＣＡＭメモリ中のエントリの外部メモリへの退避処理、および外部メモリ中のエントリをＣＡＭメモリへ復帰処理についてプログラムによる処理が必要となるが、ＣＡＭメモリのエントリ数を最適化することで、プログラム支援を最小限にすることが可能であり、ガード変数などのソフトウェアプログラムによる検出手法よりも高速にバッファオーバーフローを検出することができる。
【００１３】
また、ＣＡＭメモリのエントリを容量の大きな外部メモリへ退避、復帰させることができるので、全てのバッファオーバーフロー検出が実現できる。
【００１４】
更にまた、対象となるスタック動作に係るプログラム部分を変更する必要がないので再コンパイルや再設計作業を減らすことができる。
【発明を実施するための最良の形態】
【００１５】
以下、本発明の実施例を説明する。
【実施例】
【００１６】
本発明に係るバッファオーバーフロー検出回路を有するマイクロプロセッサの実施例を、図１乃至図７を参照して説明する。
【００１７】
図１は、実施例に係るバッファオーバーフロー検出回路を有するマイクロプロセッサ１００とプログラムやデータを記憶する外部メモリ２００とを外部バス３００で接続されたコンピュータシステム１の主要な構成を示すブロック図である。コンピュータシステム１は、図示しないが標準的なコンピュータシステムに装備されるシステム外部との入出力装置や表示装置や記憶装置などを含むことができる。
【００１８】
図１に示すマイクロプロセッサ１００は、ＭＩＰＳアーキテクチャのプロセッサ部にバッファオーバーフロー検出回路４００を付加した構成となっている。このプロセッサ部は、ＣＰＵ制御回路１１０、命令レジスタ１２０、レジスタファイル１３０、バスインターフェースユニット１４０等で構成されている。バスインターフェースユニット１４０と外部メモリ２００とは、データバス３０２を介して互いに接続されてデータが送受され、アドレスバス３０１によりアドレスが送受される。なお、ブロック図の接続図が煩雑となるため、命令コード（データ）や一部のデータおよびアドレスの信号線ならびに制御線は図示を省略している。
【００１９】
バッファオーバーフロー検出回路４００は、命令レジスタ１２０に記憶され解釈される命令の種別を検出するロード・ストア・ＪＡＬ命令検出回路４１０と、バッファオーバーフロー検出回路４００の動作を制御し、プロセッサ部への割り込み動作によってバッファオーバーフローの発生を通知したりしてプロセッサ部との連係動作を開始させる制御回路４２０と、ＪＡＬ（Ｊｕｍｐ  Ａｎｄ  Ｌｉｎｋ）命令で分岐動作を行うとともに分岐元への戻り番地を記憶するレジスタ番号を保存するＲＲレジスタ４３０と、戻り番地を保存する番地を記憶する保存番地レジスタ４４０と、戻り番地を記憶する戻り番地レジスタ４５０と、保存番地をタグとしその保存番地と組となる戻り番地をデータとするエントリを複数記憶するＣＡＭ（Ｃｏｎｔｅｎｔ  Ａｄｄｒｅｓｓａｂｌｅ  Ｍｅｍｏｒｙ）メモリ５００と、戻り番地レジスタ４５０からの戻り番地とＣＡＭ５００より読み出された戻り番地のデータとを比較する比較回路５１０とから構成される。
【００２０】
ＣＰＵ制御回路１１０は、外部メモリ２００からインターフェースユニット１４０、データバス１３１を介して命令レジスタ１２０に読み込まれた命令を解読実行してマイクロプロセッサ１００の内部動作を制御するとともに、次に実行する命令の読み込み動作を制御してプログラムの実行順序を制御する。すなわち、解読された命令が分岐命令でなければ、ＣＰＵ制御回路１１０に内蔵され図示しないプログラムカウンタから出力されるアドレスをアドレスバス１１１に出力して、バスインターフェースユニット１４０を介してアドレスを外部メモリ２００に出力する。そして、外部メモリ２００の該当するアドレスから読み出された次の命令を命令レジスタ１２０に読み込む。
【００２１】
また例えば、命令レジスタ１２０にＳＷ命令（Ｓｔｏｒｅ  Ｗｏｒｄ：ストア・ワード［レジスタの１ワード長のデータをメモリに保存する命令］）が読み込まれていて、その命令が解読実行される場合、ＳＷ命令で指定されたレジスタファイル１３０のレジスタ（ソースレジスタ）からデータを読み出してデータバス１３１に出力する。同時に、ＣＰＵ制御回路１１０内において解読実行中の命令に含まれるアドレス情報やＳＷ命令で指定されたレジスタファイル１３０のレジスタから読み出されたデータから生成したアドレスをアドレスバス１１１に出力する。そして、それぞれのバス１３１，１１１に接続されたバスインターフェースユニット１４０を介して、外部アドレスバス３０１と外部データバス３０２に接続された外部メモリ２００の指定されたアドレスに当該データを書き込むように制御する。なお、データ演算を行う演算回路や、ＣＰＵ制御回路１１０及びプロセッサ部の各要素間を接続する制御／状態信号なども図示を省略している。また、説明の都合上プロセッサをＭＩＰＳアーキテクチャのプロセッサとしているが、他のアーキテクチャのプロセッサであっても良い。
【００２２】
次に、本発明のバッファオーバーフロー検出回路４００が対象とするスタックのバッファオーバーフローの検出動作を説明する。
【００２３】
図２は、実施例に係るバッファオーバーフロー検出回路４００の主要な制御処理手順を示すフローチャートである。図３は、Ｃ言語で記述された手続きＸの呼び出し（Ｐｒｏｃｅｄｕｒｅ  ｃａｌｌ）処理を含むソースプログラムの例を示すソースプログラムリストである。図４および図５は、図３のソースプログラムをコンパイラ（プログラム）でコンパイルして得られたアセンブリコードリストの一部である。図６は、ＭＩＰＳアーキテクチャプロセッサのレジスタの使用目的の慣例を示す表で、コンパイラなどが特別に指定されない時にレジスタの使用目的を標準的に割り付ける時に参照するものである。図７は、手続き呼び出しおよび呼び出し元への復帰動作時のスタック領域の使用状況の変化を示す図である。
【００２４】
実施例のバッファオーバーフロー検出回路４００の動作を説明する前に、図３のプログラムの実行において、スタック領域がどのように利用されるのかについて図７を用いて説明する。図３のプログラムは実施例説明のための簡単なＣプログラムの例であり、ｍａｉｎ関数からｋｅｉｓａｎ関数なる手続きＸの呼び出しが行われ、ｋｅｉｓａｎ関数の処理が終了すると、リターン命令によって手続きＸの呼び出し元のｍａｉｎ関数に処理が戻るプログラムである。
【００２５】
手続きＸの呼び出しの際、まず必要なスタック領域が確保された後、そのスタック領域に呼び出し元へのリターンアドレス（戻り番地）をセーブ（レジスタの内容を外部メモリにストア命令で書込み保存）する。呼び出された手続きの処理が行われた後、スタック領域にセーブされたリターンアドレスをロード（外部メモリから指定されたレジスタに読込む）し、スタック領域を開放し、ロードしたリターンアドレスへジャンプ（分岐）することで手続きＸの呼び出し元の関数へ戻ることになる。
【００２６】
以下、シェルプログラム（コンピュータシステムカーネルプログラムとユーザの間のインタープリタプログラム）が動作してアクセス可能なコンピュータシステムで、ユーザがｍａｉｎ関数のプログラムを起動させて、上述の一連の動作を行わせた時の実際のプログラムの流れで説明する。
【００２７】
まず、シェルプログラムから図５に示すｍａｉｎ関数が呼び出されるが、この時ｍａｉｎ関数で必要となるスタック領域が確保され、そのスタック領域に呼び出し元のシェルプログラムへのリターンアドレスが保存される。そのスタック領域の使用状況は、図７（ａ）のようになる。その後、ｍａｉｎ関数のＪＡＬ命令（図５の５Ａ行目）によりｋｅｉｓａｎ関数に対する手続きＸの呼び出しが実行される。図６に示すように、ＭＩＰＳアーキテクチャのプロセッサでは、３２個のレジスタの使用目的が慣例的に定められていて、このＪＡＬ命令実行において、命令で特別に指定しない限りレジスタ番号「３１」のレジスタにリターンアドレスが格納されると、図５のｋｅｉｓａｎ関数へジャンプする。
【００２８】
このｋｅｉｓａｎ関数の最初の部分では、まずｋｅｉｓａｎ関数用のスタック領域が確保され（図４の４Ａ行目）、さらに呼び出し元のｍａｉｎ関数へのリターンアドレスがそのスタック領域に保存される（図４の４Ｂ行目）。そして、スタック領域の使用状況は、図７（ｂ）のようになる。図４に示すｋｅｉｓａｎ関数の処理において、スタック領域に保存しておいたリターンアドレスがレジスタ番号「３１」のレジスタにロードされ（図４の４Ｃ行目）、ｋｅｉｓａｎ関数の最初に確保（図４の４Ａ行目）したスタック領域を開放（図４の４Ｄ行目）した後に、ジャンプ命令（図４の４Ｅ行目）を実行することで呼び出し元のｍａｉｎ関数へ戻る。この時の、スタック領域の使用状況は、図７（ｃ）のようになる。
【００２９】
図５のｍａｉｎ関数の処理においても同様に、スタック領域に保存しておいて呼び出し元のシェルスクリプトへのリターンアドレスをレジスタ番号「３１」のレジスタにロードした後に、スタック領域を開放してジャンプ命令を実行することで呼び出し元のシェルプログラムへ戻る。
【００３０】
上記のような手続きＸの呼び出し時、および呼び出し元への復帰時の処理を踏まえた上で、実施例のプロセッサ１００のバッファオーバーフロー検出回路４００の動作を説明する。
【００３１】
図２のフローチャートに示すように、まず、外部メモリ２００から命令レジスタ１２０に読み込まれた命令が、ＪＡＬ命令であるかロード・ストア・ＪＡＬ命令検出回路４１０を用いてモニターする（ステップＳ１００）。ＪＡＬ命令以外の命令の場合は、外部メモリ２００から命令レジスタ１２０に読み込まれた次の命令に対して、ステップＳ１００を繰り返し実行する。
【００３２】
ロード・ストア・ＪＡＬ命令検出回路４１０によってＪＡＬ命令であることを検出した時は、信号線４１１を介して制御回路４２０に通知されたＪＡＬ命令のｒｄ番号（ｒｄは、リターンアドレス（戻り番地）が格納されるレジスタの識別情報であるレジスタ番号。図４、図５のＪＡＬ命令はオペランドによる指定がないのでレジスタの使用目的の慣例どおりにレジスタ番号「３１」となる）を信号線４２１を介してＲＲレジスタ４３０に保存する（ステップＳ１１０）。
【００３３】
次に、命令レジスタ１２０に読み込まれた次の命令が、ＪＡＬ命令かまたはストア命令であるかをロード・ストア・ＪＡＬ命令検出回路４１０によってモニターする（ステップＳ１２０）。ＪＡＬ（分岐動作と分岐元への戻り番地をレジスタに保存する）命令かまたはストア（レジスタの内容をメモリに保存する）命令以外の命令の場合は、命令レジスタ１２０に読込まれた次の命令に対して、ステップＳ１２０を繰り返し実行する。そして、ＪＡＬ命令が検出された場合は、ステップＳ１１０に戻る。
【００３４】
一方、ストア命令が検出された場合は、ＲＲレジスタ４３０に保存されたレジスタ番号が信号線４３１を介してロード・ストア・ＪＡＬ命令検出回路４１０に入力されているので、ストア命令のソースレジスタ番号とＲＲレジスタ４３０に保存されたレジスタ番号が一致するかを調べる（ステップＳ１３０）。不一致の場合は、ステップＳ１２０に戻り、次に読み込まれる命令のモニターを行う。
【００３５】
レジスタ番号が一致した場合、ＣＰＵ制御回路１１０がアドレスバス１１１に出力したストア命令の指定するストアアドレスを制御回路４２０に入力する。制御回路４２０は、信号線４２２を介して保存番地レジスタ４４０に受信したストアアドレスを記憶させる。また、ストア命令で指定されてデータバス１３１に出力されたソースレジスタのデータ（リターンアドレス）を制御回路４２０に入力される。制御回路４２０は信号線４２３を介して戻り番地レジスタ４５０に受信したリターンアドレスを記憶させる（ステップＳ１４０）。
【００３６】
次に、保存番地レジスタ４４０に記憶された保存番地をタグとし、戻り番地レジスタ４５０に記憶された戻り番地をデータとするエントリをそれぞれ信号線４４１および信号線４５１を介してＣＡＭメモリ５００に書み込み記憶させる（ステップＳ１５０）。このＣＡＭメモリ５００にエントリ書込みステップＳ１５０において、ＣＡＭメモリ５００に書込み余地がない時、ＣＡＭメモリ５００は信号線５０２によって制御回路４２０にエントリＦＵＬＬ状態（Ｆ）であることを通知する。
【００３７】
これを受けて制御回路４２０は、ＣＡＭメモリ５００への書込み動作を停止して、信号線４２４を介してＣＰＵ制御回路１１０にエントリＦＵＬＬの割込みを通知する。ＣＰＵ制御回路１１０は、割込み通知を受け付けると、エントリＦＵＬＬの割込み処理プログラムを起動して、ＣＡＭエントリＲｅａｄ命令を実行することで、ＣＡＭメモリ５００の最も古いＣＡＭエントリを図示しないタグおよびデータレジスタに読み込んだ後、それを外部メモリ２００に退避させる。
【００３８】
このタグおよびデータレジスタにアクセスしてプロセッサ部のレジスタファイル１３０のレジスタとの間で読み書きする専用命令としては、ＭＩＰＳアーキテクチャの場合、ＣｏＰｒｏｃｅｓｓｏｒＭｏｖｅ命令（ｍｆｃ２）などが用いられる。割込み処理後、プロセッサ部は中断したプログラム処理を再開させ、制御回路４２０はＣＡＭメモリ５００へのエントリ書込みを行う。ちなみに、市販のマイクロプロセッサには、内蔵するＭＭＵ（Ｍｅｍｏｒｙ  Ｍａｎａｇｅｍｅｎｔ  Ｕｎｉｔ：メモリ管理ユニット）にＣＡＭメモリ技術を使用するものがあり、専用命令などを用いて内蔵するＣＡＭメモリへアクセスすることができる。
【００３９】
次に、命令レジスタ１２０に読み込まれた次の命令が、ＪＡＬ命令かまたはロード命令であるかをロード・ストア・ＪＡＬ命令検出回路４１０によってモニターする（ステップＳ１６０）。ＪＡＬ命令かまたはロード命令以外の命令の場合は、命令レジスタ１２０に読込まれた次の命令に対してステップＳ１６０を繰り返し実行する。
【００４０】
ＪＡＬ命令が検出された場合は、ステップＳ１１０に戻る。
【００４１】
ロード・ストア・ＪＡＬ命令検出回路４１０によってロード命令が検出された場合は、ＣＰＵ制御回路１１０が信号線１１１に出力したロード命令が指定するアクセスアドレスを制御回路４２０に入力する。そして、制御回路４２０は信号線４２２を介して保存番地レジスタ４４０にアドレスを記憶する。また、ロード命令で指定されたアクセスアドレスがＣＰＵ制御回路１１０から出力されてアドレスバス１１１を介してバスインターフェースユニット１４０に入力される。さらに、バスインターフェースユニット１４０からメモリアドレスバス３０１を介して外部メモリ２００に読み出しアクセスが行われる。そして外部メモリ２００から読み出された戻り番地がメモリデータバス３０２を介してバスインターフェースユニット１４０に入力され、バスインターフェースユニット１４０よりデータバス１３１を介して制御回路４２０に入力される。そして、制御回路４２０は信号線４２３を介して戻り番地レジスタ４５０に戻り番地を記憶させる。そうして、保存番地レジスタ４４０に記憶されたアクセスアドレスをタグとして、ＣＡＭメモリ５００へアクセスする（ステップＳ１７０）。
【００４２】
保存番地レジスタ４４０に記憶されたアクセスアドレスをタグとしたエントリがＣＡＭメモリ５００に存在しない（ヒットしない）場合は、ステップＳ１６０に戻る。
【００４３】
保存番地レジスタ４４０に記憶されたアクセスアドレスをタグとしたエントリがＣＡＭメモリ５００に存在した（ヒットした）場合は、ＣＡＭメモリ５００からヒットしたことが信号線５０２を介して制御回路４２０に通知される。制御回路４２０は、戻り番地レジスタ４５０の戻り番地とＣＡＭメモリ５００から読み出された戻り番地とをそれぞれ信号線４５２および信号線５０１を介して比較回路５１０に入力して、比較回路５１０で比較する（ステップＳ１８０）。
【００４４】
比較回路５１０の比較結果が一致した時は、スタック領域に保存された手続きＸの呼び出し元への戻り番地の書き換えがなく、手続きＸの呼び出し処理が正常に終了したことと判断できる。そして、比較回路５１０から出力される比較結果５１１を入力する制御回路４２０は、保存番地レジスタ４４０に記憶されたアクセスアドレスをタグとするエントリを無効化する処理を行って、ＣＡＭメモリ５００より一致したエントリを削除する（ステップＳ１９０）。このＣＡＭメモリ５００にエントリ削除ステップＳ１９０において、ＣＡＭメモリ５００のエントリが無くなる時、ＣＡＭメモリ５００は信号線５０２によって制御回路４２０にエントリＥＭＰＴＹ状態（Ｅ）であることを通知する。
【００４５】
制御回路４２０は、信号線４２４を介してＣＰＵ制御回路１１０にエントリＥＭＰＴＹの割込みを通知する。ＣＰＵ制御回路１１０は、割込み通知を受け付けると、エントリＥＭＰＴＹの割込みプログラムを起動して、外部メモリ２００に退避しているエントリの有無を調べる。そして、エントリが無い場合は割込みを終了し、エントリがある時は、外部メモリ２００からエントリを読み出して、ＣＡＭメモリ５００にエントリを書込んで、割込みプログラムを終了して、プロセッサ部が中断していた処理を再開させる。
【００４６】
次に、ＣＡＭメモリ５００に記憶された有効なエントリ数が「０」であるか調べる（ステップＳ２００）。エントリ数が「０」でない時は、ステップＳ１６０に戻り、エントリ数が「０」の時は、ステップＳ１００に戻る。
【００４７】
ステップＳ１８０において、比較回路５１０での比較結果が一致しない場合は、スタック領域に保存されていた戻り番地が書き換えられていることを示し、比較回路５１０から出力される比較結果５１１を受ける制御回路４２０は、信号線４２４を介してＣＰＵ制御回路１１０にバッファオーバーフロー検出割込みを行う（ステップＳ２１０）。
【００４８】
上述のようにバッファオーバーフロー検出回路４００は動作し、呼び出された手続きプログラムで呼び出し元へのリターンアドレスをスタック領域に保存する際に、ＣＡＭメモリ５００にもリターンアドレスを書込み保存する。
【００４９】
このＣＡＭメモリ５００中のリターンアドレスへのアクセスは、バッファオーバーフロー検出回路４００に組み込まれた制御手順に従って上述のように手続き呼び出し時および呼び出し元へのリターン時に行われるリターンアドレスへのアクセスと並列に行うように限定されるため、悪意プログラムなどによってスタックバッファオーバーフローのような操作を行うプログラムでは、リターンアドレスを改変することはできない。このようにＣＡＭメモリ５００中のリターンアドレスは保護されるので、呼び出し元手続きへの復帰の際に、あらかじめスタック領域に保存されたリターンアドレスとＣＡＭメモリ５００中に保存されたリターンアドレスを比較することで、バッファオーバーフローの検出が可能となる。
【００５０】
これら一連の処理で、ＣＡＭメモリ５００中のエントリの外部メモリ２００への退避処理、および外部メモリ２００中のエントリをＣＡＭメモリ５００へリストア（復帰処理）についてのみプロセッサが実行するソフトウェア（プログラム）の処理の介在が必要となるが、ＣＡＭメモリ５００のエントリ数を最適化することで、ソフトウェア支援を最小限にすることが可能であり、ガード変数などのソフトウェアプログラムによる検出手法よりも高速にバッファオーバーフローを検出することができる。
【００５１】
また、ＣＡＭメモリ５００のエントリを容量の大きな外部メモリへ退避、復帰させることができるので、１００％のバッファオーバーフロー検出が実現できる。更にまた、対象となるスタック動作に係るプログラム部分を変更する必要がないので再コンパイルや再設計作業を減らすことができる。
【００５２】
本発明は、上記実施例に限定されるものではなく、発明の要旨を逸脱しない範囲で、種々、変形して実施できることは勿論である。
【００５３】
例えば、保存番地と戻り番地（リターンアドレス）の組（エントリ）を記憶するＣＡＭメモリをＬＩＦＯ（Ｌａｓｔ−Ｉｎ  Ｆｉｒｓｔ−Ｏｕｔ）動作するＬＩＦＯメモリとすることができて、ストア命令を検出し、そのソースレジスタのレジスタ番号がＲＲ４３０に記憶されたレジスタ番号と一致した場合に、ストア命令のアクセスアドレスの保存番地と保存データの戻り番地の組をＬＩＦＯメモリに記憶するようにする。そして、ロード命令を検出し、そのアクセスアドレスがＬＩＦＯメモリに記憶された保存番地と一致した場合に、ロード命令で読み出されたデータがＬＩＦＯメモリに記憶された戻り番地と一致するかを調べ、不一致の場合にバッファオーバーフローが発生したことを検出するようにすることができる。保存番地レジスタ４４０とＬＩＦＯメモリの保存番地記憶部からの出力を比較する回路の追加などが必要となるが、メモリの構成がＣＡＭメモリに比べて簡単なＬＩＦＯメモリを使用することができる。
【図面の簡単な説明】
【００５４】
【図１】本発明に係るマイクロプロセッサの実施例の構成を示すブロック図。
【図２】本実施例のバッファオーバーフロー検出回路の主要な制御手順を示すフローチャート図。
【図３】ｍａｉｎおよびｋｅｉｓａｎ関数のソースプログラムのリスト。
【図４】ｋｅｉｓａｎ関数のアセンブリコードのリスト。
【図５】ｍａｉｎ関数のアセンブリコードのリスト（続き）。
【図６】ＭＩＰＳアーキテクチャプロセッサのレジスタの使用目的の慣例を示す表。
【図７】手続き呼び出しおよび呼び出し元への戻り動作時のスタック領域の使用状況を示す図。
【図８】バッファオーバーフロー操作によるスタックスマッシングの発生の様子を示す図。
【符号の説明】
【００５５】
１  コンピュータシステム
１００  マイクロプロセッサ
１１０  ＣＰＵ制御回路
１１１  アドレスバス
１２０  命令レジスタ
１３０  レジスタファイル
１３１  データバス
１４０  バスインターフェースユニット
２００  外部メモリ
３００  外部バス
３０１  外部アドレスバス
３０２  外部データバス
４００  バッファオーバーフロー検出回路
４１０  ロード・ストア・ＪＡＬ命令検出回路
４２０  制御回路
４３０  ＲＲレジスタ
４４０  保存番地レジスタ
４５０  戻り番地レジスタ
５００  ＣＡＭメモリ
５１０  比較回路
【図１】
2009230479.tif 000003
【図２】
2009230479.tif 000004
【図３】
2009230479.tif 000005
【図４】
2009230479.tif 000006
【図５】
2009230479.tif 000007
【図６】
2009230479.tif 000008
【図７】
2009230479.tif 000009
【図８】
2009230479.tif 000010