(57)【要約】【課題】ベースポインタの不正な書き換えを検出することができるマイクロプロセッサを提供する。【解決手段】メインメモリに格納されたプログラムのコードを実行し、コードに含まれる関数を呼び出す際に、関数の呼び出し時点におけるプログラムカウンタの値であるプログラムカウンタ値を第１のプログラムカウンタ値として、関数の呼び出し時点におけるベースポインタの値であるベースポインタ値を第１のベースポインタ値としてメインメモリ上に保持し、ベースポインタ値を第２のベースポインタ値として保存領域に保持し、関数からの戻り処理を実行する際に、第１のプログラムカウンタ値、及び第１のベースポインタ値を、命令レジスタ群にリストアする命令実行手段と、戻り処理の開始後に第１のベースポインタ値と第２のベースポインタ値との第１の比較を実行する比較処理手段とを備える。【選択図】      図１
2015115052.tif 000002
【特許請求の範囲】
【請求項１】
スタックポインタ、ベースポインタ、及びプログラムカウンタを含む命令レジスタ群と、
値を一時的に保持する保存領域と、
メインメモリに格納されたプログラムのコードを実行し、前記コードに含まれる関数を呼び出す際に、前記関数の呼び出し時点における前記プログラムカウンタの値であるプログラムカウンタ値を第１のプログラムカウンタ値として、前記関数の呼び出し時点における前記ベースポインタの値であるベースポインタ値を第１のベースポインタ値として前記メインメモリ上に保持し、前記ベースポインタ値を第２のベースポインタ値として前記保存領域に保持し、前記関数からの戻り処理を実行する際に、前記第１のプログラムカウンタ値、及び前記第１のベースポインタ値を、前記命令レジスタ群にリストアする命令実行手段と、
前記戻り処理の開始後に前記第１のベースポインタ値と前記第２のベースポインタ値との第１の比較を実行する比較処理手段と、
を備えることを特徴とするマイクロプロセッサ。
【請求項２】
前記第１の比較の結果が前記第１のベースポインタ値と前記第２のベースポインタ値との不一致を示すとき、前記第１のベースポインタ値の不正な書き換えに対する第１の異常対策処理を実行する異常処理手段
を更に備えることを特徴とする請求項１に記載のマイクロプロセッサ。
【請求項３】
前記命令実行手段は、前記関数を呼び出す際に、前記プログラムカウンタ値を第２のプログラムカウンタ値として前記保存領域に更に保持し、
前記比較処理手段は、前記戻り処理の開始後に前記第１のプログラムカウンタ値と前記第２のプログラムカウンタ値との第２の比較を更に実行する
ことを特徴とする請求項１又は２に記載のマイクロプロセッサ。
【請求項４】
前記異常処理手段は、前記第２の比較の結果が前記第１のプログラムカウンタ値と前記第２のプログラムカウンタ値との不一致を示すとき、前記第１のプログラムカウンタ値の不正な書き換えに対する第２の異常対策処理を更に実行する
ことを特徴とする請求項３に記載のマイクロプロセッサ。
【請求項５】
前記第１の異常対応処理は、前記メインメモリに関する情報を含むログ情報の保存処理、又は前記関数に対応するプロセス若しくは前記関数に対応するプロセスの親プロセスの再起動を含む
ことを特徴とする請求項２に記載のマイクロプロセッサ。
【請求項６】
前記第２の異常対応処理は、前記メインメモリに関する情報を含むログ情報の保存処理、又は前記関数に対応するプロセス若しくは前記関数に対応するプロセスの親プロセスの再起動を含む
ことを特徴とする請求項４に記載のマイクロプロセッサ。
【請求項７】
メインメモリと、
スタックポインタ、ベースポインタ、及びプログラムカウンタを含む命令レジスタ群、値を一時的に保持する保存領域、前記メインメモリに格納されたプログラムのコードを実行し、前記コードに含まれる関数を呼び出す際に、前記関数の呼び出し時点における前記プログラムカウンタの値であるプログラムカウンタ値を第１のプログラムカウンタ値として、前記関数の呼び出し時点における前記ベースポインタの値であるベースポインタ値を第１のベースポインタ値として前記メインメモリ上に保持し、前記ベースポインタ値を第２のベースポインタ値として前記保存領域に保持し、前記関数からの戻り処理を実行する際に、前記第１のプログラムカウンタ値、及び前記第１のベースポインタ値を、前記命令レジスタ群にリストアする命令実行手段、並びに前記戻り処理の開始後に前記第１のベースポインタ値と前記第２のベースポインタ値との第１の比較を実行する比較処理手段を含むマイクロプロセッサと、
を備えることを特徴とするコンピュータ。
【請求項８】
メインメモリに格納されたプログラムのコードを実行し、前記コードに含まれる関数を呼び出す際に、前記関数の呼び出し時点におけるプログラムカウンタの値であるプログラムカウンタ値を第１のプログラムカウンタ値として、前記関数の呼び出し時点におけるベースポインタの値であるベースポインタ値を第１のベースポインタ値を前記メインメモリ上に保持し、
前記ベースポインタ値を第２のベースポインタ値として保存領域に保持し、
前記関数からの戻り処理を実行する際に、前記第１のプログラムカウンタ値、及び前記第１のベースポインタ値を、前記スタックポインタ、前記ベースポインタ、及び前記プログラムカウンタを含む命令レジスタ群にリストアし、
前記の戻り処理の開始後に前記第１のベースポインタ値と前記第２のベースポインタ値との第１の比較を実行する
ことを特徴とする異常対応方法。
【請求項９】
スタックポインタ、ベースポインタ、及びプログラムカウンタを含む命令レジスタ群、並びに値を一時的に保持する保存領域と、メインメモリに格納されたプログラムのコードを実行し、前記コードに含まれる関数を呼び出す際に、前記関数の呼び出し時点における前記プログラムカウンタの値であるプログラムカウンタ値を第１のプログラムカウンタ値として、前記関数の呼び出し時点における前記ベースポインタの値であるベースポインタ値を第１のベースポインタ値として前記メインメモリ上に保持し、前記ベースポインタ値を第２のベースポインタ値として前記保存領域に保持し、前記関数からの戻り処理を実行する際に、前記第１のプログラムカウンタ値、及び前記第１のベースポインタ値を、前記命令レジスタ群にリストアする命令実行手段と、前記戻り処理の開始後に前記第１のベースポインタ値と前記第２のベースポインタ値との第１の比較を実行する比較処理手段とを備えたマイクロプロセッサと、メインメモリを備えるコンピュータを、
前記第１の比較の結果が前記第１のベースポインタ値と前記第２のベースポインタ値との不一致を示すとき、前記第１のベースポインタ値の不正な書き換えに対する第１の異常対策処理を実行する異常処理手段と、
して機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ベースポインタの不正な書き換えを検出するマイクロプロセッサ、コンピュータ、異常対応方法、及び異常対策プログラムに関する。
【背景技術】
【０００２】
バッファオーバーフロー（バッファオーバーラン）とは、脆弱性を有するプログラムの実行において、バッファ領域（入力データを一時的に蓄える記憶領域）として設定されるアドレス範囲を超えるメモリが上書きされ、誤動作が引き起こされる現象である。「脆弱性を有する」とは、入力データの量がバッファ領域の容量以下であることの検査が行われないために、プログラムの実行中に、異常状態を引き起こす可能性があることを意味する。
【０００３】
入力データの量を検査しないことに起因する脆弱性を有するプログラムは、プログラムの入力として想定よりも大きな（大量の）データが入力されると、入力データをバッファ領域を超えてメモリに書き込む（バッファオーバーフロー）可能性がある。その結果、脆弱性を有するプログラムは、例えば、オーバーフローした入力データを命令コードとして実行したりして、誤動作を引き起こす可能性がある。
【０００４】
ＣＰＵ（Central Processing Unit）には、以下のような記憶手段（レジスタ）を有するものがある。
（１）スタックポインタ（ＳＰ：Stack Pointer）
スタックポインタは、コールスタック（スタック領域）の先頭位置のデータが格納された、メモリ上の領域のアドレスを格納するレジスタである。コールスタックは、プログラムの実行中にサブルーチンに関する情報が格納されるメモリ上の領域である。スタック領域の先頭位置にデータ（データはアドレスであってもよい）を追加する操作を「ＰＵＳＨ」という。スタックポインタの値は、ＰＵＳＨにより最後に追加されたデータが格納された領域のアドレスに更新される。最後にＰＵＳＨされたデータを、スタック領域の先頭位置から取り出し、スタック領域から削除する操作を「ＰＯＰ」という。スタックポインタの値は、ＰＯＰによりスタック領域の先頭位置から取り出されたデータの、ＰＵＳＨ前のスタックポインタの値（ＰＯＰにより先頭位置になったデータが格納された領域のアドレス）に更新される。コールスタックにおいて、１つのサブルーチンの情報が格納されるメモリ上の領域をスタックフレームという。
（２）プログラムカウンタ（ＰＣ：Program Counter）
プログラムカウンタ（「インストラクションポインタ」（Instruction Pointer）ともいう。）は、次に実行すべき命令のアドレスを指すレジスタである。ＣＰＵが命令の読み込みを行なうと、プログラムカウンタの内容がアドレスバス上に出力され、読み取った命令コードのワード分だけプログラムカウンタの値が増加する。ＣＰＵの分岐命令では、プログラムカウンタに分岐先のアドレス値が代入される。プログラムカウンタの内容をコールスタックに一時保存した後に、サブルーチンの先頭アドレス値が代入されることにより、サブルーチンの呼出しが実現される。コールスタックに一時保存されたプログラムカウンタの値（リターンアドレス）を取り出してプログラムカウンタにリストアすると、サブルーチンから呼出し元のプログラム実行への復帰が実現される。
【０００５】
一般的なＣＰＵは、プログラムのコード領域とデータ領域を区別せず、データ領域に格納されたコードを実行する。このようなＣＰＵ上で実行されるプログラムは、例えば、スタック領域に格納された、サブルーチンのリターンアドレスが、バッファオーバーフローにより上書きされる可能性がある。何故なら、入力データを格納するバッファ領域としてスタック領域のメモリが割り当てられ、同じくスタック領域に保持されるリターンアドレスの値が、バッファオーバーフローにより入力データに上書きされる可能性があるからである。更に、スタック領域の特定の領域が入力データに含まれる不正なコードにより上書きされ、リターンアドレスの値が特定の領域を指すように上書きされると、ＣＰＵが不正なコードを実行させられる可能性がある。
【０００６】
バッファオーバーフローの発生を検出するマイクロプロセッサの一例が、特許文献１に開示されている。特許文献１のマイクロプロセッサは、外部メモリに接続され、バッファオーバーフロー検出回路を含む。バッファオーバーフロー検出回路は、ＣＡＭ（Content Addressable Memory）メモリを含む。
【０００７】
特許文献１のマイクロプロセッサのバッファオーバーフロー検出回路は、以下のように動作する。
【０００８】
バッファオーバーフロー検出回路は、外部メモリから命令レジスタに読み込まれたＪＡＬ命令（分岐命令の一種）のリターンアドレスが格納されるレジスタ番号を記憶する。
【０００９】
バッファオーバーフロー検出回路は、外部メモリから命令レジスタに読み込まれたストア命令のソースレジスタ番号と、記憶されたレジスタ番号とが一致するときは、ストア命令が指定する保存番地をタグとし、戻り番地をデータとするエントリをＣＡＭメモリに記憶する。
【００１０】
バッファオーバーフロー検出回路は、外部メモリから命令レジスタに読み込まれたロード命令が指定するアクセスアドレスをタグとして、ＣＡＭメモリへアクセスする。
【００１１】
バッファオーバーフロー検出回路は、アクセスアドレスをタグとしたエントリがＣＡＭメモリに存在するものの、保存番地に記憶された戻り番地とＣＡＭメモリから読み出された戻り番地とが一致しない場合は、バッファオーバーフローが発生したと判定する。
【００１２】
上記の動作の結果、特許文献１のマイクロプロセッサは、バッファオーバーフローの発生を検出する。
【先行技術文献】
【特許文献】
【００１３】
【特許文献１】特開２００９−２３０４７９号公報（第４−９ページ、図１−２）
【発明の概要】
【発明が解決しようとする課題】
【００１４】
ＣＰＵには、スタックポインタ及びプログラムカウンタに加えて、ベースポインタ（ＢＰ：Base Pointer）というレジスタを有するものがある。
【００１５】
ベースポインタは、コールスタック中の各データにアクセスする際に起点となるアドレス（ベースアドレス）を格納するレジスタである。コールスタック中の各データは、ベースポインタの値（例えば、現在のスタックフレームの先頭アドレス）、及びベースアドレスからのオフセット（例えば、現在のスタックフレームの先頭アドレスからのオフセット）を利用して指定される。
【００１６】
ベースポインタを有するＣＰＵでは、サブルーチンの呼び出しの際にベースアドレスのコールスタックへの一時保存が行われ、サブルーチンからの復帰の際にベースアドレスのコールスタックからの復旧が行われる。
【００１７】
ＣＰＵの命令には、操作対象であるメモリ上の領域をオペランド（命令の引数）で指定するものがある。オペランドによるアドレスの指定方法には、「アドレッシングモード」と呼ばれる複数の方式がある。ＣＰＵの分岐命令のアドレッシングモードには、例えば、以下のような方法がある。
ａ）直接アドレッシング
分岐命令のオペランドとして直接アドレスが指定される。この方法では、指定された直接アドレスが実効アドレスである。
ｂ）相対アドレッシング
分岐命令のオペランドとしてオフセット（ディスプレースメント）が指定される。この方法では、ベースポインタの値（ベースアドレス）にオフセットが加算された値が実効アドレスである。
【００１８】
上記ｂ）の場合には、たとえ、スタック領域に格納されたリターンアドレスが不正に上書きされなくても、スタック領域に格納されたベースアドレスが不正に上書きされると、異常な状態を引き起こす可能性がある。
【００１９】
例えば、ＣＰＵが、サブルーチンからの復帰後に、相対アドレッシングを用いた分岐命令を実行する場合について説明する。リターンアドレスは正しい値なので、ＣＰＵは命令種別としては正しい分岐命令を実行する。ところが、ベースアドレスが不正な値なので、ＣＰＵはオペランドであるオフセットに対応する不正な実効アドレスに対して分岐命令を実行するからである。
【００２０】
更に、スタック領域の特定の領域が入力データに含まれる不正なコードにより上書きされ、ベースアドレスの値が、ベースアドレスとオフセットとの組み合わせが特定の領域を指すように上書きされると、ＣＰＵが不正なコードを実行させられる可能性がある。
【００２１】
特許文献１のマイクロプロセッサは、ベースアドレスが書き換えられていないことは検証しない。従って、特許文献１のマイクロプロセッサでは、ベースポインタの不正な書き換えを検出できないという問題がある。
【００２２】
特許文献１のマイクロプロセッサの目的はバッファオーバーフローの発生を検出することである。したがって、ベースポインタの不正な書き換えを検出することができない。ベースポインタの不正な書き換えが発生すると、上述の通り、ＣＰＵが不正な命令を実行したり、ＣＰＵが不正なコードを実行させられたりするといった問題が発生する。
（発明の目的）
本発明の目的は、ベースポインタの不正な書き換えを検出することができるマイクロプロセッサ、コンピュータ、方法、及びプログラムを提供することにある。
【００２３】
特許文献１のマイクロプロセッサの目的はバッファオーバーフローの発生を検出することである。したがって、ベースポインタの不正な書き換えを検出することができない。ベースポインタの不正な書き換えが発生すると、上述の通り、ＣＰＵが不正な命令を実行するといった問題が発生する。
【課題を解決するための手段】
【００２４】
本発明のマイクロプロセッサは、スタックポインタ、ベースポインタ、及びプログラムカウンタを含む命令レジスタ群と、値を一時的に保持する保存領域と、メインメモリに格納されたプログラムのコードを実行し、コードに含まれる関数を呼び出す際に、関数の呼び出し時点におけるプログラムカウンタの値であるプログラムカウンタ値を第１のプログラムカウンタ値として、関数の呼び出し時点におけるベースポインタの値であるベースポインタ値を第１のベースポインタ値としてメインメモリ上に保持し、ベースポインタ値を第２のベースポインタ値として保存領域に保持し、関数からの戻り処理を実行する際に、第１のプログラムカウンタ値、及び第１のベースポインタ値を、命令レジスタ群にリストアする命令実行手段と、戻り処理の開始後に第１のベースポインタ値と第２のベースポインタ値との第１の比較を実行する比較処理手段と、を備えることを特徴とする。
【００２５】
本発明のコンピュータは、メインメモリと、スタックポインタ、ベースポインタ、及びプログラムカウンタを含む命令レジスタ群、値を一時的に保持する保存領域、メインメモリに格納されたプログラムのコードを実行し、コードに含まれる関数を呼び出す際に、関数の呼び出し時点におけるプログラムカウンタの値であるプログラムカウンタ値を第１のプログラムカウンタ値として、関数の呼び出し時点におけるベースポインタの値であるベースポインタ値を第１のベースポインタ値としてメインメモリ上に保持し、ベースポインタ値を第２のベースポインタ値として保存領域に保持し、関数からの戻り処理を実行する際に、第１のプログラムカウンタ値、及び第１のベースポインタ値を、命令レジスタ群にリストアする命令実行手段、並びに戻り処理の開始後に第１のベースポインタ値と第２のベースポインタ値との第１の比較を実行する比較処理手段を含むマイクロプロセッサと、を備えることを特徴とする。
【００２６】
本発明の異常対応方法は、メインメモリに格納されたプログラムのコードを実行し、コードに含まれる関数を呼び出す際に、関数の呼び出し時点におけるプログラムカウンタの値であるプログラムカウンタ値を第１のプログラムカウンタ値として、関数の呼び出し時点におけるベースポインタの値であるベースポインタ値を第１のベースポインタ値をメインメモリ上に保持し、ベースポインタ値を第２のベースポインタ値として保存領域に保持し、関数からの戻り処理を実行する際に、第１のプログラムカウンタ値、及び第１のベースポインタ値を、スタックポインタ、ベースポインタ、及びプログラムカウンタを含む命令レジスタ群にリストアし、の戻り処理の開始後に第１のベースポインタ値と第２のベースポインタ値との第１の比較を実行することを特徴とする。
【００２７】
本発明の異常対策プログラムは、スタックポインタ、ベースポインタ、及びプログラムカウンタを含む命令レジスタ群、並びに値を一時的に保持する保存領域と、メインメモリに格納されたプログラムのコードを実行し、コードに含まれる関数を呼び出す際に、関数の呼び出し時点におけるプログラムカウンタの値であるプログラムカウンタ値を第１のプログラムカウンタ値として、関数の呼び出し時点におけるベースポインタの値であるベースポインタ値を第１のベースポインタ値としてメインメモリ上に保持し、ベースポインタ値を第２のベースポインタ値として保存領域に保持し、関数からの戻り処理を実行する際に、第１のプログラムカウンタ値、及び第１のベースポインタ値を、命令レジスタ群にリストアする命令実行手段と、戻り処理の開始後に第１のベースポインタ値と第２のベースポインタ値との第１の比較を実行する比較処理手段とを備えたマイクロプロセッサと、メインメモリを備えるコンピュータを、第１の比較の結果が第１のベースポインタ値と第２のベースポインタ値との不一致を示すとき、第１のベースポインタ値の不正な書き換えに対する第１の異常対策処理を実行する異常処理手段として機能させることを特徴とする。
【発明の効果】
【００２８】
本発明によれば、ベースポインタの不正な書き換えを検出することができるという効果がある。
【図面の簡単な説明】
【００２９】
【図１】本発明の第１の実施形態におけるマイクロプロセッサの構成の一例を示すブロック図である。
【図２】本発明の第１の実施形態におけるマイクロプロセッサの動作を示すフローチャートである。
【図３】本発明の第１の実施形態におけるマイクロプロセッサの処理手順の具体例を説明するための図である。
【図４】本発明の第２の実施形態におけるマイクロプロセッサの構成の一例を示すブロック図である。
【図５】本発明の第２の実施形態におけるマイクロプロセッサを含むコンピュータのハードウェア構成の一例を示すブロック図である。
【図６】本発明の第２の実施形態におけるマイクロプロセッサの動作を示すフローチャートである。
【図７】本の第２の実施形態におけるマイクロプロセッサの処理手順の具体例を説明するための図である。
【発明を実施するための形態】
【００３０】
以下、本発明の実施形態について図面を参照して詳細に説明する。尚、すべての図面において、同等の構成要素には同じ符号を付し、適宜説明を省略する。
（第１の実施形態）
図１は、本実施形態におけるマイクロプロセッサ１００の構成の一例を示すブロック図である。
【００３１】
マイクロプロセッサ１００は、外部のメインメモリ２００に接続される。
【００３２】
マイクロプロセッサ１００は、命令レジスタ群１２０と、保存領域１３０と、命令実行手段１１０と、比較処理手段１４０とを含む。
【００３３】
命令レジスタ群１２０は、マイクロプロセッサ１００が内蔵する、用途が異なる複数のレジスタ（記憶手段）を含む。複数のレジスタには、スタックポインタ、ベースポインタ、プログラムカウンタ等が含まれる。
【００３４】
保存領域１３０は、１つ以上の、ベースポインタ等のレジスタの値を一時的に保持する。
【００３５】
命令実行手段１１０は、命令レジスタ群１２０に設定された値に基づいて、外部のメインメモリ２００に格納されたプログラムのコードを実行する。命令実行手段１１０は、コードに含まれるサブルーチン（関数）を呼び出す際に、リターンアドレス（関数の呼び出し時点におけるプログラムカウンタ）、及びベースアドレス（関数の呼び出し時点におけるベースポインタの値）等をメインメモリ２００上のスタック領域にプッシュすることにより保存する。さらに、ベースアドレスについては、保存領域１３０へも保存する。
【００３６】
命令実行手段１１０は、コードに含まれる関数からの戻り処理を実行する際に、メインメモリ２００上のスタック領域にプッシュされた、リターンアドレス、及びベースアドレス等を、ポップすることにより読み出し、命令レジスタ群１２０にリストアする
比較処理手段１４０は、命令レジスタ群１２０に保持されているベースアドレスと保存領域１３０に保持されているベースアドレスを比較し、ベースポインタの不正な書き換えを検出する。
【００３７】
次に、本実施形態の動作を説明する。
【００３８】
図２は、本実施形態におけるマイクロプロセッサ１００の動作を示すフローチャートである。図２は、マイクロプロセッサ１００が、関数Ａの処理の実行中に関数Ｂの処理を呼び出し、関数Ｂの処理を実行し、関数Ａの処理に復帰する際の動作を示す。
【００３９】
命令実行手段１１０は、関数Ａの処理の実行中に、関数Ｂの処理を呼び出す（ステップＳ１１）。
【００４０】
命令実行手段１１０は、最後の関数Ｂの呼び出しに対応するベースポインタ（以降、「ＢＰ１」という。）の値を保存領域１３０に保存する（ステップＳ１２）。
【００４１】
命令実行手段１１０は、リターンアドレス、及びベースポインタ（ここでのプッシュ対象のベースポインタを、以降、「ＢＰ２」という。）の値をメインメモリ２００上のスタック領域にプッシュすることにより保存する（ステップＳ１３）。命令実行手段１１０は、更に、関数Ｂのアドレスの値をメインメモリ２００上のスタック領域にプッシュすることにより保存してもよい。
【００４２】
命令実行手段１１０は、関数Ｂの処理を実行する（ステップＳ１４）。
【００４３】
命令実行手段１１０は、関数Ｂからの戻り処理を開始する（ステップＳ１５）。
【００４４】
命令実行手段１１０は、メインメモリ２００上のスタック領域にプッシュされた、リターンアドレス、及びベースアドレスをポップすることにより読み出し、命令レジスタ群１２０にリストアする（ステップＳ２６）。
【００４５】
比較処理手段１４０は、命令レジスタ群１２０にリストアされたＢＰ２の値が、保存領域１３０に保存されたＢＰ１の値と一致するか否か判定する（ステップＳ１７）。比較処理手段１４０は、判定後に、保存領域１３０に保存されたＢＰ１の値を削除する。
【００４６】
命令レジスタ群１２０にリストアされたＢＰ２の値が、ＢＰ１の値と一致すれば（ステップＳ１８：Ｙｅｓ）、命令実行手段１１０は、関数Ｂからの戻り処理を継続する（関数Ｂから関数Ａに制御を戻す）（ステップＳ１９）。
【００４７】
ＢＰ２の値が、ＢＰ１の値と一致しなければ（ステップＳ１８：Ｎｏ）、比較処理手段１４０は、スタック領域が異常状態にあるものと判定し、関数Ａ及び関数Ｂを含むコードの処理を中断する（ステップＳ２０）。
【００４８】
次に、本実施形態の処理手順の具体例を説明する。
【００４９】
図３は、本実施形態におけるマイクロプロセッサ１００の処理手順の具体例を説明するための図である。
【００５０】
まず、本実施形態におけるマイクロプロセッサ１００の処理手順の具体例を説明するための前提について説明する。
（前提１）命令実行手段１１０は、ベースポインタとプログラムカウンタ（リターンアドレスがリストアされるレジスタ）との組が指し示すコードを実行する。
（前提２）関数Ａは、関数ｍａｉｎにより呼び出される。関数Ｂは、関数Ａにより呼び出される。
【００５１】
以上が、前提についての説明である。
【００５２】
関数Ａの処理の実行中には、命令実行手段１１０により、ベースポインタ３６２の値は、保存領域１３０に保存されている（ステップＳ１２）。
【００５３】
関数Ａの処理の実行中には、命令実行手段１１０により、リターンアドレス２６３、及びベースポインタ２６２の値は、メインメモリ２００上のスタック領域にプッシュすることにより保存されている（ステップＳ１３）。
【００５４】
命令実行手段１１０は、関数Ａの処理の実行中に、関数Ｂの処理を呼び出す（ステップＳ１１）。
【００５５】
命令実行手段１１０は、ベースポインタ３５２の値を保存領域１３０に保存する（ステップＳ１２）。
【００５６】
命令実行手段１１０は、リターンアドレス２５３、及びベースポインタ２５２の値をメインメモリ２００上のスタック領域にプッシュすることにより保存する（ステップＳ１３）。
【００５７】
命令実行手段１１０は、関数Ｂの処理を実行する（ステップＳ１４）。
【００５８】
ここで、メインメモリ２００のスタック領域に含まれる、ベースアドレスが格納された領域２５２において、不正な書き換えが発生するものとする。例えば、外部から、マイクロプロセッサ１００に対して何らかのノイズが印加されることがある。ここでは、ノイズの印加により、領域２５２に格納されたベースアドレスが、書き換えられるものとする。
【００５９】
命令実行手段１１０は、関数Ｂからの戻り処理を開始する（ステップＳ１５）。
【００６０】
命令実行手段１１０は、メインメモリ２００上のスタック領域にプッシュされた、リターンアドレス２５３、及び書き換えられたベースポインタ２５２の値をポップすることにより読み出し、命令レジスタ群１２０にリストアする（ステップＳ１６）。
【００６１】
比較処理手段１４０は、命令レジスタ群１２０にリストアされたベースポインタ２５２（ＢＰ２）の値が、保存領域１３０に保存されたベースポインタ３５２（ＢＰ１）の値と一致するか否か判定する（ステップＳ１７）。比較処理手段１４０は、判定後に、保存領域１３０に保存されたＢＰ１の値を削除する。
【００６２】
命令レジスタ群１２０にリストアされたＢＰ２の値が書き換えられた場合は、ＢＰ１の値と一致しないので（ステップＳ１８：Ｎｏ）、比較処理手段１４０は、スタック領域が異常状態にあるものと判定し、関数Ａ及び関数Ｂを含むコードの処理を中断する。する（ステップＳ２０）。
【００６３】
以上説明したように、本実施形態におけるマイクロプロセッサ１００では、スタック領域に格納された、サブルーチン呼び出し時のベースアドレスが上書きされていないことを検証する。従って、本実施形態におけるマイクロプロセッサ１００は、ベースポインタの不正な書き換えを検出することができる。
（第２の実施形態）
本実施形態の説明においては、第１の実施形態と本実施形態とで共通する説明は省略し、第１の実施形態に対する本実施形態の相違点のみについて説明する。
【００６４】
図４は、本実施形態におけるマイクロプロセッサ１０５の構成の一例を示すブロック図である。
【００６５】
本実施形態におけるマイクロプロセッサ１０５は、異常処理手段１５０を更に含む。
【００６６】
異常処理手段１５０は、スタック領域の異常状態、又は異常状態に起因する異常動作を回避するための異常対策処理を実行する。例えば、異常処理手段１５０は、コードの処理を中断する。
【００６７】
本実施形態におけるマイクロプロセッサ１０５のその他の構成は、第１の実施形態におけるマイクロプロセッサ１００の構成と同じであるが、動作が異なる。
【００６８】
図５は、本実施形態におけるマイクロプロセッサを含むコンピュータのハードウェア構成の一例を示すブロック図である。
【００６９】
コンピュータ１１は、記憶装置１２と、マイクロプロセッサ（ＣＰＵ：Central Processing Unit）１３と、キーボード１４と、モニタ１５と、Ｉ／Ｏ（Input/Output）１８とを備え、これらが内部バス１６で接続されている。ＣＰＵ１３は、マイクロプロセッサ１０５である。記憶装置１２は、異常処理手段１５０等のＣＰＵ１３の動作プログラムを格納する。ＣＰＵ１３は、コンピュータ１１全体を制御し、記憶装置１２に格納された動作プログラムを実行し、Ｉ／Ｏ１８を介して異常処理手段１５０等のプログラムの実行やデータの送受信を行なう。なお、上記のコンピュータ１１の内部構成は一例である。コンピュータ１１は、ＣＰＵ１３、記憶装置１２、及びＩ／Ｏ１８のみを備え、外部に備えられた、キーボード１４、及びモニタ１５を用いて動作してもよい。
【００７０】
次に、本実施形態の動作を説明する。
【００７１】
図６は、本実施形態におけるマイクロプロセッサ１０５の動作を示すフローチャートである。図６は、マイクロプロセッサ１０５が、関数Ａの処理の実行中に、関数Ｂの処理を呼び出し、関数Ｂの処理を実行し、関数Ａの処理に復帰する際の動作を示す。
【００７２】
命令実行手段１１５は、関数Ａの処理の実行中に、関数Ｂの処理を呼び出す（ステップＳ１１）。
【００７３】
命令実行手段１１５は、最後の関数Ｂの呼び出しに対応する、関数Ｂのアドレス、リターンアドレス、及びベースポインタ（ＢＰ１）の値を保存領域１３０に保存する（ステップＳ２２）。
【００７４】
命令実行手段１１５は、関数Ｂのアドレス、リターンアドレス、及びベースポインタ（ＢＰ２）の値をメインメモリ２００上のスタック領域にプッシュすることにより保存する（ステップＳ２３）。
【００７５】
命令実行手段１１５は、関数Ｂの処理を実行する（ステップＳ１４）。
【００７６】
命令実行手段１１５は、関数Ｂからの戻り処理を開始する（ステップＳ１５）。
【００７７】
命令実行手段１１５は、メインメモリ２００上のスタック領域にプッシュされた、関数Ｂのアドレス、リターンアドレス、及びベースアドレスをポップすることにより読み出し、命令レジスタ群１２０にリストアする（ステップＳ１６）。
【００７８】
比較処理手段１４５は、命令レジスタ群１２０にリストアされた、関数Ｂのアドレス、リターンアドレス、ＢＰ２の値のすべてが、それぞれ、保存領域１３０に保存された、関数Ｂのアドレス、リターンアドレス、ＢＰ１の値と一致するか否か判定する（ステップＳ２７）。比較処理手段１４５は、判定後に、保存領域１３０に保存された、関数Ｂのアドレス、リターンアドレス、ＢＰ１の値を削除する。
【００７９】
命令レジスタ群１２０にリストアされた、関数Ｂのアドレス、リターンアドレス、ＢＰ２の値のすべてが、それぞれ、保存領域１３０に保存された、関数Ｂのアドレス、リターンアドレス、ＢＰ１の値と一致すれば（ステップＳ２８：Ｙｅｓ）、命令実行手段１１５は、関数Ｂからの戻り処理を継続する（関数Ｂから関数Ａに制御を戻す）（ステップＳ１９）。
【００８０】
命令レジスタ群１２０にリストアされた、関数Ｂのアドレス、リターンアドレス、ＢＰ２の値のいずれかが、それぞれ、保存領域１３０に保存された、関数Ｂのアドレス、リターンアドレス、ＢＰ１の値と一致しなければ（ステップＳ２８：Ｎｏ）、比較処理手段１４５は、スタック領域が異常状態にあるものと判定し、関数Ａ及び関数Ｂを含むコードの処理を中断する。
【００８１】
スタック領域が異常状態にあるものと判定されると、異常処理手段１５５は、ベースポインタの不正な書き換えに対する異常対策処理として、メインメモリ２００のスタック領域に関する情報を含むログ情報を保存し（ステップＳ３０）、プロセスを再起動する（ステップＳ３１）。
【００８２】
次に、本実施形態の処理手順の具体例を説明する。
【００８３】
図７は、本実施形態におけるマイクロプロセッサ１０５の処理手順の具体例を説明するための図である。
【００８４】
まず、本実施形態におけるマイクロプロセッサ１０５の処理手順の具体例を説明するための前提について説明する。
（前提３）スタックポインタの値の増加方向とバッファ領域（ローカル変数）におけるデータの伸長方向とは一致する（図中の上方向）。
（前提４）関数ｍａｉｎは、プロセスＭとして起動される。関数Ａは、プロセスＡとして起動される。
【００８５】
以上が、前提についての説明である。
【００８６】
関数Ａの処理の実行中には、命令実行手段１１５により、関数Ａの先頭のコードのアドレス３６１、リターンアドレス３６３、及びベースポインタ３６２の値は、保存領域１３０に保存されている（ステップＳ２２）。以下、関数の先頭のコードが格納されるメモリのアドレスを「関数のアドレス」という。
【００８７】
関数Ａの処理の実行中には、命令実行手段１１５により、関数Ａのアドレス２６１、リターンアドレス２６３、及びベースポインタ２６２の値は、メインメモリ２００上のスタック領域にプッシュすることにより保存されている（ステップＳ２３）。
【００８８】
命令実行手段１１５は、関数Ａの処理の実行中に、関数Ｂの処理を呼び出す（ステップＳ１１）。
【００８９】
命令実行手段１１５は、関数Ｂのアドレス３５１、リターンアドレス３５３、及びベースポインタ３５２の値を保存領域１３０に保存する（ステップＳ２２）。
【００９０】
命令実行手段１１５は、関数Ｂのアドレス２５１、リターンアドレス２５３、及びベースポインタ２５２の値をメインメモリ２００上のスタック領域にプッシュすることにより保存する（ステップＳ２３）。
【００９１】
命令実行手段１１５は、関数Ｂの処理を実行する（ステップＳ１４）。
【００９２】
ここで、メインメモリ２００のスタック領域に含まれる、関数Ｂ中のローカル変数２５４への値の設定において、バッファオーバーフローが発生するものとする。例えば、１０文字までの文字列を格納可能なローカル変数に、２０文字分のデータが書き込まれ、ローカル変数のアドレス範囲を超えた書き込みが発生する。バッファオーバーフローの発生により、ベースポインタ２５２に格納された値が、書き換えられる。
【００９３】
命令実行手段１１５は、関数Ｂからの戻り処理を開始する（ステップＳ１５）。
【００９４】
命令実行手段１１５は、メインメモリ２００上のスタック領域にプッシュされた、関数Ｂのアドレス２５１、リターンアドレス２５３、及び書き換えられたベースポインタ２５２の値をポップすることにより読み出し、命令レジスタ群１２０にリストアする（ステップＳ２６）。
【００９５】
比較処理手段１４５は、命令レジスタ群１２０にリストアされた、関数Ｂのアドレス２５１、リターンアドレス２５３、ベースポインタ２５２（ＢＰ２）のすべての値が、それぞれ、保存領域１３０に保存された、関数Ｂのアドレス３５１、リターンアドレス３５３、ベースポインタ３５２（ＢＰ１）の値と一致するか否か判定する（ステップＳ２７）。比較処理手段１４５は、判定後に、保存領域１３０に保存された、関数Ｂのアドレス３５１、リターンアドレス３５３、ＢＰ１の値を削除する。
【００９６】
命令レジスタ群１２０にリストアされたＢＰ２の値が書き換えられた場合は、ＢＰ１の値と一致しないので（ステップＳ２８：Ｎｏ）、比較処理手段１４５は、スタック領域が異常状態にあるものと判定し、関数Ａ及び関数Ｂを含むコードの処理を中断する。
【００９７】
異常処理手段１５５は、異常対策処理として、メインメモリ２００のスタック領域に関する情報を含むログ情報を保存し（ステップＳ３０）、関数ｍａｉｎに対応するプロセスＭ、又は関数Ａに対応するプロセスＡを再起動する（ステップＳ３１）。
【００９８】
以上説明したように、本実施形態におけるマイクロプロセッサ１０５では、スタック領域に格納された、サブルーチンのリターンアドレス、及びサブルーチン呼び出し時のベースポインタの両方が上書きされていないことを検証する。従って、本実施形態におけるマイクロプロセッサ１０５は、ベースポインタの不正な書き換えを検出することができる。
【００９９】
本実施形態におけるマイクロプロセッサ１０５では、更に、リターンアドレス及びサブルーチン呼び出し時のベースポインタから決まる、処理の戻り先コードの不正な書き換えを検出することができる。
【０１００】
本実施形態におけるマイクロプロセッサ１０５では、更に、スタック領域の異常を検出すると、異常状態、又は異常状態に起因する異常動作を回避するための異常対策処理を実行することができる。
【０１０１】
本実施形態では、スタックポインタの値の増加方向とバッファにおけるデータの伸長方向は一致する場合について説明した。しかしながら、本実施形態においては、スタックポインタの値の増加方向とバッファにおけるデータの伸長方向は一致する必要はない。すなわち、スタック領域に格納されたデータが、バッファオーバーフローにより上書きされる可能性があれば、本実施形態におけるマイクロプロセッサ１０５を適用することができる。従って、スタックポインタの値の増加方向とバッファにおけるデータの伸長方向とは逆方向であってもよい。
【０１０２】
また、第１の実施形態、第２の実施形態ともに、マイクロプロセッサが、１台の装置である場合について説明した。しかしながら、本発明のマイクロプロセッサは、必ずしも１台の装置である必要はない。すなわち、命令実行手段１１０、命令レジスタ群１２０、保存領域１３０、比較処理手段１４０、又は異常処理手段１５０のうちのいくつかが複数の装置に分割され、分割された複数の装置は全体としてマイクロプロセッサ１００と同等の機能を提供してもよい。
【０１０３】
尚、図６におけるマイクロプロセッサ１０５の異常処理手段１５０の各処理は、ソフトウェアによって実行されてもよい。すなわち、各処理を行うためのコンピュータプログラムが、マイクロプロセッサが備えるＣＰＵ（図５：１３）によって読み込まれ、実行されてもよい。プログラムを用いて各処理を行っても、上述の実施形態の処理と同内容の処理を行うことができる。そして、上記のプログラムは、ＲＯＭ（Read Only Memory）、ＲＡＭ（Random Access Memory）、フラッシュメモリ等の半導体記憶装置、光ディスク、磁気ディスク、光磁気ディスク等、非一時的な媒体に格納されてもよい。
【０１０４】
あるいは、各処理は、個別の回路等の構成要素によって実行されてもよい。
【０１０５】
尚、本願発明は、上述の実施形態に限定されるものではなく、本願発明の要旨を逸脱しない範囲で種々変更、変形して実施することができる。
【図１】
2015115052.tif 000003
【図２】
2015115052.tif 000004
【図３】
2015115052.tif 000005
【図４】
2015115052.tif 000006
【図５】
2015115052.tif 000007
【図６】
2015115052.tif 000008
【図７】
2015115052.tif 000009