(57)【要約】【課題】最低限のメモリリソースの消費で故障利用攻撃に対応することが可能な電子情報記憶媒体、ＩＣカード、データ異常確認方法、及びデータ異常確認プログラムを提供する。【解決手段】仮想マシンは、スタック領域に正規データを格納するときに、当該正規データの異常を判定するための冗長データを、スタック領域以外の冗長データ格納領域に格納し、且つ当該冗長データが格納されていることを示す格納済フラグをフラグ設定領域において設定する。そして、仮想マシンは、スタック領域から正規データを取り出すときに、格納済フラグが設定されている場合、正規データと冗長データとを用いて正規データの異常の有無を確認し、正規データに異常がないことが確認された場合、格納済フラグの設定を解除し、且つ、正規データをスタック領域から取り出す。【選択図】図４
2018088147.tif 000002
【特許請求の範囲】
【請求項１】
スタック領域を含むデータ格納領域を有するメモリを備える電子情報記憶媒体であって、
前記スタック領域にデータを格納するときに、当該データの異常の有無を確認するための冗長データを前記スタック領域以外の前記データ格納領域に格納し、且つ前記冗長データが格納されていることを示す格納済フラグを設定する設定手段と、
前記スタック領域から前記データを取り出すときに、前記格納済フラグが設定されている場合、前記データと前記冗長データとを用いて前記データの異常の有無を確認する確認手段と、
前記確認手段により前記データに異常がないことが確認された場合、前記格納済フラグの設定を解除し、且つ、前記データをスタック領域から取り出す取出手段と、
を備えることを特徴とする電子情報記憶媒体。
【請求項２】
前記スタック領域に格納される前記データは、メソッド呼び出し命令に応じて呼び出されたメソッドの処理結果としての戻り値であり、
前記設定手段は、前記呼び出されたメソッドから呼び出し元への復帰処理において、前記格納済フラグが設定されている場合、確認要求フラグを設定し、
前記確認手段は、前記スタック領域から前記データを取り出すときに、前記確認要求フラグが設定されている場合に限り、前記データの異常の有無を確認し、
前記取出手段は、前記確認手段により前記データに異常がないことが確認された場合、前記格納済フラグ及び前記確認要求フラグの設定を解除し、且つ、前記データをスタック領域から取り出すことを特徴とする請求項１に記載の電子情報記憶媒体。
【請求項３】
前記スタック領域に格納される前記データは、メソッド呼び出し命令に応じて呼び出されたメソッドの処理結果としての戻り値であり、
前記確認手段は、前記スタック領域から前記データを取り出すときに、前記格納済フラグが設定されており、且つ前記メソッドの呼び出し元が条件分岐命令である場合に限り、前記データの異常の有無を確認することを特徴とする請求項１に記載の電子情報記憶媒体。
【請求項４】
前記メソッドは、電子情報記憶媒体に搭載されたＡＰＩにより提供され、戻り値の型が標準的に定められているメソッドであることを特徴とする請求項２または３に記載の電子情報記憶媒体。
【請求項５】
前記設定手段は、前記スタック領域にデータを格納するときに、当該データの型が真の値と偽の値との何れかを示す論理値型である場合に限り、当該データの異常の有無を確認するための冗長データを前記スタック領域以外の前記データ格納領域に格納し、且つ前記冗長データが格納されていることを示す格納済フラグを設定することを特徴とする請求項１に記載の電子情報記憶媒体。
【請求項６】
スタック領域を含むデータ格納領域を有するメモリを備えるＩＣカードであって、
前記スタック領域にデータを格納するときに、当該データの異常の有無を確認するための冗長データを前記スタック領域以外の前記データ格納領域に格納し、且つ前記冗長データが格納されていることを示す格納済フラグを設定する設定手段と、
前記スタック領域から前記データを取り出すときに、前記格納済フラグが設定されている場合、前記データと前記冗長データとを用いて前記データの異常の有無を確認する確認手段と、
前記確認手段により前記データに異常がないことが確認された場合、前記格納済フラグの設定を解除し、且つ、前記データをスタック領域から取り出す取出手段と、
を備えることを特徴とするＩＣカード。
【請求項７】
スタック領域を含むデータ格納領域を有するメモリを備える電子情報記憶媒体に含まれるプロセッサにより実行されるデータ異常確認方法であって、
前記スタック領域にデータを格納するときに、当該データの異常の有無を確認するための冗長データを前記スタック領域以外の前記データ格納領域に格納し、且つ前記冗長データが格納されていることを示す格納済フラグを設定するステップと、
前記スタック領域から前記データを取り出すときに、前記格納済フラグが設定されている場合、前記データと前記冗長データとを用いて前記データの異常の有無を確認するステップと、
前記データに異常がないことが確認された場合、前記格納済フラグの設定を解除し、且つ、前記データをスタック領域から取り出すステップと、
を含むことを特徴とするデータ異常確認方法。
【請求項８】
スタック領域を含むデータ格納領域を有するメモリを備えるコンピュータを、
前記スタック領域にデータを格納するときに、当該データの異常の有無を確認するための冗長データを前記スタック領域以外の前記データ格納領域に格納し、且つ前記冗長データが格納されていることを示す格納済フラグを設定する設定手段と、
前記スタック領域から前記データを取り出すときに、前記格納済フラグが設定されている場合、前記データと前記冗長データとを用いて前記データの異常の有無を確認する確認手段と、
前記確認手段により前記データに異常がないことが確認された場合、前記格納済フラグの設定を解除し、且つ、前記データをスタック領域から取り出す取出手段として機能させることを特徴とするデータ異常確認プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
故障利用攻撃に対する対策がとられたＩＣカード等の技術分野に関する。
【背景技術】
【０００２】
セキュリティ性が要求されるＩＣカードでは、外部からの攻撃などによる不正動作に対する対策が採られている必要がある。外部からの攻撃とは、ＩＣカードに搭載されたＩＣチップに誤動作を起こさせるための方法であり、代表的な攻撃方法として、例えば、ＩＣチップに対してレーザ照射を行うことでメモリに記憶されたデータを変化させる故障利用攻撃が知られている。このような故障利用攻撃への対策として、特許文献１には、故障攻撃を受けてメモリの内容が改竄されたときに、メモリの内容が変換され易い値と同じ値であるオペコードや、誤変換されて実行されるとセキュリティ的に問題が発生する可能性のあるオペコードに指定オペコードを指定し、バーチャルマシンが、実行オペコードが指定オペコードであって、かつ、実行オペコードの正当性の検証に失敗したときに、故障攻撃に対処する処理として、バーチャルマシンの動作を停止する処理などを実行することで、メモリの内容を改竄する故障攻撃によってセキュリティデバイスが誤動作するリスクを軽減する技術が開示されている。
【０００３】
一方、マルチアプリケーション用のＩＣカードにおいては、Java（登録商標） Card Virtual Machineと呼ばれるJavaの下位互換の仮想マシンが組み込まれ、アプリケーションの追加や削除が可能になっている。このようなＩＣカードでは、ＩＣチップに依存しないバイトコードを実行可能な環境を用意し、当該バイトコードによってアプリケーションを提供することで、開発者がＩＣチップの相違を意識することなく、アプリケーションの実装、搭載を可能とする。例えば、ＩＣチップには、Java実行環境として、Java Card APIが搭載され、Java言語によるアプリケーション開発を実現している。また、Javaで提供される変数は、特定のデータ型（例えば、int型、long型、short型、byte型、boolean型）を持ち、その変数にはその型の値しか入れることができないようになっている。これらのデータ型のうち、boolean型は、正（true）の値“0x0001”と否（false）の値“0x0000”との何れかを示し、ＩＣカードに搭載されるアプリケーションにおいて条件分岐に用いられる。条件分岐では、比較などの処理結果としての戻り値が、正の値であるか、或いは否の値であるかによって、複数の実行対象の何れかが選択的に実行される。ここで、処理結果としての戻り値（つまり、boolean型の値）は、ＩＣチップ内のメモリのスタック領域に確認される。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特許第５２００６６４号
【発明の概要】
【発明が解決しようとする課題】
【０００５】
ところで、上述した故障利用攻撃によって、スタック領域上のboolean型の値を別の値に変更、例えば、上記条件分岐において正の値と否の値とが逆になるように変更することは比較的容易である。これは、boolean型の正（真）の値“0x0001”と否（偽）の値“0x0000”とのハミング距離が１であるからである。この対策として、boolean型を使わずに、よりハミング距離が大きくなるよう正、否を新たに定義して利用することも可能ではあるが、標準的なメソッド、例えば上述したJava Card APIの仕様に基づくメソッドは、上述したように正の値と否の値とが決まっており、変更することができない。一方、上記仮想マシンでスタック領域の破壊を検知するためには、当該スタック領域のチェックコードを計算したり、或いはスタック領域を二重化するなどの対策が考えられるが、これは、メモリリソースやＣＰＵの処理速度の制限されたＩＣカードにおいて実現は難しい。
【０００６】
そこで、本発明は、このような点に鑑みてなされたものであり、最低限のメモリリソースの消費で故障利用攻撃に対応することが可能な電子情報記憶媒体、ＩＣカード、データ異常確認方法、及びデータ異常確認プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００７】
上記課題を解決するために、請求項１に記載の発明は、スタック領域を含むデータ格納領域を有するメモリを備える電子情報記憶媒体であって、前記スタック領域にデータを格納するときに、当該データの異常の有無を確認するための冗長データを前記スタック領域以外の前記データ格納領域に格納し、且つ前記冗長データが格納されていることを示す格納済フラグを設定する設定手段と、前記スタック領域から前記データを取り出すときに、前記格納済フラグが設定されている場合、前記データと前記冗長データとを用いて前記データの異常の有無を確認する確認手段と、前記確認手段により前記データに異常がないことが確認された場合、前記格納済フラグの設定を解除し、且つ、前記データをスタック領域から取り出す取出手段と、を備えることを特徴とする。
【０００８】
請求項２に記載の発明は、請求項１に記載の電子情報記憶媒体において、前記スタック領域に格納される前記データは、メソッド呼び出し命令に応じて呼び出されたメソッドの処理結果としての戻り値であり、前記設定手段は、前記呼び出されたメソッドから呼び出し元への復帰処理において、前記格納済フラグが設定されている場合、確認要求フラグを設定し、前記確認手段は、前記スタック領域から前記データを取り出すときに、前記確認要求フラグが設定されている場合に限り、前記データの異常の有無を確認し、前記取出手段は、前記確認手段により前記データに異常がないことが確認された場合、前記格納済フラグ及び前記確認要求フラグの設定を解除し、且つ、前記データをスタック領域から取り出すことを特徴とする。
【０００９】
請求項３に記載の発明は、請求項１に記載の電子情報記憶媒体において、前記スタック領域に格納される前記データは、メソッド呼び出し命令に応じて呼び出されたメソッドの処理結果としての戻り値であり、前記確認手段は、前記スタック領域から前記データを取り出すときに、前記格納済フラグが設定されており、且つ前記メソッドの呼び出し元が条件分岐命令である場合に限り、前記データの異常の有無を確認することを特徴とする。
【００１０】
請求項４に記載の発明は、請求項２または３に記載の電子情報記憶媒体において、前記メソッドは、電子情報記憶媒体に搭載されたＡＰＩにより提供され、戻り値の型が標準的に定められているメソッドであることを特徴とする。
【００１１】
請求項５に記載の発明は、請求項１に記載の電子情報記憶媒体において、前記設定手段は、前記スタック領域にデータを格納するときに、当該データの型が真の値と偽の値との何れかを示す論理値型である場合に限り、当該データの異常の有無を確認するための冗長データを前記スタック領域以外の前記データ格納領域に格納し、且つ前記冗長データが格納されていることを示す格納済フラグを設定することを特徴とする。
【００１２】
請求項６に記載の発明は、スタック領域を含むデータ格納領域を有するメモリを備えるＩＣカードであって、前記スタック領域にデータを格納するときに、当該データの異常の有無を確認するための冗長データを前記スタック領域以外の前記データ格納領域に格納し、且つ前記冗長データが格納されていることを示す格納済フラグを設定する設定手段と、前記スタック領域から前記データを取り出すときに、前記格納済フラグが設定されている場合、前記データと前記冗長データとを用いて前記データの異常の有無を確認する確認手段と、前記確認手段により前記データに異常がないことが確認された場合、前記格納済フラグの設定を解除し、且つ、前記データをスタック領域から取り出す取出手段と、を備えることを特徴とする。
【００１３】
請求項７に記載の発明は、スタック領域を含むデータ格納領域を有するメモリを備える電子情報記憶媒体に含まれるプロセッサにより実行されるデータ異常確認方法であって、前記スタック領域にデータを格納するときに、当該データの異常の有無を確認するための冗長データを前記スタック領域以外の前記データ格納領域に格納し、且つ前記冗長データが格納されていることを示す格納済フラグを設定するステップと、前記スタック領域から前記データを取り出すときに、前記格納済フラグが設定されている場合、前記データと前記冗長データとを用いて前記データの異常の有無を確認するステップと、前記データに異常がないことが確認された場合、前記格納済フラグの設定を解除し、且つ、前記データをスタック領域から取り出すステップと、を含むことを特徴とする。
【００１４】
請求項８に記載の発明は、スタック領域を含むデータ格納領域を有するメモリを備えるコンピュータを、前記スタック領域にデータを格納するときに、当該データの異常の有無を確認するための冗長データを前記スタック領域以外の前記データ格納領域に格納し、且つ前記冗長データが格納されていることを示す格納済フラグを設定する設定手段と、前記スタック領域から前記データを取り出すときに、前記格納済フラグが設定されている場合、前記データと前記冗長データとを用いて前記データの異常の有無を確認する確認手段と、前記確認手段により前記データに異常がないことが確認された場合、前記格納済フラグの設定を解除し、且つ、前記データをスタック領域から取り出す取出手段として機能させることを特徴とする。
【発明の効果】
【００１５】
本発明によれば、最低限のメモリリソースの消費で故障利用攻撃に対応することができる。
【図面の簡単な説明】
【００１６】
【図１】ＩＣカード１のハードウェア構成例を示す図である。
【図２】（Ａ）は、ＩＣカード１のソフトウェア構成例を示す図であり、（Ｂ）は、スタック領域を示す概念図である。
【図３】外部装置２からのコマンドがＩＣチップ１ａにより受信された後、仮想マシンによりメソッドが呼び出されるときのバイトコード処理の一例を示すフローチャートである。
【図４】（Ａ）は、実施例１において、図３に示すステップＳ３におけるｐｕｓｈ処理の詳細を示すフローチャートであり、（Ｂ）は、実施例１において、図３に示すステップＳ４におけるｒｅｔｕｒｎ処理の詳細を示すフローチャートであり、（Ｃ）は、実施例１において、図３に示すステップＳ５におけるｐｏｐ処理の詳細を示すフローチャートである。
【図５】（Ａ）は、実施例２において、図３に示すステップＳ３におけるｐｕｓｈ処理の詳細を示すフローチャートであり、（Ｂ）は、実施例２において、図３に示すステップＳ５におけるｐｏｐ処理の詳細を示すフローチャートである。
【図６】（Ａ）は、実施例３において、図３に示すステップＳ３におけるｐｕｓｈ処理の詳細を示すフローチャートであり、（Ｂ）は、実施例３において、図３に示すステップＳ５におけるｐｏｐ処理の詳細を示すフローチャートである。
【発明を実施するための形態】
【００１７】
以下、図面を参照して本発明の実施形態について詳細に説明する。以下に説明する実施形態は、ＩＣチップを搭載するＩＣカードに対して本発明を適用した場合の実施の形態である。
【００１８】
先ず、図１等を参照して、ＩＣカード１の概要構成及び機能について説明する。図１は、ＩＣカード１のハードウェア構成例を示す図であり、図２（Ａ）は、ＩＣカード１のソフトウェア構成例を示す図である。図１に示すように、ＩＣカード１に搭載されるＩＣチップ１ａは、ＣＰＵ（Central Processing Unit）１０、ＲＯＭ（Read Only Memory）１１、ＲＡＭ（Random Access Memory）１２、不揮発性メモリ１３、及びＩ／Ｏ回路１４等を備えて構成される。ここで、ＩＣチップ１ａは、本発明の電子情報記憶媒体及びコンピュータの一例である。なお、ＩＣカード１は、キャッシュカード、クレジットカード、社員カード等として使用される。或いは、ＩＣカード１は、スマートフォンや携帯電話機等の端末装置に組み込まれてもよい。或いは、ＩＣチップ１ａは、例えばeUICC（Embedded Universal Integrated Circuit Card）として、端末装置から容易に取り外しや取り換えができないように端末装置と一体的に搭載されてもよい。
【００１９】
不揮発性メモリ１３は、例えばフラッシュメモリである。なお、不揮発性メモリ１３は、「Electrically Erasable Programmable Read-Only Memory」であってもよい。また、Ｉ／Ｏ回路１４は、外部装置２（リーダライタを含む）とのインターフェイスを担う。接触式のＩＣチップ１ａの場合、Ｉ／Ｏ回路１４には、例えば、ISO7816で規定されるＣ１〜Ｃ８の８個の端子が備えられている。例えば、Ｃ１端子は電源端子、Ｃ２端子はリセット端子、Ｃ３端子はクロック端子、Ｃ５端子はグランド端子、Ｃ７端子は外部装置２との間で通信を行うための端子である。一方、非接触式のＩＣチップ１ａの場合、Ｉ／Ｏ回路１４には、例えば、アンテナ、及び変復調回路が備えられている。なお、外部装置２の例としては、ＩＣカードの検査機、ＡＴＭ、改札機、認証用ゲート、店舗端末等が挙げられる。或いは、ＩＣチップ１ａが端末装置に組み込まれる場合、外部装置２には端末装置の機能を担う制御部が該当する。
【００２０】
ＣＰＵ１０は、ＲＯＭ１１または不揮発性メモリ１３に記憶された各種プログラムを実行するプロセッサである。各種プログラムには、ＯＳ（Operating System）、仮想マシン、ＡＰＩ（Application Programming Interface）、及びアプリケーションのそれぞれに対応するプログラムが含まれる。これにより、図２（Ａ）に示すように、ＩＣチップ１ａ上で、ＯＳ、仮想マシン、ＡＰＩ、及びアプリケーションが動作する。なお、例えば、仮想マシンに対応するプログラムには、本発明のデータ異常確認プログラムが含まれる。また、仮想マシンは、本発明における設定手段、確認手段、及び取出手段等の一例である。
【００２１】
ＲＡＭ１２は、作業用メモリとして利用される。ＲＡＭ１２のメモリ領域には、スタック領域、冗長データ格納領域、及びフラグ設定領域等が割り当てられる。ここで、スタック領域は、後入れ先出しの構造を有し、命令（例えば、書き込み命令、読み出し命令、論理演算命令、条件分岐命令、メソッド呼び出し命令など）の実行において用いられるデータ（以下、「正規データ」という）を一時的に格納するための領域である。図２（Ｂ）は、スタック領域を示す概念図である。図２（Ｂ）に示すように、スタック領域には、正規データがフレーム単位で書き込まれ（図２（Ｂ）の例では、スタックポインタが指し示す先頭アドレス“0x1000”（１６進数を示す）に正規データがプッシュされて積み上げられる）、その後、当該正規データはフレーム単位で取り（読み）出される（スタック領域の先頭からポップされる）。スタック領域に格納される正規データの例として、ローカル変数（if<cond>等）やメソッドに関する情報等が挙げられる。メソッドに関する情報には、メソッド呼び出し命令に応じて呼び出されたメソッドの処理結果としての戻り値が含まれる。また、冗長データ格納領域は、正規データの異常の有無を確認するための冗長データを一時的に格納するための領域である。冗長データは正規データの異常の有無を確認するためのデータであり、具体的には、例えば正規データと任意のデータとの排他的論理和、正規データから演算した結果であるハッシュ値、チェックサム値、またはCRC（Cyclic Redundancy Check）を用いることができる。また、冗長データは正規データと同じ値を使用して異常を確認してもよい。また、フラグ設定領域は、冗長データが格納されていることを示す格納済フラグと、正規データの異常の有無を確認要求するための確認要求フラグとをそれぞれ設定するための領域である。
【００２２】
ＯＳは、例えばデータ通信やメモリへの読み書きなど、ＩＣチップ１ａの基本的な機能を担う。仮想マシンは、例えばJava Card Virtual Machineであり、ＯＳ上でバイトコード（ソースコードとネイティブコードとの間の中間コード）を解釈し、当該バイトコードに応じた上記命令を実行するバイトコード処理を行う。このバイトコード処理において、仮想マシンによりスタック領域、冗長データ格納領域、及びフラグ設定領域が使用される。ＡＰＩは、例えばJava Card APIであり、Java AppletからJavaの基本的なメソッド等の機能を使用するためのインターフェイスである。ＡＰＩから提供されるメソッドとして、例えば、ＰＩＮ（照合鍵）を照合するためのメソッドが挙げられる。このメソッドの処理結果（照合結果）としての戻り値の型は、Java Card APIの仕様で標準的に定められたboolean型であり、正（真）の値が“0x0001”、否（偽）の値が“0x0000”になっている。アプリケーションは、例えばJava Appletであり、Java言語で実行順に記述されたソースコードがコンパイラによって仮想マシンの実行形式に変換（つまり、ソースコードからバイトコードに変換）されインストールされる。なお、仮想マシンは、アプリケーションに記述された複数のバイトコードのうち、次に実行するべきバイトコードの位置（言い換えれば、アプリケーションにおける位置）を指し示すプログラムカウンタと、上述したスタックポインタとを有する。
【００２３】
以上の構成において、仮想マシンは、スタック領域に正規データを格納（プッシュ）するときに、当該正規データの異常を判定するための冗長データを、スタック領域以外の冗長データ格納領域に格納し、且つ当該冗長データが格納されていることを示す格納済フラグをフラグ設定領域において設定（例えば、“0x00”から“0xFF”に設定）する。そして、仮想マシンは、スタック領域から正規データを取り出すときに、格納済フラグが設定（例えば、“0xFF”に設定）されている場合、正規データと冗長データとを用いて正規データの異常の有無を確認し、正規データに異常がないことが確認された場合、格納済フラグの設定を解除（例えば、“0xFF”から“0x00”に解除）し、且つ、正規データをスタック領域から取り出す（ポップする）。
【００２４】
次に、図３を参照して、ＡＰＩにより提供されるメソッドが呼び出されるときのバイトコード処理について説明する。図３は、外部装置２からのコマンドがＩＣチップ１ａにより受信された後、仮想マシンによりメソッドが呼び出されるときのバイトコード処理の一例を示すフローチャートである。
【００２５】
図３に示すステップＳ１では、仮想マシンは、プログラムカウンタが指し示す位置（例えば、バイトコードのアドレス、オフセット、またはラベル値）に従って、アプリケーションからバイトコードを特定し、解釈する。次いで、仮想マシンは、ステップＳ１で解釈されたバイトコードに応じた命令を実行する（ステップＳ２）。例えば、ステップＳ２において、仮想マシンは、ステップＳ１で解釈されたバイトコードに応じた命令（例えば、条件分岐命）中のメソッド呼び出し命令にしたがって、プログラムカウンタの値を呼び出し先のメソッド（ＡＰＩにより提供されるメソッド）の先頭に変更することで当該メソッドを呼び出す。或いは、仮想マシンは、ステップＳ１で解釈されたバイトコードに応じた命令（例えば、読み出し命令）にしたがって、不揮発性メモリ１３から正規データを読み出す。
【００２６】
次いで、仮想マシンは、ステップＳ２の命令の実行により得られた正規データを、スタックポインタが指し示す先頭に格納するｐｕｓｈ処理を実行する（ステップＳ３）。例えば、ステップＳ３において、仮想マシンは、上記メソッド呼び出し命令に応じて呼び出されたメソッドの処理結果としての戻り値を、正規データとしてスタックポインタが指し示す先頭に格納するｐｕｓｈ処理を実行する。この場合、仮想マシンは、プログラムカウンタの値を呼び出し元の位置（メソッド呼び出し命令の直後の位置）に変更することで当該呼び出し元へ戻るｒｅｔｕｒｎ処理（つまり、呼び出されたメソッドから呼び出し元への復帰処理）を実行する（ステップＳ４）。なお、ステップＳ１で解釈されたバイトコードに応じた命令がメソッド呼び出し命令でない場合、ステップＳ４の処理は行われない。
【００２７】
次いで、仮想マシンは、スタックポインタが指し示す、スタック領域の先頭から正規データを取り出すｐｏｐ処理を実行する（ステップＳ５）。次いで、仮想マシンは、ステップＳ５でスタック領域から取り出した正規データを用いて処理を行う（ステップＳ６）。例えば、仮想マシンは、ステップＳ６において、呼び出し元の命令（例えば、条件分岐命）に応じた処理（例えば、条件分岐処理）を行う。
【００２８】
次に、図３に示すバイトコード処理において行われる、正規データの異常の有無を確認する処理について、実施例１〜実施例３に分けて説明する。
【００２９】
（実施例１）
先ず、図４を参照して、実施例１において正規データの異常の有無を確認する処理について説明する。図４（Ａ）は、実施例１において、図３に示すステップＳ３におけるｐｕｓｈ処理の詳細を示すフローチャートであり、図４（Ｂ）は、実施例１において、図３に示すステップＳ４におけるｒｅｔｕｒｎ処理の詳細を示すフローチャートであり、図４（Ｃ）は、実施例１において、図３に示すステップＳ５におけるｐｏｐ処理の詳細を示すフローチャートである。
【００３０】
図４（Ａ）に示すｐｕｓｈ処理では、仮想マシンは、ステップＳ２の命令の実行により得られた正規データと、予め用意された任意のデータ“0xFFFF”との排他的論理和の演算を行う（ステップＳ３１１）。例えば、“0xFFFF”により正規データがＸＯＲ変換される。次いで、仮想マシンは、ステップＳ３１１の演算結果を、上記正規データに対応する冗長データ（つまり、当該正規データの異常の有無を確認するための冗長データ）として冗長データ格納領域に格納する（ステップＳ３１２）。なお、冗長データ格納領域に格納される冗長データは、正規データ自体であってもよい。或いは、冗長データ格納領域に格納される冗長データは、正規データから演算した結果であるハッシュ値、チェックサム値、またはCRCであってもよい。次いで、仮想マシンは、フラグ設定領域に格納済フラグを設定（例えば、“0xFF”に設定）する（ステップＳ３１３）。次いで、仮想マシンは、スタックポインタを変更（先頭に変更）する（ステップＳ３１４）。次いで、仮想マシンは、ステップＳ３１４で変更されたスタックポインタが指し示す先頭に上記正規データを格納する（ステップＳ３１５）。
【００３１】
次に、上記ステップＳ４に示すｒｅｔｕｒｎ処理が行われる場合、図４（Ｂ）に示すように、仮想マシンは、フラグ設定領域において格納済フラグが設定されているか否かを判定する。言い換えれば、格納済フラグの設定有無により、冗長データ格納領域に冗長データが格納されているか否かが判定される。仮想マシンは、格納済フラグが設定されている（例えば、フラグ設定領域に格納済フラグとして“0xFF”が格納されている）と判定した場合（ステップＳ４１１：ＹＥＳ）、ステップＳ４１２へ進む。一方、仮想マシンは、格納済フラグが設定されていないと判定した場合（ステップＳ４１１：ＮＯ）、ステップＳ４１３へ進む。ステップＳ４１２では、仮想マシンは、フラグ設定領域（例えば、格納済フラグが設定される数バイトの領域の直後の数バイトの領域）に確認要求フラグを設定（例えば、“0xFF”に設定）し、ステップＳ４１３へ進む。ステップＳ４１３では、仮想メモリは、プログラムカウンタの値を呼び出し元の位置に変更することでメソッドの呼び出し元へ戻す。
【００３２】
次に、図４（Ｃ）に示すｐｏｐ処理では、仮想マシンは、フラグ設定領域において確認要求フラグが設定されているか否かを判定する（ステップＳ５１１）。仮想マシンは、確認要求フラグが設定されていると判定した場合（ステップＳ５１１：ＹＥＳ）、ステップＳ５１２へ進む。一方、仮想マシンは、確認要求フラグが設定されていないと判定した場合（ステップＳ５１１：ＮＯ）、ステップＳ５１４へ進む。ステップＳ５１２では、仮想マシンは、上記正規データと、冗長データ格納領域に格納された冗長データとを用いて正規データの異常の有無を判定（確認）する。例えば、仮想マシンは、当該冗長データと、予め用意された任意のデータ“0xFFFF”との排他的論理和の演算結果（例えば、“0xFFFF”により冗長データがＸＯＲ変換された結果）と、スタック領域の先頭に格納されている正規データとが一致（つまり、冗長データが正規データに整合）すれば、正規データが改竄されていないので、正規データに異常が無いと判定する。なお、ステップＳ３１２で正規データ自体が冗長データとして冗長データ格納領域に格納された場合、当該冗長データと、スタック領域の先頭に格納されている正規データとが一致（つまり、冗長データが正規データに整合）すれば、正規データが改竄されていないので、正規データに異常が無いと判定される。或いは、ステップＳ３１２で、正規データから演算した結果であるハッシュ値、チェックサム値、またはCRCが冗長データとして冗長データ格納領域に格納された場合、当該冗長データと、ステップＳ５１２のタイミングで正規データから演算した結果であるハッシュ値、チェックサム値、またはCRCとが一致すれば、正規データが改竄されていないので、正規データに異常が無いと判定される。
【００３３】
そして、仮想マシンは、正規データに異常がないと判定した（つまり、正規データに異常がないことが確認された）場合（ステップＳ５１２：ＮＯ）、ステップＳ５１４へ進む。一方、仮想マシンは、正規データに異常があると判定した場合（ステップＳ５１２：ＹＥＳ）、異常終了する（ステップＳ５１３）。ステップＳ５１４では、仮想メモリは、フラグ設定領域における全てのフラグの設定を解除（つまり、全てのフラグを消去）する。図４（Ｃ）に示すｐｏｐ処理の直前に、図４（Ｂ）に示すｒｅｔｕｒｎ処理が行われている場合（つまり、図４（Ｂ）に示すｒｅｔｕｒｎ処理から、当該ｐｏｐ処理に移行された場合）、ステップＳ５１４において格納済フラグ及び確認要求フラグの設定が解除される。一方、図４（Ｃ）に示すｐｏｐ処理の直前に、図４（Ｂ）に示すｒｅｔｕｒｎ処理が行われていない場合（つまり、図４（Ａ）に示すｐｕｓｈ処理から、当該ｐｏｐ処理に移行された場合）、ステップＳ５１４において格納済フラグの設定が解除される。次いで、仮想マシンは、スタックポインタが指し示す、スタック領域の先頭から正規データを取り出し（ステップＳ５１５）、スタックポインタを変更（先頭から次の位置に変更）する（ステップＳ５１６）。つまり、仮想メモリは、スタック領域から正規データを取り出すときに、格納済フラグ及び確認要求フラグが設定されている場合、正規データと冗長データとを用いて正規データの異常の有無を確認し、正規データに異常がないことが確認された場合、全てのフラグの設定を解除し、且つ、正規データをスタック領域から取り出す。
【００３４】
もし、ステップＳ３１５でスタック領域に格納された正規データが、メソッド呼び出し命令に応じて呼び出されたメソッド（ＡＰＩにより提供されるメソッド）の処理結果としての戻り値である場合、仮想メモリは、図４（Ｂ）に示すｒｅｔｕｒｎ処理において、格納済フラグが設定されている場合、確認要求フラグを設定し、図４（Ｃ）に示すｐｏｐ処理において、スタック領域から正規データ（戻り値）を取り出すときに、確認要求フラグが設定されている場合に限り、正規データの異常の有無を確認し、当該正規データに異常がないことが確認された場合、格納済フラグ及び確認要求フラグの設定を解除し、且つ、正規データをスタック領域から取り出すことになる。このため、実施例１によれば、正規データが、メソッド呼び出し命令に応じて呼び出されたメソッドの処理結果としての戻り値である場合に限り（つまり、図４（Ｂ）に示すｒｅｔｕｒｎ処理か行われる場合に限り）、正規データの異常の有無が確認されるので、最低限のメモリリソースの消費で故障利用攻撃に対応することができる。なお、ステップＳ５１１において、確認要求フラグの代わりに、格納済フラグが設定されているか否かを判定してもよいが、この場合、メソッドが呼び出されない場合であっても（つまり、毎回）、正規データの異常の有無が確認されることになる。
【００３５】
（実施例２）
次に、図５を参照して、実施例２において正規データの異常の有無を確認する処理について説明する。図５（Ａ）は、実施例２において、図３に示すステップＳ３におけるｐｕｓｈ処理の詳細を示すフローチャートであり、図５（Ｂ）は、実施例２において、図３に示すステップＳ５におけるｐｏｐ処理の詳細を示すフローチャートである。
【００３６】
図５（Ａ）に示すｐｕｓｈ処理では、仮想マシンは、ステップＳ２の命令の実行により得られた正規データを当該正規データに対応する冗長データとして冗長データ格納領域に格納する（ステップＳ３２１）。ここで、実施例１と同様、正規データと、予め用意された任意のデータ“0xFFFF”との排他的論理和の演算結果が冗長データとして冗長データ格納領域に格納されるように構成してもよい。なお、ステップＳ３２２〜Ｓ３２４の処理は、実施例１におけるステップＳ３１３〜ステップＳ３１５の処理と同様である。次に、上記ステップＳ４に示すｒｅｔｕｒｎ処理が行われる場合、実施例１とは異なり、確認要求フラグの設定は行われず、呼び出し出し元へ戻る通常のｒｅｔｕｒｎ処理が行われる。
【００３７】
次に、図５（Ｂ）に示すｐｏｐ処理では、仮想マシンは、メソッドの呼び出し元が条件分岐命令であるか否かを判定する（ステップＳ５２１）。仮想マシンは、メソッドの呼び出し元が条件分岐命令であると判定した場合（ステップＳ５２１：ＹＥＳ）、ステップＳ５２２へ進む。一方、仮想マシンは、メソッドの呼び出しがなかった場合、またはメソッドの呼び出し元が条件分岐命令でないと判定した場合（ステップＳ５２１：ＮＯ）、ステップＳ５２５へ進む。ステップＳ５２２では、仮想マシンは、フラグ設定領域において格納済フラグが設定されているか否かを判定する。仮想マシンは、格納済フラグが設定されていると判定した場合（ステップＳ５２２：ＹＥＳ）、ステップＳ５２３へ進む。一方、仮想マシンは、格納済フラグが設定されていないと判定した場合（ステップＳ５２２：ＮＯ）、ステップＳ５２５へ進む。
【００３８】
ステップＳ５２３では、仮想マシンは、上記正規データと、冗長データ格納領域に格納された冗長データとを用いて正規データの異常の有無を判定（確認）する。例えば、当該冗長データと、スタック領域の先頭に格納されている正規データとが一致すれば、正規データが改竄されていないので、正規データに異常が無いと判定される。そして、仮想マシンは、正規データに異常がないと判定した場合（ステップＳ５２３：ＮＯ）、ステップＳ５２５へ進む。一方、仮想マシンは、正規データに異常があると判定した場合（ステップＳ５２３：ＹＥＳ）、異常終了する（ステップＳ５２４）。ステップＳ５２５では、仮想メモリは、フラグ設定領域における格納済フラグの設定を解除する。なお、ステップＳ５２６及びＳ５２７の処理は、実施例１におけるステップＳ５１５及びＳ５１６の処理と同様である。このように、実施例２によれば、仮想メモリは、スタック領域から正規データを取り出すときに、格納済フラグが設定されており、且つメソッドの呼び出し元が条件分岐命令である場合に限り、正規データの異常の有無を確認するので、最低限のメモリリソースの消費で故障利用攻撃に対応することができる。また、実施例２によれば、実施例１のようにｒｅｔｕｒｎ処理において確認要求フラグを設定する必要はない。
【００３９】
（実施例３）
次に、図６を参照して、実施例３において正規データの異常の有無を確認する処理について説明する。図６（Ａ）は、実施例３において、図３に示すステップＳ３におけるｐｕｓｈ処理の詳細を示すフローチャートであり、図６（Ｂ）は、実施例３において、図３に示すステップＳ５におけるｐｏｐ処理の詳細を示すフローチャートである。
【００４０】
図６（Ａ）に示すｐｕｓｈ処理では、仮想マシンは、ステップＳ２の命令の実行により得られた正規データが“0x0001”または“0x0000”であるか否かを判定する（ステップＳ３３１）。つまり、正規データの型が、Java Card APIの仕様で定められたboolean型の正（真）の値と否（偽）の値との何れかを示す論理値型であるか否かが判定される。なお、ステップＳ２の命令の実行により得られた正規データが“0x0001”または“0x0000”であったとしても、メソッド呼び出し命令に応じて呼び出されたメソッド（ＡＰＩにより提供されるメソッド）の処理結果としての戻り値であるとは断定できないが、当該戻り値の可能性があるので、正規データが“0x0001”または“0x0000”であれば、実施例１と同様、格納済フラグを設定するのである。
【００４１】
そして、仮想マシンは、正規データが“0x0001”または“0x0000”であると判定した場合（ステップＳ３３１：ＹＥＳ）、フラグ設定領域に格納済フラグを設定する（ステップＳ３３２）。一方、仮想マシンは、正規データが“0x0001”及び“0x0000”の何れでもないと判定した場合（ステップＳ３３１：ＮＯ）、ステップＳ３３４へ進む。なお、ステップＳ３３３〜Ｓ３３５の処理は、実施例２におけるステップＳ３２２〜ステップＳ３２４の処理と同様である。次に、上記ステップＳ４に示すｒｅｔｕｒｎ処理が行われる場合、実施例２と同様、確認要求フラグの設定は行われず、呼び出し出し元へ戻る通常のｒｅｔｕｒｎ処理が行われる。
【００４２】
次に、図６（Ｂ）に示すｐｏｐ処理では、仮想マシンは、フラグ設定領域において格納済フラグが設定されているか否かを判定する（ステップＳ５３１）。仮想マシンは、格納済フラグが設定されていると判定した場合（ステップＳ５３１：ＹＥＳ）、ステップＳ５３２へ進む。一方、仮想マシンは、格納済フラグが設定されていないと判定した場合（ステップＳ５３１：ＮＯ）、ステップＳ５３４へ進む。なお、ステップＳ５３２〜Ｓ５３６の処理は、実施例２におけるステップＳ５２３〜ステップＳ５２７の処理と同様である。このように、実施例３によれば、仮想メモリは、スタック領域から正規データを取り出すときに、当該正規データの型がboolean型の正（真）の値と否（偽）の値との何れかを示す論理値型である場合に限り、当該正規データの異常の有無を確認するための冗長データを冗長データ格納領域に格納し、且つ格納済フラグを設定するので、最低限のメモリリソースの消費で故障利用攻撃に対応することができる。また、実施例３によれば、実施例１のようにｒｅｔｕｒｎ処理において確認要求フラグを設定する必要はない。
【００４３】
以上説明したように、上記実施形態によれば、仮想マシンは、スタック領域に正規データを格納するときに、当該正規データの異常を判定するための冗長データを、スタック領域以外の冗長データ格納領域に格納し、且つ当該冗長データが格納されていることを示す格納済フラグをフラグ設定領域において設定する。そして、仮想マシンは、スタック領域から正規データを取り出すときに、格納済フラグが設定されている場合、正規データと冗長データとを用いて正規データの異常の有無を確認し、正規データに異常がないことが確認された場合、格納済フラグの設定を解除し、且つ、正規データをスタック領域から取り出すように構成したので、最低限のメモリリソースの消費で故障利用攻撃に対応することができる。
【符号の説明】
【００４４】
１  ＩＣカード
１ａ  ＩＣチップ
２  外部装置
１０  ＣＰＵ
１１  ＲＡＭ
１２  ＲＯＭ
１３  不揮発性メモリ
１４  Ｉ／Ｏ回路
【図１】
2018088147.tif 000003
【図２】
2018088147.tif 000004
【図３】
2018088147.tif 000005
【図４】
2018088147.tif 000006
【図５】
2018088147.tif 000007
【図６】
2018088147.tif 000008