(57)【特許請求の範囲】
【請求項１】
プログラムを実行する仮想マシンと、前記仮想マシンが実行中であるプログラム又は前記仮想マシンが実行を中断しているプログラムに関連するデータ領域をスタック形式で確保する記憶部と、を備え、前記データ領域が、実行中であるプログラムによって書き換えられる可変データ領域と、実行中であるプログラムによって書き換えられない固定データ領域を含む電子情報記憶媒体であって、
前記仮想マシンは、
実行するプログラムの切り替えを行う際に、切り替え先であるプログラムに関連する前記可変データ領域よりも前に前記スタック形式で確保された前記可変データ領域について所定の処理によって可変データ領域用異常チェックデータを作成する可変データ領域用異常チェックデータ作成手段と、
実行するプログラムの切り替えを行う際に、前記切り替え先であるプログラムに関連する前記固定データ領域を含む前記スタック形式で確保された全ての前記固定データ領域について所定の処理によって固定データ領域用異常チェックデータを作成する固定データ領域用異常チェックデータ作成手段と、
前記切り替えが行われた後、更に実行するプログラムの切り替えを行う際に、切り替え元であるプログラムに関連する前記可変データ領域よりも前に前記スタック形式で確保された前記可変データ領域について、所定の処理によって前記可変データ領域用異常チェックデータと比較するための可変データ領域用比較用データを作成する可変データ領域用比較用データ作成手段と、
前記切り替えが行われた後、更に実行するプログラムの切り替えを行う際に、切り替え元であるプログラムに関連する固定データ領域を含む前記スタック形式で確保された全ての固定データ領域について、所定の処理によって前記固定データ領域用異常チェックデータと比較するための固定データ領域用比較用データを作成する固定データ領域用比較用データ作成手段と、
前記可変データ領域用比較用データ作成手段が可変データ領域用比較用データを作成した場合に、当該可変データ領域用比較用データと同じ前記可変データ領域について先に作成された可変データ領域用異常チェックデータと、当該可変データ領域用比較用データとが一致するか否かを判定する可変データ領域判定手段と、
前記固定データ領域用比較用データ作成手段が固定データ領域用比較用データを作成した場合に、当該固定データ領域用比較用データと同じ前記固定データ領域について先に作成された固定データ領域用異常チェックデータと、当該固定データ領域用比較用データとが一致するか否かを判定する固定データ領域判定手段と、
前記可変データ領域判定手段により可変データ領域用異常チェックデータと可変データ領域用比較用データが一致しないと判定された場合、又は、前記固定データ領域判定手段により固定データ領域用異常チェックデータと固定データ領域用比較用データが一致しないと判定された場合に、異常を検知する異常検知手段、
として動作することを特徴とする電子情報記憶媒体。
【請求項２】
請求項１に記載の電子情報記憶媒体であって、
前記記憶部は、前記可変データ領域用異常チェックデータを記憶する可変データ領域用異常チェックデータ記憶領域と、前記固定データ領域用異常チェックデータを記憶する固定データ領域用異常チェックデータ記憶領域と、を有し、
前記可変データ領域用異常チェックデータ記憶領域は、前記可変データ領域用異常チェックデータ作成手段が前記可変データ領域用異常チェックデータを作成した場合に当該可変データ領域用異常チェックデータにより更新され、
前記固定データ領域用異常チェックデータ記憶領域は、前記固定データ領域用異常チェックデータ作成手段が前記固定データ領域用異常チェックデータを作成した場合に当該固定データ領域用異常チェックデータにより更新されることを特徴とする電子情報記憶媒体。
【請求項３】
請求項１又は２に記載の電子情報記憶媒体であって、
前記可変データ領域は、前記プログラムで宣言されたデータを保持する領域と、前記プログラムが実行される際に使用される領域と、を含み、
前記固定データ領域は、前記プログラムの戻りアドレスを保持する領域を含む、ことを特徴とする電子情報記憶媒体。
【請求項４】
プログラムを実行する仮想マシンと、前記仮想マシンが実行中であるプログラム又は前記仮想マシンが実行を中断しているプログラムに関連するデータ領域をスタック形式で確保する記憶部と、を備え、前記データ領域が、実行中であるプログラムによって書き換えられる可変データ領域と、実行中であるプログラムによって書き換えられない固定データ領域を含む電子情報記憶媒体における異常検知方法であって、
前記仮想マシンが、実行するプログラムの切り替えを行う際に、切り替え先であるプログラムに関連する前記可変データ領域よりも前に前記スタック形式で確保された前記可変データ領域について、所定の処理によって可変データ領域用異常チェックデータを作成する可変データ領域用異常チェックデータ作成工程と、
前記仮想マシンが、実行するプログラムの切り替えを行う際に、前記切り替え先であるプログラムに関連する前記固定データ領域を含む前記スタック形式で確保された全ての前記固定データ領域について、所定の処理によって固定データ領域用異常チェックデータを作成する固定データ領域用異常チェックデータ作成工程と、
前記仮想マシンが、前記切り替えが行われた後、更に実行するプログラムの切り替えを行う際に、切り替え元であるプログラムに関連する前記可変データ領域よりも前に前記スタック形式で確保された前記可変データ領域について、所定の処理によって前記可変データ領域用異常チェックデータと比較するための可変データ領域用比較用データを作成する可変データ領域用比較用データ作成工程と、
前記仮想マシンが、前記切り替えが行われた後、更に実行するプログラムの切り替えを行う際に、切り替え元であるプログラムに関連する固定データ領域を含む前記スタック形式で確保された全ての固定データ領域について、所定の処理によって前記固定データ領域用異常チェックデータと比較するための固定データ領域用比較用データを作成する固定データ領域用比較用データ作成工程と、
前記仮想マシンが、前記可変データ領域用比較用データ作成工程で可変データ領域用比較用データを作成した場合に、当該可変データ領域用比較用データと同じ前記可変データ領域について先に作成された可変データ領域用異常チェックデータと、当該可変データ領域用比較用データとが一致するか否かを判定する可変データ領域判定工程と、
前記仮想マシンが、前記固定データ領域用比較用データ作成工程で固定データ領域用比較用データを作成した場合に、当該固定データ領域用比較用データと同じ前記固定データ領域について先に作成された固定データ領域用異常チェックデータと、当該固定データ領域用比較用データとが一致するか否かを判定する固定データ領域判定工程と、
前記仮想マシンが、前記可変データ領域判定工程で可変データ領域用異常チェックデータと可変データ領域用比較用データが一致しないと判定された場合、又は、前記固定データ領域判定工程で固定データ領域用異常チェックデータと固定データ領域用比較用データが一致しないと判定された場合に、異常を検知する異常検知工程と、
を含むことを特徴とする異常検知方法。
【請求項５】
プログラムを実行する仮想マシンと、前記仮想マシンが実行中であるプログラム又は前記仮想マシンが実行を中断しているプログラムに関連するデータ領域をスタック形式で確保する記憶部と、を備え、前記データ領域が、実行中であるプログラムによって書き換えられる可変データ領域と、実行中であるプログラムによって書き換えられない固定データ領域を含む電子情報記憶媒体における前記仮想マシンを、
実行するプログラムの切り替えを行う際に、切り替え先であるプログラムに関連する前記可変データ領域よりも前に前記スタック形式で確保された前記可変データ領域について、所定の処理によって可変データ領域用異常チェックデータを作成する可変データ領域用異常チェックデータ作成手段、
実行するプログラムの切り替えを行う際に、前記切り替え先であるプログラムに関連する前記固定データ領域を含む前記スタック形式で確保された全ての前記固定データ領域について、所定の処理によって固定データ領域用異常チェックデータを作成する固定データ領域用異常チェックデータ作成手段、
前記切り替えが行われた後、更に実行するプログラムの切り替えを行う際に、切り替え元であるプログラムに関連する前記可変データ領域よりも前に前記スタック形式で確保された前記可変データ領域について、所定の処理によって前記可変データ領域用異常チェックデータと比較するための可変データ領域用比較用データを作成する可変データ領域用比較用データ作成手段、
前記切り替えが行われた後、更に実行するプログラムの切り替えを行う際に、切り替え元であるプログラムに関連する固定データ領域を含む前記スタック形式で確保された全ての固定データ領域について、所定の処理によって前記固定データ領域用異常チェックデータと比較するための固定データ領域用比較用データを作成する固定データ領域用比較用データ作成手段、
前記可変データ領域用比較用データ作成手段が可変データ領域用比較用データを作成した場合に、当該可変データ領域用比較用データと同じ前記可変データ領域について先に作成された可変データ領域用異常チェックデータと、当該可変データ領域用比較用データとが一致するか否かを判定する可変データ領域判定手段、
前記固定データ領域用比較用データ作成手段が固定データ領域用比較用データを作成した場合に、当該固定データ領域用比較用データと同じ前記固定データ領域について先に作成された固定データ領域用異常チェックデータと、当該固定データ領域用比較用データとが一致するか否かを判定する固定データ領域判定手段、
前記可変データ領域判定手段により可変データ領域用異常チェックデータと可変データ領域用比較用データが一致しないと判定された場合、又は、前記固定データ領域判定手段により固定データ領域用異常チェックデータと固定データ領域用比較用データが一致しないと判定された場合に、異常を検知する異常検知手段、
として機能させることを特徴とする異常検知プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
ＩＣチップ等の電子情報記憶媒体の技術分野に関する。
【背景技術】
【０００２】
近年のＩＣカードは、Ｏｒａｃｌｅ社が規格したＪａｖａ（登録商標）  Ｃａｒｄに対応しているものが多い。Ｊａｖａ  Ｃａｒｄは、Ｊａｖａで記述されたアプリケーションを、Ｇｌｏｖａｌ  Ｐｌａｔｆｏｒｍの規格に定められたＩＮＳＴＡＬＬコマンドによってＩＣカードにダウンロードし、ＩＣカード上で動作させるためのＯＳ機構である。
【０００３】
Ｊａｖａというプログラム言語は、ハードウェアの依存性を吸収するために、Ｃ言語といったコンパイルによって機械語に変換されるものと異なり、コンパイラによって中間言語と呼ばれる実行形式（以下、「バイトコード」という）に変換され、Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ（「ＶＭ］という）上にて動作する。バイトコードとは、算術や分岐といった命令を含んだデータ列である。
【０００４】
Ｊａｖａでは、各バイトコードが取り扱うデータ領域をスタック形式でメモリ上に確保しながら処理が行われる。このような機構はスタックマシンと呼ばれ、スタック形式で確保されるデータ領域が正常に動作することが求められる。
【０００５】
Ｊａｖａで記述されたアプリケーションは、アプリケーション内で宣言したデータを保持して、そのデータを用いて処理を行う。ここで、図１及び図２を用いてＪａｖａで記述されたアプリケーションのメソッドの呼び出し時におけるメモリ上のスタック領域について説明する。図１は、メソッド１、メソッド２、メソッド３の呼び出しの例である。図２は、図１のメソッド呼び出し時におけるスタック領域５００の一例を示す概念図である。
【０００６】
図１に示すアプリケーションでは、まず、メソッド１が呼び出され、次いで、メソッド１からメソッド２が呼び出され（この場合、メソッド１は呼び出し元のメソッドであり、メソッド２は呼び出し先のメソッドである）、次いで、メソッド２からメソッド３が呼び出されて処理が終了する。図２はメソッド３までが呼び出された際のスタック領域５００の一例を示している。
【０００７】
メソッド１が呼び出されると、メソッド１のローカル変数領域５０１ａとオペランドスタック領域５０１ｂがスタック領域５００に確保（Ｐｕｓｈ）されるとともに、メソッド１の制御情報領域５０１ｃがスタック領域５００に確保（Ｐｕｓｈ）される。
【０００８】
ローカル変数領域は、メソッドで宣言されたデータを保持する領域であり、オペランドスタック領域はメソッドが実行される際に使用される作業領域（例えば、メソッドの呼び出し（コール）時に設定される引数や、メソッドで処理された結果として返される戻り値が書き込まれる）である。すなわち、ローカル変数領域とオペランドスタック領域はメソッドが実行されることによりデータが書き換えられる。一方、制御情報領域には、メソッドの戻りアドレス、現在呼び出しているメソッドに対応するスタックの位置を特定するためのアドレス（又はオフセット）、現在呼び出しているメソッドに対応する制御情報の位置を特定するためのアドレス（又はオフセット）等が書き込まれるが、メソッドが実行されることによりデータは書き換えられることはない。
【０００９】
次いで、メソッド１からメソッド２が呼び出されると、メソッド２のローカル変数領域５０２ａとオペランドスタック領域５０２ｂがスタック領域５００に確保（Ｐｕｓｈ）されるとともに、メソッド２の制御情報領域５０２ｃがスタック領域５００に確保（Ｐｕｓｈ）される。メソッド２からメソッド３が呼び出される場合も同様である。メソッド３が終了すると、ＯＳはメソッド３の制御情報領域５０３ｃに格納されている戻りアドレスを取り出し（Ｐｏｐ）、メソッド３に関連するデータ領域（ローカル変数領域５０３ａ、オペランドスタック領域５０３ｂ及び制御情報領域５０３ｃ）を開放する。ＯＳは取り出した戻りアドレスからメソッド３を呼び出した際に中断したメソッド２の処理を再開させる。このように、実行中のメソッドが他のメソッドを呼び出す度にスタック領域５００に呼び出し先のメソッドに関連するデータ領域（ローカル変数領域、オペランドスタック領域及び制御情報領域）が確保され、メソッドの実行が完了すると当該メソッドに関連するデータ領域が開放される。
【００１０】
このように、メソッドを実行する上で必要なデータ領域がスタック領域５００に確保されるため、ハードウェアの故障、又は外的な要因（電磁波、レーザー等）によってスタック領域５００に確保されたデータ領域のデータが意図しない値に変更した場合、アプリケーションは意図しない動作を行ってしまう。その場合、セキュリティ上の問題や安全性の問題などが発生するため、異常を検知する仕組みが必要となる。
【００１１】
そこで、容易に考えられる仕組みは、アプリケーションが自身のデータに対して、ＣＲＣ（Cyclic Redundancy Check）やデータの二重化といった冗長性を持たせ、頻繁にチェックすることにより異常を検知する仕組みである。ただし、アプリケーション側からはプログラムの実行中に処理を行えるデータ領域に制限がある。すなわち、アプリケーションはメソッドの戻りアドレス等が格納される制御情報領域に関与することはできないし、実行中のメソッド以外のメソッドが使用するローカル変数領域やオペランドスタック領域についても関与することができない。
【００１２】
そうした中、特許文献１には、ＯＳ（Operating System）側から対策する方法として、実行環境の二重化する方法が開示されている。
【００１３】
また、特許文献２には、異常処理関数のアドレスをスタックにＰｕｓｈしておいて、所定のタイミングでＰｏｐした値をチェックし、Ｐｕｓｈした値でなければ異常と判断する方法が開示されている。これはフォルトインジェクションといった攻撃に対するセキュリティ上の対策を目的としており、対策を実施することによる大きな速度低下を回避することが可能である。
【先行技術文献】
【特許文献】
【００１４】
【特許文献１】特表２００６−５２２９６８号公報
【特許文献２】特許４６４４８２０号公報
【発明の概要】
【発明が解決しようとする課題】
【００１５】
しかしながら、特許文献１に開示された実行環境の二重化はメモリリソースやＣＰＵ（Central Processing Unit）への負荷が大きく、高性能なＣＰＵや大量なメモリリソースのある環境では有効だが、組み込み機器のような環境では現実的な方法ではない。
【００１６】
また、特許文献２に開示された方法では、スタック領域に異常検知用のデータ（関数アドレス）を紛れ込ませる方法を取っているため、異常検知用のデータにアドレス空間上近辺の領域の異常しか検出できない問題を抱えている。具体的には、３２ｂｉｔのＣＰＵで関数アドレスが４バイトに対して、スタックの領域が１０２４バイト程度であった場合、その比率は０．４％程度である。戻りアドレスといった、重要なデータがスタック領域に所定のタイミングでプッシュされていることが分かっている前提で、そのデータの改ざんを検知するという局所的な場面では有効ではあるが、逆に防げない領域の方が大きい。
【００１７】
そこで、本発明は、簡易な手法で、スタック領域に確保されたプログラム（メソッド）に関連するデータ領域の異常を検知することができる電子情報記憶媒体等を提供することを目的とする。
【課題を解決するための手段】
【００１８】
上記課題を解決するために、請求項１に記載の発明は、プログラムを実行する仮想マシンと、前記仮想マシンが実行中であるプログラム又は前記仮想マシンが実行を中断しているプログラムに関連するデータ領域をスタック形式で確保する記憶部と、を備え、前記データ領域が、実行中であるプログラムによって書き換えられる可変データ領域と、実行中であるプログラムによって書き換えられない固定データ領域を含む電子情報記憶媒体であって、前記仮想マシンは、実行するプログラムの切り替えを行う際に、切り替え先であるプログラムに関連する前記可変データ領域よりも前に前記スタック形式で確保された前記可変データ領域について所定の処理によって可変データ領域用異常チェックデータを作成する可変データ領域用異常チェックデータ作成手段と、実行するプログラムの切り替えを行う際に、前記切り替え先であるプログラムに関連する前記固定データ領域を含む前記スタック形式で確保された全ての前記固定データ領域について所定の処理によって固定データ領域用異常チェックデータを作成する固定データ領域用異常チェックデータ作成手段と、前記切り替えが行われた後、更に実行するプログラムの切り替えを行う際に、切り替え元であるプログラムに関連する前記可変データ領域よりも前に前記スタック形式で確保された前記可変データ領域について、所定の処理によって前記可変データ領域用異常チェックデータと比較するための可変データ領域用比較用データを作成する可変データ領域用比較用データ作成手段と、前記切り替えが行われた後、更に実行するプログラムの切り替えを行う際に、切り替え元であるプログラムに関連する固定データ領域を含む前記スタック形式で確保された全ての固定データ領域について、所定の処理によって前記固定データ領域用異常チェックデータと比較するための固定データ領域用比較用データを作成する固定データ領域用比較用データ作成手段と、前記可変データ領域用比較用データ作成手段が可変データ領域用比較用データを作成した場合に、当該可変データ領域用比較用データと同じ前記可変データ領域について先に作成された可変データ領域用異常チェックデータと、当該可変データ領域用比較用データとが一致するか否かを判定する可変データ領域判定手段と、前記固定データ領域用比較用データ作成手段が固定データ領域用比較用データを作成した場合に、当該固定データ領域用比較用データと同じ前記固定データ領域について先に作成された固定データ領域用異常チェックデータと、当該固定データ領域用比較用データとが一致するか否かを判定する固定データ領域判定手段と、前記可変データ領域判定手段により可変データ領域用異常チェックデータと可変データ領域用比較用データが一致しないと判定された場合、又は、前記固定データ領域判定手段により固定データ領域用異常チェックデータと固定データ領域用比較用データが一致しないと判定された場合に、異常を検知する異常検知手段、として動作することを特徴とする。
【００１９】
請求項２に記載の発明は、請求項１に記載の電子情報記憶媒体であって、前記記憶部は、前記可変データ領域用異常チェックデータを記憶する可変データ領域用異常チェックデータ記憶領域と、前記固定データ領域用異常チェックデータを記憶する固定データ領域用異常チェックデータ記憶領域と、を有し、前記可変データ領域用異常チェックデータ記憶領域は、前記可変データ領域用異常チェックデータ作成手段が前記可変データ領域用異常チェックデータを作成した場合に当該可変データ領域用異常チェックデータにより更新され、前記固定データ領域用異常チェックデータ記憶領域は、前記固定データ領域用異常チェックデータ作成手段が前記固定データ領域用異常チェックデータを作成した場合に当該固定データ領域用異常チェックデータにより更新されることを特徴とする。
【００２０】
請求項３に記載の発明は、請求項１又は２に記載の電子情報記憶媒体であって、前記可変データ領域は、前記プログラムで宣言されたデータを保持する領域と、前記プログラムが実行される際に使用される領域と、を含み、前記固定データ領域は、前記プログラムの戻りアドレスを保持する領域を含む、ことを特徴とする。
【００２１】
請求項４に記載の発明は、プログラムを実行する仮想マシンと、前記仮想マシンが実行中であるプログラム又は前記仮想マシンが実行を中断しているプログラムに関連するデータ領域をスタック形式で確保する記憶部と、を備え、前記データ領域が、実行中であるプログラムによって書き換えられる可変データ領域と、実行中であるプログラムによって書き換えられない固定データ領域を含む電子情報記憶媒体における異常検知方法であって、前記仮想マシンが、実行するプログラムの切り替えを行う際に、切り替え先であるプログラムに関連する前記可変データ領域よりも前に前記スタック形式で確保された前記可変データ領域について、所定の処理によって可変データ領域用異常チェックデータを作成する可変データ領域用異常チェックデータ作成工程と、前記仮想マシンが、実行するプログラムの切り替えを行う際に、前記切り替え先であるプログラムに関連する前記固定データ領域を含む前記スタック形式で確保された全ての前記固定データ領域について、所定の処理によって固定データ領域用異常チェックデータを作成する固定データ領域用異常チェックデータ作成工程と、前記仮想マシンが、前記切り替えが行われた後、更に実行するプログラムの切り替えを行う際に、切り替え元であるプログラムに関連する前記可変データ領域よりも前に前記スタック形式で確保された前記可変データ領域について、所定の処理によって前記可変データ領域用異常チェックデータと比較するための可変データ領域用比較用データを作成する可変データ領域用比較用データ作成工程と、前記仮想マシンが、前記切り替えが行われた後、更に実行するプログラムの切り替えを行う際に、切り替え元であるプログラムに関連する固定データ領域を含む前記スタック形式で確保された全ての固定データ領域について、所定の処理によって前記固定データ領域用異常チェックデータと比較するための固定データ領域用比較用データを作成する固定データ領域用比較用データ作成工程と、前記仮想マシンが、前記可変データ領域用比較用データ作成工程で可変データ領域用比較用データを作成した場合に、当該可変データ領域用比較用データと同じ前記可変データ領域について先に作成された可変データ領域用異常チェックデータと、当該可変データ領域用比較用データとが一致するか否かを判定する可変データ領域判定工程と、前記仮想マシンが、前記固定データ領域用比較用データ作成工程で固定データ領域用比較用データを作成した場合に、当該固定データ領域用比較用データと同じ前記固定データ領域について先に作成された固定データ領域用異常チェックデータと、当該固定データ領域用比較用データとが一致するか否かを判定する固定データ領域判定工程と、前記仮想マシンが、前記可変データ領域判定工程で可変データ領域用異常チェックデータと可変データ領域用比較用データが一致しないと判定された場合、又は、前記固定データ領域判定工程で固定データ領域用異常チェックデータと固定データ領域用比較用データが一致しないと判定された場合に、異常を検知する異常検知工程と、を含むことを特徴とする。
【００２２】
請求項５に記載の発明は、プログラムを実行する仮想マシンと、前記仮想マシンが実行中であるプログラム又は前記仮想マシンが実行を中断しているプログラムに関連するデータ領域をスタック形式で確保する記憶部と、を備え、前記データ領域が、実行中であるプログラムによって書き換えられる可変データ領域と、実行中であるプログラムによって書き換えられない固定データ領域を含む電子情報記憶媒体における前記仮想マシンを、実行するプログラムの切り替えを行う際に、切り替え先であるプログラムに関連する前記可変データ領域よりも前に前記スタック形式で確保された前記可変データ領域について、所定の処理によって可変データ領域用異常チェックデータを作成する可変データ領域用異常チェックデータ作成手段、実行するプログラムの切り替えを行う際に、前記切り替え先であるプログラムに関連する前記固定データ領域を含む前記スタック形式で確保された全ての前記固定データ領域について、所定の処理によって固定データ領域用異常チェックデータを作成する固定データ領域用異常チェックデータ作成手段、前記切り替えが行われた後、更に実行するプログラムの切り替えを行う際に、切り替え元であるプログラムに関連する前記可変データ領域よりも前に前記スタック形式で確保された前記可変データ領域について、所定の処理によって前記可変データ領域用異常チェックデータと比較するための可変データ領域用比較用データを作成する可変データ領域用比較用データ作成手段、前記切り替えが行われた後、更に実行するプログラムの切り替えを行う際に、切り替え元であるプログラムに関連する固定データ領域を含む前記スタック形式で確保された全ての固定データ領域について、所定の処理によって前記固定データ領域用異常チェックデータと比較するための固定データ領域用比較用データを作成する固定データ領域用比較用データ作成手段、前記可変データ領域用比較用データ作成手段が可変データ領域用比較用データを作成した場合に、当該可変データ領域用比較用データと同じ前記可変データ領域について先に作成された可変データ領域用異常チェックデータと、当該可変データ領域用比較用データとが一致するか否かを判定する可変データ領域判定手段、前記固定データ領域用比較用データ作成手段が固定データ領域用比較用データを作成した場合に、当該固定データ領域用比較用データと同じ前記固定データ領域について先に作成された固定データ領域用異常チェックデータと、当該固定データ領域用比較用データとが一致するか否かを判定する固定データ領域判定手段、前記可変データ領域判定手段により可変データ領域用異常チェックデータと可変データ領域用比較用データが一致しないと判定された場合、又は、前記固定データ領域判定手段により固定データ領域用異常チェックデータと固定データ領域用比較用データが一致しないと判定された場合に、異常を検知する異常検知手段、として機能させることを特徴とする。
【発明の効果】
【００２３】
本発明によれば、スタック形式で確保されているプログラムに関連するデータ領域のうち異常を検知したい領域について、実行するプログラムの開始時に所定の処理により異常チェックデータを作成し、プログラムの終了時に所定の処理により比較用データを作成して比較するといった簡易な手法で、当該領域の異常を検知することができる。
【図面の簡単な説明】
【００２４】
【図１】アプリケーションによるメソッドの呼び出し時のコード例を示す図である。
【図２】メソッド呼び出し時におけるスタック領域の一例を示す概念図である。
【図３】（Ａ）は、ＩＣチップ１ａのハードウェア構成例を示す図であり、（Ｂ）は、ＩＣチップ１ａの機能ブロック例を示す図である。
【図４】ＣＰＵ１０による制御情報領域処理の一例を示すフローチャートである。
【図５】ＣＰＵ１０による可変データ領域処理（Ｐｕｓｈ）の一例を示すフローチャートである。
【図６】ＣＰＵ１０による可変データ領域処理（Ｐｏｐ）の一例を示すフローチャートである。
【発明を実施するための形態】
【００２５】
以下、図面を参照して本発明の実施形態について詳細に説明する。まず、図３等を参照して、ＩＣカード１に搭載されたＩＣチップ１ａの概要構成及び機能について説明する。図３（Ａ）は、ＩＣチップ１ａのハードウェア構成例を示す図であり、図３（Ｂ）は、ＩＣチップ１ａの機能ブロック例を示す図である。なお、ＩＣカード１は、キャッシュカード、クレジットカード、電子マネーカード、社員カード等として使用される。或いは、ＩＣカード１は、スマートフォンや携帯電話機等の通信機器に組み込まれる。また、本発明である電子情報記憶媒体はＩＣカード１やＩＣチップ１ａを含むものであり、この電子情報記憶媒体は通信機器の回路基板上に直接組み込んで構成するようにしてもよい。
【００２６】
図３（Ａ）に示すように、ＩＣチップ１ａは、ＣＰＵ１０、ＲＯＭ（Read Only Memory）１１、データを一時的に記憶するための揮発性メモリであるＲＡＭ（Random Access Memory）１２、不揮発性メモリであるフラッシュメモリ１３（記憶部の一例）、及びＩ／Ｏ回路１４を備えて構成される。なお、フラッシュメモリの代わりに「Electrically Erasable Programmable Read-Only Memory」であっても構わない。Ｉ／Ｏ回路１４は、外部端末２とのインターフェイスを担う。これにより、ＩＣチップ１ａは、ＩＣリーダ・ライタを備える外部端末２との間で接触又は非接触で通信を行うことができる。接触式のＩＣチップ１ａの場合、Ｉ／Ｏ回路１４には、例えば、Ｃ１〜Ｃ８の８個の端子が備えられている。例えば、Ｃ１端子は電源端子（ＩＣチップ１ａへ電源供給する端子）、Ｃ２端子はリセット端子、Ｃ３端子はクロック端子、Ｃ５端子はグランド端子、Ｃ７端子は外部端末２との間で通信を行うための端子である。一方、非接触式のＩＣチップ１ａの場合、Ｉ／Ｏ回路１４には、例えば、アンテナ、及び変復調回路が備えられている。なお、外部端末２の例としては、ＩＣカード発行機、ＡＴＭ、改札機、認証用ゲート等が挙げられる。或いは、ＩＣチップ１ａが通信機器に組み込まれる場合、外部端末２には通信機器の機能を担う制御部が該当する。
【００２７】
ＣＰＵ１０は、コンピュータの一例であり、図３（Ｂ）に示すハードウェアとして、フラッシュメモリ１３に記憶された各種プログラムを実行する演算装置である。各種プログラムには、仮想マシンプログラム、Ｊａｖａ等のプログラム言語で記述されるアプリケーションが含まれる。ＯＳ、及び仮想マシンプログラムは、複数のネイティブコード（実行コード群）で記述される。ＯＳは、ＩＣチップ１ａの動作を直接コントロールするソフトウェアである。ＯＳ、及び仮想マシンプログラムは、ＲＯＭ１１に記憶されてもよい。
【００２８】
仮想マシンプログラムは、ＣＰＵ１０を仮想マシン（実行部の一例）として機能させるプログラムである。ＯＳ上で動作する仮想マシンは、ソースコードとネイティブコードとの間の中間コードであるバイトコードを解釈、実行する。プログラマーにより作成されたアプリケーションには、ソースコードが例えば実行順に記述される。そして、このようなアプリケーションは、コンパイラによって仮想マシンの実行形式に変換（つまり、ソースコードからバイトコードに変換）され、インストール（フラッシュメモリ１３に記憶）されることになる。このため、フラッシュメモリ１３に記憶されているアプリケーションは、複数の命令それぞれを示すバイトコードを例えば実行順に記述する。
【００２９】
仮想マシンは、アプリケーションに記述されたバイトコードを実行順に取得し、該取得したバイトコードを解釈して当該バイトコードが示す命令を実行する。当該命令の実行による処理を、バイトコード処理という。バイトコード処理の内容は、仮想マシンプログラムに規定されている。また、仮想マシンは、アプリケーションに記述された複数のバイトコードのうち、次に実行するべきバイトコードの位置（アプリケーションにおける位置）を特定可能な特定情報を指し示すプログラムカウンタを備える。ここで、特定情報の例として、バイトコードのアドレス（バイトコードが記憶されたフラッシュメモリ１３におけるアドレス）、バイトコードのオフセット、バイトコードのラベル値が挙げられる。例えば、公知のＣｏｍｐｕｔｅｄ  ｇｏｔｏアルゴリズムでは、ＧＮＵ  Ｃ対応の拡張機能であるｌａｂｅｌ  ａｓ  ｖａｌｕｅにより、ラベル値としてのアドレスに直接ジャンプすることができる。
【００３０】
また、ＲＡＭ１２は、図２を用いて上述したように、仮想マシンにより使用されるスタック領域５００を有する。つまり、ＲＡＭ１２全体のメモリ領域のうち一部がスタック領域５００として割り当てられる。スタック領域５００は、後入れ先出しの構造を有し、仮想マシンによる命令の実行において用いられるデータ領域を一時的に記憶する。より具体的に、スタック領域５００には、仮想マシンによるメソッドの呼び出しに伴いデータ領域がフレーム単位で確保され（スタック領域５００の先頭にプッシュされて積み上げられる）、メソッドの終了により、当該データ領域はフレーム単位で開放される（スタック領域５００の先頭からポップされる）構造になっている。上述したように、データ領域には、メソッドに関連するローカル変数領域、オペランドスタック領域、制御情報領域がある。
【００３１】
また、フラッシュメモリ１３には、異常検知プログラムが記憶される。異常検知プログラムは、仮想メモリを、本発明における異常チェックデータ作成手段、比較用データ作成手段、判定手段、及び異常検知手段として機能させる。具体的には、仮想マシンは、異常検知プログラムにより、実行するメソッド（「プログラム」の一例）の切り替えを行う際に、ＲＡＭ１２にスタック形式で確保されているメソッドに関連するローカル変数領域、オペランドスタック領域、制御情報領域の少なくとも一部についてＣＲＣ（Cyclic Redundancy Check）による誤り検出符号算出処理（「所定の処理」の一例）によってＣＲＣ誤り検出符号（「異常チェックデータ」の一例）を作成し、切り替えが行われた後、更に実行するメソッドの切り替えを行う際に、先にＣＲＣ誤り検出符号を作成した領域について、誤り検出符号算出処理によってＣＲＣ誤り検出符号（「比較用データ」の一例）を作成する。
【００３２】
すなわち、仮想マシンは、メソッドの切り替え時（（呼び出し（Ｐｕｓｈ）時、戻り（Ｐｏｐ）時）に、スタック領域５００の一部の領域についてＣＲＣ誤り検出符号を用いて異常を検知する。一部の領域とは、実行中のメソッド（「カレントメソッド」という場合がある）のローカル変数領域（「可変データ領域」の一例）及びオペランドスタック領域（「可変データ領域」の一例）を除いた領域であり、具体的には、実行中のメソッドの制御情報領域、実行を中断しているメソッドのローカル変数領域、オペランドスタック領域及び制御情報領域である。より具体的には、図２の例においてメソッド３が実行中であれば、メソッド３のローカル変数領域５０３ａ及びメソッド３のオペランドスタック領域５０３ｂを除いた領域（メソッド１のローカル変数領域５０１ａ、オペランドスタック領域５０１ｂ、制御情報領域５０１ｃ、メソッド２のローカル変数領域５０２ａ、オペランドスタック領域５０２ｂ、制御情報領域５０２ｃ、メソッド３の制御情報領域５０３ｃ）である。なお、実行中のメソッドのローカル変数領域及びオペランドスタック領域は、実行中のメソッドによる書き換えが行われる領域であり、また、アプリケーションで異常検知の対策が可能であるため、ＣＲＣ誤り検出符号による異常検知を行わない。
【００３３】
また、仮想マシンは、異常を検知した場合、異常時処理を行う。この異常時処理により、例えば、異常が検知されたこと示す応答が外部端末２へ出力され、ＩＣチップ１ａの動作が停止される。このような対策（構成）は、仮想マシンに実装（つまり、仮想マシンプログラム内に組み込む）できるため、ＩＣチップ１ａに後からインストールされるアプリケーション側での対策が不要となる。
【００３４】
次に、図４−図６を参照して、ＩＣチップ１ａの動作について説明する。図４は、メソッドの切り替え時における制御情報領域に関する処理（制御情報領域処理）の一例を示すフローチャートである。図５は、メソッドの呼び出し（Ｐｕｓｈ）時における可変データ領域（ローカル変数領域及びオペランドスタック領域）に関する処理（可変データ領域処理（Ｐｕｓｈ））の一例を示すフローチャートである。図６は、メソッドの戻り（Ｐｏｐ）時における可変データ領域（ローカル変数領域及びオペランドスタック領域）に関する処理（可変データ領域処理（Ｐｏｐ））の一例を示すフローチャートである。
【００３５】
まず、図４に示す制御情報領域処理について説明する。なお、図４に示す制御情報領域処理は、メソッドが呼び出された場合や、メソッドの処理が完了し、呼び出し元のメソッドに戻る場合に実行される。
【００３６】
ＣＰＵ１０は、スタック領域５００に確保されている制御情報領域があるか否かを判定する（ステップＳ１０１）。このとき、ＣＰＵ１０は、スタック領域５００に確保されている制御情報領域がない（例えば、図１の例でメソッド１が呼び出されたケースである）と判定した場合（ステップＳ１０１：ＮＯ）、ステップＳ１０５の処理に移行する。
【００３７】
一方、ＣＰＵ１０は、スタック領域５００に確保されている制御情報領域がある（例えば、図１の例でメソッド２やメソッド３が呼び出されたケースである）と判定した場合（ステップＳ１０１：ＹＥＳ）、誤り検出符号算出処理により、最初のメソッドからカレントメソッド（メソッド２からメソッド３が呼び出された場合、カレントメソッドはメソッド２）の制御情報領域までのＣＲＣ誤り検出符号を算出する（ステップＳ１０２）。例えば、メソッド２からメソッド３が呼び出された場合であれば、メソッド１及びメソッド２の制御情報領域５０１ｃ、５０２ｃについてＣＲＣ誤り検出符号を算出する。
【００３８】
次に、ＣＰＵ１０は、ＲＡＭ１２のＣＲＣ保持領域（制御情報）に保持しているＣＲＣ誤り検出符号（後述するステップＳ１０７で算出される）と、ステップＳ１０２の処理で算出したＣＲＣ誤り検出符号が一致するか否かを判定する（ステップＳ１０３）。このとき、ＣＰＵ１０は、ＣＲＣ誤り検出符号が一致しないと判定した場合には（ステップＳ１０３：ＮＯ）、異常時処理を実行し（ステップＳ１０４）、当該フローチャートに示す処理を終了する。一方、ＣＰＵ１０は、ＣＲＣ誤り検出符号が一致すると判定した場合には（ステップＳ１０３：ＹＥＳ）、ステップＳ１０５の処理に移行する。
【００３９】
次に、ＣＰＵ１０は、スタック領域５００に新たに呼び出されたメソッドの制御情報領域を確保し（ステップＳ１０５）、内容を更新する（ステップＳ１０６）。例えば、メソッド２からメソッド３が呼び出された場合であれば、メソッド３の制御情報領域５０３ｃを確保し、戻りアドレスや一つ前に呼び出されたメソッド（すなわちメソッド２）のオペランドスタックのアドレス又はオフセット等を記述し更新する。
【００４０】
次に、ＣＰＵ１０は、誤り検出符号算出処理により、更新した制御情報領域までのＣＲＣ誤り検出符号を算出し（ステップＳ１０７）、算出したＣＲＣ誤り検出符号により、ＲＡＭ１２のＣＲＣ保持領域（制御情報）に保持しているＣＲＣ誤り検出符号を更新し（ステップＳ１０８）、当該フローチャートに示す処理を終了する。例えば、メソッド２からメソッド３が呼び出された場合であれば、メソッド１からメソッド３までの制御情報領域５０１ｃ、５０２ｃ、５０３ｃについてＣＲＣ誤り検出符号を算出して、ＲＡＭ１２のＣＲＣ保持領域（制御情報）に保持しているＣＲＣ誤り検出符号を更新する。
【００４１】
次に、図５に示す可変データ領域処理（Ｐｕｓｈ）について説明する。なお、図５に示す可変データ領域処理（Ｐｕｓｈ）は、メソッドが呼び出された場合に実行される。
【００４２】
ＣＰＵ１０は、スタック領域５００に確保されている可変データ領域（ローカル変数領域及びオペランドスタック領域）があるか否かを判定する（ステップＳ１３１）。このとき、ＣＰＵ１０は、スタック領域５００に確保されている可変データ領域がない（例えば、図１の例でメソッド１が呼び出されたケースである）と判定した場合（ステップＳ１３１：ＮＯ）、呼び出されたメソッドについて可変データ領域をスタック領域５００に確保し（カレントメソッドを呼び出されたメソッドに変更し）（ステップＳ１３８）、当該フローチャートに示す処理を終了する。
【００４３】
一方、ＣＰＵ１０は、スタック領域５００に確保されている可変データ領域がある（例えば、図１の例でメソッド２やメソッド３が呼び出されたケースである）と判定した場合（ステップＳ１３１：ＹＥＳ）、スタック領域５００に確保されている可変データ領域は一つ（ローカル変数領域及びオペランドスタック領域の組合せで一つの可変データ領域と数えるものとする）か否かを判定する（ステップＳ１３２）。
【００４４】
このとき、ＣＰＵ１０は、スタック領域５００に確保されている可変データ領域が一つである（例えば、図１の例でメソッド２が呼び出されたケースである）場合には（ステップＳ１３２：ＹＥＳ）と判定した場合には、ステップＳ１３６の処理に移行する。
【００４５】
一方、ＣＰＵ１０は、スタック領域５００に確保されている可変データ領域が一つではないと判定した場合には（ステップＳ１３２：ＮＯ）、次いで、誤り検出符号算出処理により、カレントメソッドの一つ前のメソッドまでの可変データ領域についてＣＲＣ誤り検出符号を算出する（ステップＳ１３３）。例えば、メソッド２からメソッド３が呼び出された場合であれば、カレントメソッドであるメソッド２の一つ前のメソッド１の可変データ領域（ローカル変数領域５０１ａ、オペランドスタック領域５０１ｂ）についてＣＲＣ誤り検出符号を算出する。
【００４６】
次に、ＣＰＵ１０は、ＲＡＭ１２のＣＲＣ保持領域（可変データ）に保持しているＣＲＣ誤り検出符号（後述するステップＳ１３６又は図６のステップＳ１５５の処理で算出される）と、ステップＳ１３３の処理で算出したＣＲＣ誤り検出符号が一致するか否かを判定する（ステップＳ１３４）。このとき、ＣＰＵ１０は、ＣＲＣ誤り検出符号が一致しないと判定した場合には（ステップＳ１３４：ＮＯ）、異常時処理を実行し（ステップＳ１３５）、当該フローチャートに示す処理を終了する。一方、ＣＰＵ１０は、ＣＲＣ誤り検出符号が一致すると判定した場合には（ステップＳ１３４：ＹＥＳ）、ステップＳ１３６の処理に移行する。
【００４７】
次に、ＣＰＵ１０は、スタック領域５００におけるカレントメソッドまでの可変データ領域についてＣＲＣ誤り検出符号を算出し（ステップＳ１３６）、算出したＣＲＣ誤り検出符号により、ＲＡＭ１２のＣＲＣ保持領域（可変データ）に保持しているＣＲＣ誤り検出符号を更新する（ステップＳ１３７）。例えば、メソッド２からメソッド３が呼び出された場合であれば、カレントメソッドはメソッド２であるので、メソッド１からメソッド２までの可変データ領域についてＣＲＣ誤り検出符号して、ＲＡＭ１２に保持しているＣＲＣ誤り検出符号を更新する。
【００４８】
次に、ＣＰＵ１０は、スタック領域５００に新たに呼び出されたメソッドの可変データ領域を確保し（カレントメソッドを呼び出されたメソッドに変更し）（ステップＳ１３８）、当該フローチャートに示す処理を終了する。
【００４９】
次に、図６に示す可変データ領域処理（Ｐｏｐ）について説明する。なお、図６に示す可変データ領域処理（Ｐｏｐ）は、メソッドの処理が完了し、呼び出し元のメソッドに戻る場合に実行される。
【００５０】
まず、ＣＰＵ１０は、スタック領域５００における呼び出し元のメソッドの可変データ領域を開放する（カレントメソッドを呼び出し元のメソッドに変更する）（ステップＳ１５１）。例えば、メソッド３が終了し、呼び出し元のメソッド２に戻る場合であれば、メソッド３の可変データ領域を開放し、カレントメソッドをメソッド２に変更する。
【００５１】
次に、ＣＰＵ１０は、誤り検出符号算出処理により、カレントメソッドまでの可変データ領域についてＣＲＣ誤り検出符号を算出する（ステップＳ１５２）。例えば、カレントメソッドがメソッド２である場合、メソッド１及びメソッド２の可変データ領域（ローカル変数領域５０１ａ、オペランドスタック領域５０１ｂ、ローカル変数領域５０２ａ、オペランドスタック領域５０２ｂ）についてＣＲＣ誤り検出符号を算出する。
【００５２】
次に、ＣＰＵ１０は、ＲＡＭ１２のＣＲＣ保持領域（可変データ）に保持しているＣＲＣ誤り検出符号（後述するステップＳ１５５又は図５のステップＳ１３６の処理で算出される）と、ステップＳ１５２の処理で算出したＣＲＣ誤り検出符号が一致するか否かを判定する（ステップＳ１５３）。このとき、ＣＰＵ１０は、ＣＲＣ誤り検出符号が一致しないと判定した場合には（ステップＳ１５３：ＮＯ）、異常時処理を実行し（ステップＳ１５４）、当該フローチャートに示す処理を終了する。一方、ＣＰＵ１０は、ＣＲＣ誤り検出符号が一致すると判定した場合には（ステップＳ１５３：ＹＥＳ）、ステップＳ１５５の処理に移行する。
【００５３】
次に、ＣＰＵ１０は、誤り検出符号算出処理により、スタック領域５００におけるカレントメソッドの一つ前までの可変データ領域についてＣＲＣ誤り検出符号を算出し（ステップＳ１５５）、算出したＣＲＣ誤り検出符号により、ＲＡＭ１２のＣＲＣ保持領域（可変データ）に保持しているＣＲＣ誤り検出符号を更新し（ステップＳ１５６）、当該フローチャートに示す処理を終了する。例えば、メソッド３を終了してメソッド２に戻る場合であれば、ステップＳ１５１の処理によりカレントメソッドがメソッド２となるので、メソッド１までの可変データ領域についてＣＲＣ誤り検出符号して、ＲＡＭ１２に保持しているＣＲＣ誤り検出符号を更新する。なお、メソッド２を終了してメソッド１に戻る場合は、メソッド１より前のメソッドが存在しないので、ＣＲＣ誤り検出符号を算出せずに、ＲＡＭ１２のＣＲＣ保持領域（可変データ）を初期化する。
【００５４】
以上説明したように、上記実施形態によれば、仮想マシン（「異常チェックデータ作成手段」、「比較用データ作成手段」、「判定手段」、「異常検知手段」の一例）は、実行するメソッド（「プログラム」の一例）の切り替えを行う際に、フラッシュメモリ１３（「記憶部」の一例）にスタック形式で確保されているメソッドのローカル変数領域、オペランドスタック領域、制御情報領域の少なくとも一部について誤り検出符号算出処理によってＣＲＣ誤り検出符号（「異常チェックデータ」の一例）を算出し、当該切り替えが行われた後、更に実行するメソッドの切り替えを行う際に、先にＣＲＣ誤り検出符号を算出した部分について、誤り検出符号算出処理によってＣＲＣ誤り検出符号（「比較用データ」の一例）を算出し、両ＣＲＣ誤り検出符号が一致するか否かを判定して、判定において一致しないと判定した場合に異常を検知する。
【００５５】
したがって、上記実施形態によれば、スタック形式で確保されているメソッドに関連するデータ領域のうち異常を検知したい領域について、実行するメソッドの開始時に誤り検出符号算出処理によりＣＲＣ誤り検出符号を作成し、当該メソッドの終了時に誤り検出符号算出処理によりＣＲＣ誤り検出符号を作成して比較するといった簡易な手法で、当該領域の異常を検知することができる。
【００５６】
また、上記実施形態において、仮想マシンは、実行するメソッドの切り替えを行う際に、切り替え先であるメソッドに関連する可変データ領域よりも前にスタック領域５００に確保された可変データ領域についてＣＲＣ誤り検出符号を作成し、また、実行するメソッドの切り替えを行う際に、切り替え元であるメソッドに関連する可変データ領域よりも前にスタック領域５００に確保された可変データ領域について作成された前記ＣＲＣ誤り検出符号と比較するためのＣＲＣ誤り検出符号を作成する。これにより、新たに実行されるメソッド以外のスタック領域５００に確保された可変データ領域について異常を検知することができる。
【００５７】
更に、上記実施形態においては、仮想マシンは、実行するメソッドの切り替えを行う際に、切り替え先であるメソッドに関連する制御情報領域（「固定データ領域」の一例）を含むスタック領域５００に確保された全ての制御情報領域についてＣＲＣ誤り検出符号を作成し、また、実行するメソッドの切り替えを行う際に、切り替え元であるメソッドに関連する制御情報領域を含むスタック領域５００に確保された全ての制御情報領域についてＣＲＣ誤り検出符号を作成する。これにより、新たに実行されるメソッドを含めスタック領域５００に確保された全ての制御情報領域について異常を検知することができる。
【００５８】
なお、上記実施形態においては、本発明の電子情報記憶媒体の一例としてＩＣチップ１ａを例にとって説明したが、本発明は、組込み型のマイクロチップ等に対して適用することもできる。
【００５９】
また、上記実施形態においては、異常を検知するためにＣＲＣ誤り検出符号を用いることとしたが、他の誤り検出符号を用いることとしてもよい。
【符号の説明】
【００６０】
１  ＩＣカード
２  外部端末
１ａ  ＩＣチップ
１０  ＣＰＵ
１１  ＲＯＭ
１２  ＲＡＭ
１３  フラッシュメモリ
１４  Ｉ／Ｏ回路
【図１】
0006798157.tif 000002
【図２】
0006798157.tif 000003
【図３】
0006798157.tif 000004
【図４】
0006798157.tif 000005
【図５】
0006798157.tif 000006
【図６】
0006798157.tif 000007