(57)【特許請求の範囲】
【請求項１】
複数の命令それぞれを示す識別番号を記述するアプリケーションを記憶する記憶部と、前記アプリケーションに記述された前記識別番号を実行順に取得し該取得した前記識別番号が示す前記命令を実行する実行部と、前記実行部により使用されるスタック領域及び当該スタック領域の全部または一部と同サイズのチェック用領域を有する揮発性メモリと、を備える電子情報記憶媒体であって、
前記実行部は、
前記命令の実行において用いられるデータを前記スタック領域に書き込む場合、当該データと同一のデータを前記チェック用領域に書き込む書込手段と、
特定の命令を実行する場合、前記スタック領域からデータを読み出すとともに、前記チェック用領域から前記データを読み出し、当該スタック領域から読み出された前記データと、前記チェック用領域から読み出された前記データとが一致するか否かを判定する判定手段と、
前記判定手段による前記判定において前記データが一致しないと判定された場合、異常を検知する異常検知手段と、
を備えることを特徴とする電子情報記憶媒体。
【請求項２】
前記特定の命令は、条件分岐命令であり、
前記判定手段による前記判定において前記データが一致すると判定された場合に限り、前記実行部は、当該データを条件判定のための値として前記条件分岐命令を実行することを特徴とする請求項１に記載の電子情報記憶媒体。
【請求項３】
前記特定の命令は、関数呼び出し命令であり、
前記判定手段による前記判定において前記データが一致すると判定された場合に限り、前記実行部は、当該データを引数として設定して関数呼び出し命令を実行することを特徴とする請求項１または２に記載の電子情報記憶媒体。
【請求項４】
前記判定手段は、前記特定の命令が所定の複数回数実行される毎に、前記スタック領域からデータを読み出すとともに、前記チェック用領域から前記データを読み出し、当該スタック領域から読み出された前記データと、前記チェック用領域から読み出された前記データとが一致するか否かを判定することを特徴とする請求項１乃至３の何れか一項に記載の電子情報記憶媒体。
【請求項５】
前記揮発性メモリは、前記スタック領域の全部または一部と同サイズの複数のチェック用領域を有し、
前記書込手段は、前記命令の実行において用いられるデータを前記スタック領域に書き込む場合、当該データと同一のデータを前記複数のチェック用領域それぞれに書き込み、
前記判定手段は、特定の命令を実行する場合、前記スタック領域からデータを読み出すとともに、前記複数のチェック用領域それぞれから前記データを読み出し、当該スタック領域から読み出された前記データと、前記複数のチェック用領域それぞれから読み出された前記データとが一致するか否かをそれぞれ判定し、
前記異常検知手段は、前記判定手段による前記判定の何れかにおいて前記データが一致しないと判定された場合、異常を検知する請求項１乃至４の何れか一項に記載の電子情報記憶媒体。
【請求項６】
複数の命令それぞれを示す識別番号を記述するアプリケーションを記憶する記憶部と、前記アプリケーションに記述された前記識別番号を実行順に取得し該取得した前記識別番号が示す前記命令を実行する実行部と、前記実行部により使用されるスタック領域及び当該スタック領域の全部または一部と同サイズのチェック用領域を有する揮発性メモリと、を備える電子情報記憶媒体における異常検知方法であって、
前記実行部が、前記命令の実行において用いられるデータを前記スタック領域に書き込む場合、当該データと同一のデータを前記チェック用領域に書き込むステップと、
前記実行部が、特定の命令を実行する場合、前記スタック領域からデータを読み出すとともに、前記チェック用領域から前記データを読み出し、当該スタック領域から読み出された前記データと、前記チェック用領域から読み出された前記データとが一致するか否かを判定するステップと、
前記実行部が、前記判定において前記データが一致しないと判定された場合、異常を検知するステップと、
を含むことを特徴とする異常検知方法。
【請求項７】
複数の命令それぞれを示す識別番号を記述するアプリケーションを記憶する記憶部と、前記アプリケーションに記述された前記識別番号を実行順に取得し該取得した前記識別番号が示す前記命令を実行するコンピュータと、前記コンピュータにより使用されるスタック領域及び当該スタック領域の全部または一部と同サイズのチェック用領域を有する揮発性メモリと、を備える電子情報記憶媒体における前記コンピュータを、
前記命令の実行において用いられるデータを前記スタック領域に書き込む場合、当該データと同一のデータを前記チェック用領域に書き込む書込手段と、
特定の命令を実行する場合、前記スタック領域からデータを読み出すとともに、前記チェック用領域から前記データを読み出し、当該スタック領域から読み出された前記データと、前記チェック用領域から読み出された前記データとが一致するか否かを判定する判定手段と、
前記判定手段による前記判定において前記データが一致しないと判定された場合、異常を検知する異常検知手段として機能させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、アプリケーションに記述された識別番号を実行順に取得し該取得した識別番号が示す命令を実行する仮想マシンを備えるＩＣチップ等の電子情報記憶媒体の技術に関する。
【背景技術】
【０００２】
セキュリティ性が要求されるＩＣカードでは、外部からの攻撃などによる不正動作に対する対策が採られている必要がある。外部からの攻撃とは、ＩＣカードに搭載されたＩＣチップに誤動作を起こさせるための方法であり、代表的な攻撃方法として、例えば、ＩＣチップに対してレーザ照射を行うことでメモリに記憶されたデータを変化させるレーザ攻撃が知られている。このようなレーザ攻撃への対策として、特許文献１には、符号理論などの論理演算を用いて検出することができるエラー判定回路と、光検出素子を有する光照射検出回路とを備えることで、エラー判定回路による誤り検出と光照射検出回路による光照射の検出とにより、互いに補完的に外部からの攻撃を検出する方法が開示されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１４−６３２７２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、エラー判定回路による誤り検出と光照射検出回路による光照射の検出とにより、互いに補完的に外部からの攻撃を検出する方法では、全てのエラーを検出することは困難であることが推定され、また、ハードウェア上に特殊なセンサーや検出機構が必要となる。また、近年では、２つのレーザをＩＣチップの例えば上下から同時に照射するというような攻撃手法も知られてきている。
【０００５】
そこで、本発明は、上記点に鑑みてなされたものであり、特殊なセンサーや複雑な検出機構を設けずに、外部からの攻撃に強い耐性を持つことが可能な電子情報記憶媒体、異常検知方法、及びプログラムを提供することを課題とする。
【課題を解決するための手段】
【０００６】
上記課題を解決するために、請求項１に記載の発明は、複数の命令それぞれを示す識別番号を記述するアプリケーションを記憶する記憶部と、前記アプリケーションに記述された前記識別番号を実行順に取得し該取得した前記識別番号が示す前記命令を実行する実行部と、前記実行部により使用されるスタック領域及び当該スタック領域の全部または一部と同サイズのチェック用領域を有する揮発性メモリと、を備える電子情報記憶媒体であって、前記実行部は、前記命令の実行において用いられるデータを前記スタック領域に書き込む場合、当該データと同一のデータを前記チェック用領域に書き込む書込手段と、特定の命令を実行する場合、前記スタック領域からデータを読み出すとともに、前記チェック用領域から前記データを読み出し、当該スタック領域から読み出された前記データと、前記チェック用領域から読み出された前記データとが一致するか否かを判定する判定手段と、前記判定手段による前記判定において前記データが一致しないと判定された場合、異常を検知する異常検知手段と、を備えることを特徴とする。
【０００７】
請求項２に記載の発明は、請求項１に記載の電子情報記憶媒体において、前記特定の命令は、条件分岐命令であり、前記判定手段による前記判定において前記データが一致すると判定された場合に限り、前記実行部は、当該データを条件判定のための値として前記条件分岐命令を実行することを特徴とする。
【０００８】
請求項３に記載の発明は、請求項１または２に記載の電子情報記憶媒体において、前記特定の命令は、関数呼び出し命令であり、前記判定手段による前記判定において前記データが一致すると判定された場合に限り、前記実行部は、当該データを引数として設定して関数呼び出し命令を実行することを特徴とする。
【０００９】
請求項４に記載の発明は、請求項１乃至３の何れか一項に記載の電子情報記憶媒体において、前記判定手段は、前記特定の命令が所定の複数回数実行される毎に、前記スタック領域からデータを読み出すとともに、前記チェック用領域から前記データを読み出し、当該スタック領域から読み出された前記データと、前記チェック用領域から読み出された前記データとが一致するか否かを判定することを特徴とする。
【００１０】
請求項５に記載の発明は、請求項１乃至４の何れか一項に記載の電子情報記憶媒体において、前記揮発性メモリは、前記スタック領域の全部または一部と同サイズの複数のチェック用領域を有し、前記書込手段は、前記命令の実行において用いられるデータを前記スタック領域に書き込む場合、当該データと同一のデータを前記複数のチェック用領域それぞれに書き込み、前記判定手段は、特定の命令を実行する場合、前記スタック領域からデータを読み出すとともに、前記複数のチェック用領域それぞれから前記データを読み出し、当該スタック領域から読み出された前記データと、前記複数のチェック用領域それぞれから読み出された前記データとが一致するか否かをそれぞれ判定し、前記異常検知手段は、前記判定手段による前記判定の何れかにおいて前記データが一致しないと判定された場合、異常を検知する。
【００１１】
請求項６に記載の発明は、複数の命令それぞれを示す識別番号を記述するアプリケーションを記憶する記憶部と、前記アプリケーションに記述された前記識別番号を実行順に取得し該取得した前記識別番号が示す前記命令を実行する実行部と、前記実行部により使用されるスタック領域及び当該スタック領域の全部または一部と同サイズのチェック用領域を有する揮発性メモリと、を備える電子情報記憶媒体における異常検知方法であって、前記実行部が、前記命令の実行において用いられるデータを前記スタック領域に書き込む場合、当該データと同一のデータを前記チェック用領域に書き込むステップと、前記実行部が、特定の命令を実行する場合、前記スタック領域からデータを読み出すとともに、前記チェック用領域から前記データを読み出し、当該スタック領域から読み出された前記データと、前記チェック用領域から読み出された前記データとが一致するか否かを判定するステップと、前記実行部が、前記判定において前記データが一致しないと判定された場合、異常を検知するステップと、を含むことを特徴とする異常検知方法。
【００１２】
請求項７に記載の発明は、複数の命令それぞれを示す識別番号を記述するアプリケーションを記憶する記憶部と、前記アプリケーションに記述された前記識別番号を実行順に取得し該取得した前記識別番号が示す前記命令を実行するコンピュータと、前記コンピュータにより使用されるスタック領域及び当該スタック領域の全部または一部と同サイズのチェック用領域を有する揮発性メモリと、を備える電子情報記憶媒体における前記コンピュータを、前記命令の実行において用いられるデータを前記スタック領域に書き込む場合、当該データと同一のデータを前記チェック用領域に書き込む書込手段と、特定の命令を実行する場合、前記スタック領域からデータを読み出すとともに、前記チェック用領域から前記データを読み出し、当該スタック領域から読み出された前記データと、前記チェック用領域から読み出された前記データとが一致するか否かを判定する判定手段と、前記判定手段による前記判定において前記データが一致しないと判定された場合、異常を検知する異常検知手段として機能させることを特徴とする。
【発明の効果】
【００１３】
本発明によれば、スタック領域を多重化することで、特殊なセンサーや複雑な検出機構を設けずに、外部からの攻撃に強い耐性を持つことができ、多重化による処理速度の低下を低く抑えることができる。
【図面の簡単な説明】
【００１４】
【図１】（Ａ）は、ＩＣチップ１ａのハードウェア構成例を示す図であり、（Ｂ）は、ＩＣチップ１ａの機能ブロック例を示す図であり、（Ｃ）は、スタック領域と多重化領域の一例を示す図である。
【図２】上記特定の命令として条件分岐命令が設定された場合のバイトコード処理の一例を示すフローチャートである。
【図３】上記特定の命令として関数呼び出し命令が設定された場合のバイトコード処理の一例を示すフローチャートである。
【発明を実施するための形態】
【００１５】
以下、図面を参照して本発明の実施形態について詳細に説明する。先ず、図１等を参照して、ＩＣカード１に搭載されたＩＣチップ１ａの概要構成及び機能について説明する。図１（Ａ）は、ＩＣチップ１ａのハードウェア構成例を示す図であり、図１（Ｂ）は、ＩＣチップ１ａの機能ブロック例を示す図である。なお、ＩＣカード１は、キャッシュカード、クレジットカード、電子マネーカード、社員カード等として使用される。或いは、ＩＣカード１は、スマートフォンや携帯電話機等の通信機器に組み込まれる。ＩＣチップ１ａは本発明における電子情報記憶媒体を構成するが、この電子情報記憶媒体は通信機器の回路基板上に直接組み込んで構成するようにしてもよい。
【００１６】
図１（Ａ）に示すように、ＩＣチップ１ａは、ＣＰＵ（Central Processing Unit）１０、ＲＯＭ（Read Only Memory）１１、データを一時的に記憶するための揮発性メモリであるＲＡＭ（Random Access Memory）１２、不揮発性メモリであるフラッシュメモリ１３（記憶部の一例）、及びＩ／Ｏ回路１４を備えて構成される。なお、フラッシュメモリの代わりに「Electrically Erasable Programmable Read-Only Memory」であっても構わない。Ｉ／Ｏ回路１４は、外部端末２とのインターフェイスを担う。これにより、ＩＣチップ１ａは、ＩＣリーダ・ライタを備える外部端末２との間で接触または非接触で通信を行うことができる。接触式のＩＣチップ１ａの場合、Ｉ／Ｏ回路１４には、例えば、Ｃ１〜Ｃ８の８個の端子が備えられている。例えば、Ｃ１端子は電源端子（ＩＣチップ１ａへ電源供給する端子）、Ｃ２端子はリセット端子、Ｃ３端子はクロック端子、Ｃ５端子はグランド端子、Ｃ７端子は外部端末２との間で通信を行うための端子である。一方、非接触式のＩＣチップ１ａの場合、Ｉ／Ｏ回路１４には、例えば、アンテナ、及び変復調回路が備えられている。なお、外部端末２の例としては、ＩＣカード発行機、ＡＴＭ、改札機、認証用ゲート等が挙げられる。或いは、ＩＣチップ１ａが通信機器に組み込まれる場合、外部端末２には通信機器の機能を担う制御部が該当する。
【００１７】
ＣＰＵ１０は、コンピュータの一例であり、図１（Ｂ）に示すハードウェアとして、フラッシュメモリ１３に記憶された各種プログラムを実行する演算装置である。各種プログラムには、ＯＳ（Operating System）、仮想マシンプログラム、Java（登録商標）等のプログラム言語で記述されるアプリケーションが含まれる。ＯＳ、及び仮想マシンプログラムは、複数のネイティブコード（実行コード群）で記述される。ＯＳは、ＩＣチップ１ａの動作を直接コントロールするソフトウェアである。ＯＳ、及び仮想マシンプログラムは、ＲＯＭ１１に記憶されてもよい。
【００１８】
仮想マシンプログラムは、ＣＰＵ１０を仮想マシン（実行部の一例）として機能させるプログラムである。ＯＳ上で動作する仮想マシンは、ソースコードとネイティブコードとの間の中間コードであるバイトコード（識別番号の一例、インデックスともいう）を解釈、実行する。プログラマーにより作成されたアプリケーションには、ソースコードが例えば実行順に記述される。そして、このようなアプリケーションは、コンパイラによって仮想マシンの実行形式に変換（つまり、ソースコードからバイトコードに変換）され、インストール（フラッシュメモリ１３に記憶）されることになる。このため、フラッシュメモリ１３に記憶されているアプリケーションは、複数の命令それぞれを示すバイトコードを例えば実行順に記述する。
【００１９】
仮想マシンは、アプリケーションに記述されたバイトコードを実行順に取得し、該取得したバイトコードを解釈して当該バイトコードが示す命令を実行する。当該命令の実行による処理を、バイトコード処理という。バイトコード処理の内容は、仮想マシンプログラムに規定されている。また、仮想マシンは、アプリケーションに記述された複数のバイトコードのうち、次に実行するべきバイトコードの位置（アプリケーションにおける位置）を特定可能な特定情報を指し示すプログラムカウンタを備える。ここで、特定情報の例として、バイトコードのアドレス（バイトコードが記憶されたフラッシュメモリ１３におけるアドレス）、バイトコードのオフセット、バイトコードのラベル値が挙げられる。例えば、公知のComputed gotoアルゴリズムでは、GNU C対応の拡張機能であるlabel as valueにより、ラベル値としてのアドレスに直接ジャンプすることができる。
【００２０】
また、ＲＡＭ１２は、仮想マシンにより使用されるスタック領域を有する。つまり、ＲＡＭ１２全体のメモリ領域のうち一部がスタック領域として割り当てられる。スタック領域は、後入れ先出しの構造を有し、仮想マシンによる命令の実行において用いられるデータを一時的に記憶する。より具体的に、スタック領域には、仮想マシンによりデータがフレーム単位で書き込まれ（スタック領域の先頭にプッシュされて積み上げられる）、その後、当該データはフレーム単位で読み出される（スタック領域の先頭からポップされる）構造になっている。スタック領域に書き込まれるデータには、ローカル変数（for、if等）、関数（メソッドともいう）の情報等が挙げられる。関数の情報には、例えば、関数呼び出し（関数コール）時に設定される引数や、関数で処理された結果として返される戻り値などがある。
【００２１】
さらに、ＲＡＭ１２は、上記スタック領域の全部または一部と同サイズの複数の多重化領域（チェック用領域）を有する。言い換えれば、スタック領域は多重化されている。ここでの多重化とは、スタック領域の一部または全体を複数のメモリ領域に重複して確保することを示す。例えば、一番使用されている出し入れが多いメモリ領域が多重化されるとよい。多重化領域は、スタック領域に書き込まれたデータをチェックするために当該データと同一のデータが書き込まれる領域であり、スタック領域と同じように後入れ先出しの構造を有する。図１（Ｃ）は、スタック領域と多重化領域の一例を示す図である。図１（Ｃ）の例では、ＲＡＭ１２に割り当てられたスタック領域、多重化領域Ａ、及び多重化領域Ｂを示す図である。図１（Ｃ）の例では、スタック領域は、ＲＡＭ１２のアドレス０ｘ００００（ｈ）〜０ｘ１０００（ｈ）に割り当てられている。一方、多重化領域Ａは、ＲＡＭ１２のアドレス０ｘ２０００（ｈ）〜０ｘ２１００（ｈ）に割り当てられ、多重化領域Ｂは、ＲＡＭ１２のアドレス０ｘ３０００（ｈ）〜０ｘ３１００（ｈ）に割り当てられている。つまり、この例では、スタック領域の一部分であるアドレス０ｘ００００（ｈ）〜０ｘ０１００（ｈ）が多重化されている。なお、多重化領域は、３つ以上設けられてもよく、多重化領域の数が増えるほど、セキュリティを向上させることができるが、その分、処理速度が低下するので、セキュリティと処理速度との兼ね合いから、多重化領域の数が決定されるとよい。また、多重化領域の数や多重化領域のサイズは、ＲＡＭ１２のメモリサイズに応じて決定されるとよい。
【００２２】
また、フラッシュメモリ１３には、異常検知プログラムが記憶される。異常検知プログラムは、仮想メモリを、本発明における書込手段、判定手段、及び異常検知手段として機能させる。具体的には、仮想マシンは、異常検知プログラムにより、取得したバイトコードが示す命令の実行において用いられる上記データをスタック領域に書き込む（プッシュする）場合、当該データと同一のデータ（同じ値）を複数の多重化領域Ａ，Ｂそれぞれにも書き込む（プッシュする）。なお、取得したバイトコードが示す命令が特定の命令である場合に限り、スタック領域にプッシュされたデータと同一のデータが複数の多重化領域Ａ，Ｂそれぞれに書き込まれるように構成してもよい。そして、仮想マシンは、特定の命令を実行する場合、スタック領域からデータを読み出す（ポップする）とともに、複数の多重化領域Ａ，Ｂそれぞれからデータを読み出し（ポップし）、当該スタック領域から読み出されたデータと、複数の多重化領域Ａ，Ｂそれぞれから読み出されたデータとが一致するか否かをそれぞれ判定（データチェック）する。つまり、この例の場合、スタック領域から読み出されたデータと、多重化領域Ａから読み出されたデータとが一致するか否かが判定され、且つ、スタック領域から読み出されたデータと、多重化領域Ｂから読み出されたデータとが一致するか否かが判定される。仮想マシンは、これらの判定の何れかにおいてデータが一致しないと判定した場合、異常を検知し、エラー処理を行う。このエラー処理により、例えば、異常検知されたことを示す応答が外部端末２へ出力され、ＩＣチップ１ａの動作が停止される。このような対策（構成）は、仮想マシンに実装（つまり、仮想マシンプログラム内に組み込む）できるため、ＩＣチップ１ａに後からインストールされるアプリケーション側での対策が不要となる。
【００２３】
なお、上記特定の命令として、セキュリティ上、重要な命令、例えば、条件分岐命令、関数（メソッド）呼び出し命令等が設定される。条件分岐命令の実行により、例えば条件判定のためにスタック領域から読み出された値と所定値とが比較され、例えば一致する場合に（条件分岐）、フラッシュメモリ１３から重要なデータが読み出される等の処理が行われる。このため、条件分岐命令は、複数種類の命令の中でも、セキュリティ上、重要な命令である。また、関数呼び出し命令の実行により、例えばスタック領域から読み出された引数が設定されて（渡されて）関数が呼び出され、呼び出された関数により規定された処理が行われ、その処理結果として戻り値が返される（スタック領域に書き込まれる）。関数により規定された処理には、引数に応じて条件分岐する場合がある。また、処理結果としての戻り値に応じて条件分岐する場合もある。このため、関数呼び出し命令は、条件分岐命令と同様、セキュリティ上、重要な命令である。なお、関数に設定される引数の数が多いほど、多重化領域Ａ，Ｂを多くとる（つまり、多重化領域Ａ，Ｂのサイズを大きく設定する）ように構成してもよい。また、関数に設定される引数がない場合、当該関数の呼び出し時に上記判定（データチェック）は行われない（つまり、当該関数の呼び出し命令が上記特定の命令として設定されない）ように構成するとよい。また、特定の命令には、暗号化処理等のセキュリティ処理において使用されるカウンタの値をインクリメントさせる命令であっても効果的である。上記のように判定（データチェック）のタイミングを特定の命令の実行時に限定することで、上記判定（データチェック）にかかる時間を減少させることが可能となる。
【００２４】
次に、図２及び図３を参照して、ＩＣチップ１ａの動作について説明する。図２は、上記特定の命令として条件分岐命令が設定された場合のバイトコード処理の一例を示すフローチャートである。図３は、上記特定の命令として関数呼び出し命令が設定された場合のバイトコード処理の一例を示すフローチャートである。
【００２５】
先ず、図２に示すバイトコード処理について説明する。例えば、外部端末２からコマンドが受信されると、アプリケーションが起動され、図２に示すバイトコード処理が開始される。図２に示すバイトコード処理が開始されると、仮想マシンは、プログラムカウンタが指し示す特定情報（例えばアドレス）に従って、バイトコードをアプリケーションから取得、解釈し（ステップＳ１）、当該バイトコードが示す命令が条件分岐命令であるか否かを判定する（ステップＳ２）。仮想マシンは、当該バイトコードが示す命令が条件分岐命令でないと判定した場合（ステップＳ２：ＮＯ）、当該バイトコードが示す命令を実行し（ステップＳ３）、その後、プログラムカウンタの値を進めて、ステップＳ１へ戻る。ステップＳ３の実行では、命令に応じてスタック領域が使用されるが、上述した判定（データチェック）は行われない。
【００２６】
一方、仮想マシンは、当該バイトコードが示す命令が条件分岐命令であると判定した場合（ステップＳ２：ＹＥＳ）、スタック領域、及び多重化領域Ａ，Ｂから、条件判定のための値を読み出す（ステップＳ４）。なお、ここで読み出される値は、例えば当該命令の前の命令の実行においてスタック領域、及び多重化領域Ａ，Ｂに同じタイミングで書き込まれた値である。
【００２７】
次いで、仮想マシンは、スタック領域から読み出した値と、多重化領域Ａから読み出した値とを比較し、互いの値が一致するか否かを判定する（ステップＳ５）。仮想マシンは、スタック領域から読み出した値と、多重化領域Ａから読み出した値とが一致すると判定した場合（ステップＳ５：ＹＥＳ）、ステップＳ６へ進む。一方、仮想マシンは、スタック領域から読み出した値と、多重化領域Ａから読み出した値とが一致しないと判定した場合（ステップＳ５：ＮＯ）、ステップＳ７へ進む。
【００２８】
ステップＳ６では、仮想マシンは、スタック領域から読み出した値と、多重化領域Ｂから読み出した値とを比較し、互いの値が一致するか否かを判定する。仮想マシンは、スタック領域から読み出した値と、多重化領域Ｂから読み出した値とが一致すると判定した場合（ステップＳ６：ＹＥＳ）、ステップＳ８へ進む。一方、仮想マシンは、スタック領域から読み出した値と、多重化領域Ｂから読み出した値とが一致しないと判定した場合（ステップＳ６：ＮＯ）、ステップＳ７へ進む。
【００２９】
ステップＳ７では、仮想マシンは、異常を検知し、エラー処理を行う。一方、ステップＳ８では、仮想マシンは、ステップＳ４でスタック領域から読み出した値を条件判定のための値として上記条件分岐命令を実行し、その後、プログラムカウンタの値を進めて、ステップＳ１へ戻る。つまり、この例では、上記ステップＳ５及びステップＳ６における判定の全てにおいて上記値が一致すると判定された場合に限り、仮想マシンは、当該値を条件判定のための値として条件分岐命令を実行することになる。この構成によれば、例えば、２つのレーザをＩＣチップ１ａの例えば上下から同時に照射するといった攻撃を多数回試行されることで、例えばスタック領域と多重化領域Ａに記憶されたデータが一致するように当該データが変化させられたとしても、これと同時に、スタック領域と多重化領域Ｂに記憶されたデータが一致させるように当該データが変化させられることは極めて困難であるため、このような攻撃を受けたときに高確率で異常を検知することができる。
【００３０】
また、ステップＳ５及びステップＳ６において比較対象となるデータを、条件判定のための値に限定することで、ステップＳ５及びステップＳ６における判定による処理速度の低下を低く抑えることができる。ただし、処理速度の低下の影響が少ないのであれば、当該条件判定のための値と当該条件判定のための値以外のデータとを含む所定範囲に記憶されているデータを比較対象としても構わない。この場合、仮想マシンは、例えば、スタック領域の所定範囲（例えば、アドレス０ｘ００００（ｈ）〜０ｘ０１００（ｈ））と、スタック領域の当該所定範囲と同サイズの多重化領域Ａの範囲（例えば、アドレス０ｘ２０００（ｈ）〜０ｘ２１００（ｈ）、つまり、多重化領域Ａの全範囲）とに記憶されたデータをそれぞれ取得し比較して互いのデータが一致するか否かを判定し、且つ、スタック領域の所定範囲（例えば、アドレス０ｘ００００（ｈ）〜０ｘ０１００（ｈ））と、スタック領域の当該所定範囲と同サイズの多重化領域Ｂの範囲（例えば、アドレス０ｘ３０００（ｈ）〜０ｘ３１００（ｈ）、つまり、多重化領域Ｂの全範囲）とに記憶されたデータをそれぞれ取得し比較して互いのデータが一致するか否かを判定する。そして、仮想マシンは、それぞれの判定の何れかにおいてデータが一致しないと判定した場合、異常を検知し、エラー処理を行うことになる。このような構成によれば、セキュリティを向上させることができる。
【００３１】
また、ステップＳ５及びステップＳ６において条件判定のための値を判定（データチェック）し異常がなければ、仮想マシンは、当該データチェック後の値を条件判定のための値として上記条件分岐命令を実行するように構成したので、よりセキュリティを向上させることができる。ただし、他の例として、ステップＳ５及びステップＳ６において条件判定のための値を判定（データチェック）する前に、上記条件分岐命令を実行する構成も考えられる。
【００３２】
次に、図３に示すバイトコード処理について説明する。図３に示すバイトコード処理は、図２に示すバイトコード処理と同様、例えば、外部端末２からコマンドが受信された時に開始される。図３に示すバイトコード処理が開始されると、仮想マシンは、プログラムカウンタが指し示す特定情報（例えばアドレス）に従って、バイトコードをアプリケーションから取得、解釈し（ステップＳ１１）、当該バイトコードが示す命令が関数呼び出し命令であるか否かを判定する（ステップＳ１２）。仮想マシンは、当該バイトコードが示す命令が関数呼び出し命令でないと判定した場合（ステップＳ１２：ＮＯ）、上記ステップＳ３と同様、当該バイトコードが示す命令を実行し（ステップＳ１３）、その後、プログラムカウンタの値を進めて、ステップＳ１１へ戻る。
【００３３】
一方、仮想マシンは、当該バイトコードが示す命令が関数呼び出し命令であると判定した場合（ステップＳ１２：ＹＥＳ）、スタック領域、及び多重化領域Ａ，Ｂから、例えば関数に設定する引数を読み出す（ステップＳ１４）。
【００３４】
次いで、仮想マシンは、スタック領域から読み出した引数と、多重化領域Ａから読み出した引数とを比較し、互いの引数が一致するか否かを判定する（ステップＳ１５）。仮想マシンは、スタック領域から読み出した引数と、多重化領域Ａから読み出した引数とが一致すると判定した場合（ステップＳ１５：ＹＥＳ）、ステップＳ１６へ進む。一方、仮想マシンは、スタック領域から読み出した引数と、多重化領域Ａから読み出した引数とが一致しないと判定した場合（ステップＳ１５：ＮＯ）、ステップＳ１７へ進む。
【００３５】
ステップＳ１６では、仮想マシンは、スタック領域から読み出した引数と、多重化領域Ｂから読み出した引数とを比較し、互いの引数が一致するか否かを判定する。仮想マシンは、スタック領域から読み出した引数と、多重化領域Ｂから読み出した引数とが一致すると判定した場合（ステップＳ１６：ＹＥＳ）、ステップＳ１８へ進む。一方、仮想マシンは、スタック領域から読み出した引数と、多重化領域Ｂから読み出した引数とが一致しないと判定した場合（ステップＳ１６：ＮＯ）、ステップＳ１７へ進む。
【００３６】
ステップＳ１７では、仮想マシンは、異常を検知し、エラー処理を行う。一方、ステップＳ１８では、仮想マシンは、ステップＳ１４でスタック領域から読み出した引数を設定して上記関数呼び出し命令を実行し、これにより関数が読み出され、呼び出された関数により規定された処理が行われ、その処理結果として戻り値が返される。その後、仮想マシンはプログラムカウンタの値を進めて、ステップＳ１１へ戻る。つまり、この例では、上記ステップＳ１５及びステップＳ１６における判定の全てにおいて上記引数が一致すると判定された場合に限り、仮想マシンは、当該引数を設定して関数呼び出し命令を実行することになる。この構成によれば、図２に示すバイトコード処理と同様、上述した攻撃を受けたときに高確率で異常を検知することができる。
【００３７】
また、ステップＳ１５及びステップＳ１６において比較対象となるデータを、上記引数に限定することで、ステップＳ１５及びステップＳ１６における判定による処理速度の低下を低く抑えることができる。ただし、処理速度の低下の影響が少ないのであれば、図２に示すバイトコード処理と同様、当該引数と当該引数以外のデータとを含む所定範囲に記憶されているデータを比較対象としても構わない。
【００３８】
また、ステップＳ１５及びステップＳ１６において引数を判定（データチェック）し異常がなければ、仮想マシンは、当該データチェック後の引数を設定して上記関数呼び出し命令を実行するように構成したので、よりセキュリティを向上させることができる。ただし、他の例として、ステップＳ１５及びステップＳ１６において引数を判定（データチェック）する前に、上記関数呼び出し命令を実行する構成も考えられる。
【００３９】
以上説明したように、上記実施形態によれば、仮想マシンは、命令の実行において用いられるデータをスタック領域に書き込む場合、当該データと同一のデータを複数の多重化領域それぞれに書き込み、特定の命令を実行する場合、スタック領域からデータを読み出すとともに、複数の多重化領域それぞれからデータを読み出し、当該スタック領域から読み出されたデータと、複数の多重化領域それぞれから読み出されたデータとが一致するか否かをそれぞれ判定し、当該判定の何れかにおいてデータが一致しないと判定された場合、異常を検知するように構成したので、特殊なセンサーや複雑な検出機構を設けずに、外部からの攻撃に強い耐性を持つことができ、また、多重化する対象がメモリ全体ではなくスタック領域に限定しているため、多重化による処理速度の低下を低く抑えることができる。
【００４０】
なお、上記実施形態において、仮想マシンは、上述した特定の命令の実行回数をカウント（例えば、当該特定の命令が実行される毎にカウント値が１増加する）し、当該特定の命令が所定の複数回数実行される毎に、スタック領域からデータを読み出すとともに、複数の多重化領域それぞれからデータを読み出し、当該スタック領域から読み出されたデータと、複数の多重化領域それぞれから読み出されたデータとが一致するか否かをそれぞれ判定し、これらの判定の何れかにおいてデータが一致しないと判定した場合、異常を検知するように構成してもよい。このように構成すれば、多重化による処理速度の低下を最小限に抑えることができる。
【００４１】
また、上記実施形態においては、スタック領域の全部または一部と同サイズの多重化領域が複数設けれた例を示したが、この多重化領域は１つであっても一定の効果をあげることができる。この場合、仮想マシンは、上述した特定の命令の実行において用いられるデータをスタック領域に書き込む場合、当該データと同一のデータを多重化領域に書き込み、特定の命令を実行する場合、スタック領域からデータを読み出すとともに、当該多重化領域から上記データを読み出し、当該スタック領域から読み出されたデータと、当該多重化領域から読み出されたデータとが一致するか否かを判定し、当該判定においてデータが一致しないと判定された場合、異常を検知する。このような構成によっても、特殊なセンサーや複雑な検出機構を設けずに、外部からの攻撃に耐性を持つことができる。また、多重化領域を増やすことは、処理速度とのトレードオフの関係になるが、状況に応じて、多重化領域を一つにしたり、或いは複数にしたりというように適宜設定される。
【００４２】
また、上記実施形態においては、本発明の電子情報記憶媒体の一例としてＩＣチップ１ａを例にとって説明したが、本発明は、組込み型のマイクロチップ等に対して適用することもできる。
【符号の説明】
【００４３】
１  ＩＣカード
２  外部端末
１ａ  ＩＣチップ
１０  ＣＰＵ
１１  ＲＯＭ
１２  ＲＡＭ
１３  フラッシュメモリ
１４  Ｉ／Ｏ回路
【図１】
0006424633.tif 000002
【図２】
0006424633.tif 000003
【図３】
0006424633.tif 000004