(57)【要約】  本発明による方法は、情報処理手段および情報格納手段を備える電子アセンブリに格納されたプログラムの実行を保証するための方法に関する。本方法は、前記プログラムの少なくとも一部分の各命令の実行を、前記部分の実行中に、前記命令それぞれに応じた、または前記命令に関連づけられた所定の値を使って計算を実施することによって、かつ、取得された結果を予め計算された値と比較することによって調べることを含む。本発明は、前記方法が実施される電子モジュール、および前記モジュールを備えるカードにも関する。
2007513422.tif 000002
【特許請求の範囲】
【請求項１】
データ処理手段およびデータ格納手段を含む電子アセンブリ内でのプログラムの実行を保証するための方法であって、前記プログラムの少なくとも一部分の各命令の実行を、前記部分の実行中に、前記命令それぞれに応じた、または前記命令それぞれに関連づけられた所定の値を使って計算を実施することによって、かつ、取得された結果を予め計算された値と比較することによって調べることを含むことを特徴とする方法。
【請求項２】
前記命令それぞれに応じた値が、内容、タイプ、関数、結果、および／またはこのようなものとして前記命令に付加された任意の特性に応じる値であることを特徴とする、請求項１に記載の方法。
【請求項３】
前記命令の内容に対して、チェックサムの計算を実施することを含むことを特徴とする、請求項１または２に記載の方法。
【請求項４】
前記部分を実行するとき、カウンタを、前記実行される命令それぞれに応じた、または前記実行される命令それぞれに関連づけられた値で増分することを含むことを特徴とする、請求項１から２に記載の方法。
【請求項５】
命令クラスを規定することを含み、前記命令クラスの前記命令それぞれに関連づけられた値が同一であることを特徴とする、請求項１から４のいずれか一項に記載の方法。
【請求項６】
データ処理手段および実行されるべきプログラムを含むデータ格納手段を含む電子モジュールであって、データ処理手段が、前記プログラムの少なくとも１つの部分にある各命令の実行を、前記部分の実行中に、前記命令それぞれに応じた、または前記命令それぞれに関連づけられた所定の値を使って計算を実施することによって、かつ、取得された結果を予め計算された値と比較することによって調べるための手段を含むことを特徴とするモジュール。
【請求項７】
前記手段が、プロセッサを備え、該プロセッサが、特殊な命令または新たな各コード部分向けに予め計算された値を考慮に入れるように変更された、知られているタイプの命令を有し、比較を行うことを特徴とする、請求項６に記載のモジュール。
【請求項８】
実施される計算が、比較を実施するソフトウェアモジュールに対して利用可能にされることを特徴とする、請求項６に記載のモジュール。
【請求項９】
前記手段が、前記部分に関連づけられたカウンタを備えることを特徴とする、請求項６から８のいずれか一項に記載のモジュール。
【請求項１０】
請求項６から９のいずれか一項に記載の電子モジュールを備えることを特徴とするカード。
【請求項１１】
コンピュータプログラムであって、電子アセンブリ内で前記プログラムが実行されると、請求項１から５のいずれか一項に記載の方法のステップを実行するプログラムコード命令を備えるコンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、保護されるべきプログラムを実装する電子アセンブリを保証するための方法および装置に関する。より厳密には、本方法の目的は、放射、フラッシュ、光、レーザー、グリッチ、またはそれ以外による攻撃に対抗し、より全般的には、プログラム命令の実行を妨げるどの攻撃にも対抗する防御を提案することである。こうした攻撃は、実行される命令を変更し、結果としてプログラムの特定の部分の不実行または不正確な実行を生じる。
【背景技術】
【０００２】
プログラムを実行すると、たとえばレーザー、グリッチ、または電磁放射による攻撃が、プロセッサによって実行される命令コードを変更し、たとえばどの命令ｃｏｄｏｐも、ｃｏｄｏｐ  ００ｈ（６８０５ではＢＲＳＥＴ０、８０５１およびＡＶＲではＮＯＰ）にコンバートする。すなわち、プログラム命令は、動作不能な命令で置き換えられる。したがって、コードの特定のセクションは、実行に失敗し、または不規則に実行し、たとえばスマートカード向けのオペレーティングシステムにおけるセキュリティ処理シーケンスではなく、動作不能な命令の実行となる。攻撃は、プロセッサ動作を妨げ、プログラムメモリ内での時機を失したジャンプを引き起こす場合がある。
【０００３】
本出願人は、マイクロプロセッサ制御される電子モジュールに格納されたプログラムの実行を保証するための方法、ならびに関連する電子モジュールおよび集積回路カードに関する仏国特許出願第００１６７２４号を、２０００年１２月２１日に出願した。前記出願において保護される解決方法は、中断を断続的にトリガし、そうすることによってプログラム実行を、起こり得る攻撃に対抗して保護するためにダイバート（ｄｉｖｅｒｔ）するものである。この解決方法は、放射による攻撃を高確率で検出しかつ防止する。しかし、特に２つの中断の間の短時間に攻撃が起こった場合、いくつかの攻撃が検出されない可能性がある。
【０００４】
知られている防御のうち、別の解決方法は、定期的な間隔でＲＡＭメモリの１バイト中にフラグを設定し、ソフトウェアの実行における特定の時点で、設定されるべき全フラグが、実際に設定されていることを調べることにある。ただし、このタイプの防御の設置は、面倒である。というのは、特定の揮発性メモリエリアが、割り振られなければならず、要求される場合は常に、保護されるべきコード中に処理が加えられなければならないからである。さらに、このタイプの攻撃は、より短く、より精密になりつつあるので、知られているこの解決方法は、有効性を失いつつある。第１に、攻撃は、フラグの設定に影響がない程度に短い場合がある。プログラムのセクションの実行は、したがって、全く検出不可能なやり方で防がれる可能性がある。第２に、フラグ検証ソフトウェア自体が、妨げられる可能性がある。
【発明の開示】
【発明が解決しようとする課題】
【０００５】
本発明の１つの目的は、非常に短い攻撃に対してさえも、効率的な保護を提案することである。
【０００６】
本発明の別の目的は、適合なしで現在の構成要素に実装されることができる解決方法を提案することであり、この解決方法は、わずかな資源を消費し、解決方法が実装されるアセンブリの性能を低下させない。
【課題を解決するための手段】
【０００７】
本発明は、データ処理手段およびデータ格納手段を含む電子アセンブリ内でのプログラムの実行を保証するための方法に関し、この方法は、前記プログラムの少なくとも一部分のあらゆる命令の実行を、前記部分の実行中に、前記命令それぞれに応じた、または前記命令に関連づけられた所定の値を使って計算を実施することによって、かつ、取得された結果を予め計算された値と比較することによって調べることを含むことを特徴とする。
【０００８】
本発明は、前記方法が実施される電子モジュール、前記モジュールを備えるカード、および前記方法を実施するためのプログラムにも関する。
【０００９】
非限定的例として与えられる、後に続く本発明による方法の実施形態およびこの実施形態用に構成された電子システムの実施形態の説明を読み、添付された図面を参照すると、本発明の他の目的、特徴、および利点が明らかになるであろう。
【発明を実施するための最良の形態】
【００１０】
本発明による方法の目的は、電子アセンブリ、およびプログラムを実装する、たとえばスマートカードなどの可搬物を保証することである。電子アセンブリは、少なくともプロセッサなどの処理手段、およびメモリなどの格納手段を備える。保証されるべきプログラムは、前記アセンブリの、たとえばＲＯＭ（読出し専用メモリ）タイプのメモリにインストールされる。
【００１１】
非限定的な例として、以下で説明される電子アセンブリは、図１に示される電子モジュール１を備える搭載型システムに対応する。このタイプのモジュールは、概して、モノリシックな集積電子マイクロ回路、すなわちチップとして実現され、知られている任意の手段によって物理的に保護されると、たとえばスマートカード、マイクロ回路もしくは集積回路カード（マイクロプロセッサカードなど）、または様々な分野で使われ得る他のカードなど、可搬物上でアセンブルされることができる。
【００１２】
電子モジュール１は、内部バス５を介して、実行されるべきプログラムＰＲＯ９を含むＲＯＭ、ＥＥＰＲＯＭ、フラッシュ、ＦｅＲａｍ、または他のタイプの不揮発性メモリ７に双方向接続されたマイクロプロセッサＣＰＵ３、ＲＡＭタイプの揮発性メモリ１１、外部と通信するための入出力手段Ｉ／Ｏ１３、少なくとも１つのカウンタＣＯＵＮＴＥＲなどの評価手段１５を備える。
【００１３】
本発明による方法は、実行フロー中の各命令が、マイクロプロセッサ３によって実際に実行されたことを調べることによって、プログラム９が、メモリに格納されるとおりに完全に実行されたことを調べることにある。
【００１４】
本発明による方法は、前記プログラムの少なくとも一部分の各命令の実行を、前記部分の実行中に、各命令に応じた、または各命令に関連づけられた所定の値を使って算術計算を実施することによって、かつ取得された結果を前記格納手段に格納された予め計算された値と比較することによって調べることにある。所定の値とは、本方法が実施されるシステムの物理特性、およびこのシステム内での前記命令の実行の物理特性に応じない任意の値を意味する。
【００１５】
命令に応じる所定の値は、たとえば、内容、タイプ、関数、結果、および／または前記命令にこのようなものとして付加された他の任意の特性に応じる値である。命令の内容は、オペレーティングコードおよびパラメータを含む、前記命令を形成する任意の要素も意味すると解釈され、前記内容は、こうした要素の１つ、いくつか、またはすべてを含む。命令のタイプは、命令を特定な命令カテゴリに分類する、命令の特性を意味すると解釈される。命令の関数は、関与する前記プログラム部分において前記命令によって実行される関数を意味すると解釈される。命令の結果は、存在すれば、前記命令を実行することによって取得された任意の値を意味すると解釈される。
【００１６】
図３、図４に表される、本発明による一実施形態によれば、本方法は、マイクロプロセッサの動作中に、命令の実行中に実行される命令の内容に対するチェックサムを計算し、計算されたチェックサムを、メモリに格納された予め計算された値と比較することによって、チェックサムを検証することにある。予め計算された値は、たとえば、対応するプログラムの開発中に、保護されるコードに格納されることができる。チェックサムとは、１組のデータ項目の「和」、すなわち、前記データの内容に応じる、検証目的で使われる計算された値である。
【００１７】
１つのプログラムが、分岐、ジャンプ、ルーチン呼出し命令、または同等物、すなわち実行フロー中に分岐を作成する命令を使うマシンコードに翻訳される、多数の条件付きテストおよびルーチン呼出しを備える。条件付きテスト、ルーチン呼出し、または呼出しからの戻りが、互いの後に続く場合、コードセクションは、起こり得る実行パスのツリー中の次の分岐の前の、ごくわずかの命令からなり得る。別のルーチンへのジャンプがある場合、そのルーチンの入口点は、様々なパスによって到達され得る。本発明において、各入口点、ジャンプ命令、またはプログラムコード中の同等物は、チェックサム計算のための新たなコードセクションの開始となる。
【００１８】
チェックサム検証機構を実装するために、本発明による方法は、入口または出口点、ジャンプアドレスによって、あるいは分岐、ジャンプ、ルーチン呼出し、もしくは呼出しからの戻り命令、割込み操作ルーチンに入ること、または前記割込みまたは同等物からの戻りによって境界を定められた、保護されるべき各コード部分におけるチェックサムの事前計算を実施する。
【００１９】
本発明の方法を、図３、図４に示されるようにコードすべてに適用するために、本発明は、チェックサム事前計算タスク（図３、図４の大括弧「予め計算されたチェックサム」）を実施するための、特別に構成されたコンパイラを用いる。予め計算されたチェックサムを、コードセクション命令の終了のパラメータとして渡すことは、プロセッサ命令セットが変更されるので、知られているタイプのコンパイラに対する大幅な変更を伴う。
【００２０】
チェックサム検証は、プロセッサによって実行されることができる。本発明による方法は、したがって、保護されるべき各コード部分の終りの所で、マイクロプロセッサに予め計算されたチェックサムを与え、このチェックサムは、実行中にプロセッサによって計算された（図１、図２の「ＣＫＳ計算」）チェックサムと比較される（図１、図２の「ＣＫＳ検証」）。この値は、たとえば、分岐、ジャンプ、ルーチン呼出し、もしくは呼出しからの戻り命令、または割込み操作ルーチンの戻り、あるいは同等物、および／または保護されるべきコード部分の終りへの印つけ、もしくは保護されるべきコード部分の終りに印をつける命令のパラメータとして与えられる。保護されるべきコード部分が、ジャンプアドレスで終わる場合、チェックサム検証は、特にプロセッサ命令セット中に加えられる命令で、または条件なしジャンプ命令を次の命令に単に追加することによって実行されることができる。
【００２１】
検証は、パラメータとして渡された、予め計算された値を有する保護されるべきコード部分の終了命令中に実行される。プロセッサによって実行中に計算されたチェックサムは、次のコードセクション用に再度初期化される。チェックサム検証が、違いを見つけた場合、アクションがトリガされる（図４の「異常検出」）。
【００２２】
チェックサム検証は、プロセッサによって計算された値を予め計算された値と比較することによって、プロセッサ命令セットを変更することなく、ソフトウェアによって実行されることもできる。この場合、プロセッサ命令セットを、保護されるべきコードセクションの終了命令のパラメータとして予め計算されたチェックサムを渡すように変更する必要はない。プロセッサによって実行中に計算されたチェックサムは、ただ単に、レジスタまたはそれ以外においてプログラムにとってアクセス可能でなければならない。
【００２３】
この方法は、限られた資源のみを必要とし、ｃｏｄｏｐだけではなくパラメータも含む、実行されるべきコードを完全に保護するという利点をもたらす。
【００２４】
図５〜図７に表される、本発明による方法の別の実施形態によれば、カウンタ１５が、少なくとも関数、シーケンス、またはより全般的には前記プログラムの少なくとも一部分に割り当てられ、一実施形態によれば、その実行開始時に、各部分に割り当てられる。プログラム部分は、少なくとも１つの命令を備える。本説明の残りの部分では、例示として、検討される部分は、関数である。本方法は、プロセッサが、進行中の前記関数の各命令を実行するとき、前記カウンタを、実行される命令に固有の値だけ増分することにある。関数の終りで、到達された値、すなわち実行された命令シーケンスの結果が、プログラム開発中に予め計算された、保護されるコードに書き込まれた値との比較によって調べられる。
【００２５】
前記実施形態による方法は、プロセッサ命令セットを追加することも変更することもなく実施され得る。本方法は、コンパイラを適合させることもなく実施され得る。
【００２６】
各関数の開始時に、カウンタが、プロセッサスタックでよいデータ構造の形で関数に割り当てられる。カウンタは、０または関数のために決定された値に初期化される（図５〜図７の「カウンタ初期化」）。呼出しからの戻り命令の前に実行される関数本体中の各命令に対して、関数カウンタは、命令に固有の値だけ増分される（図５〜図７の「ＣＦまたはＣＰ計算」）。関数の終了時に、カウンタによって到達された値は、予め計算された、ソフトウェアにおいて参照値として使われる期待値と比較される（図５〜図７の「ＣＦ比較」）。
【００２７】
図６に示されるように、関数の最中に攻撃が起きた場合、命令は、プログラム中で計画されたシーケンスに従っては実行されず、関数の終了時でのカウンタ値（図６のＣＦ１＝０ｘ２５）は、期待され調べられた値（図６の、予め計算された値ＶＰ＝０ｘ９２）とは異なる。したがって、攻撃が検出され（図の「異常検出」）、プログラムまたはプロセッサによって特定のアクションが実施される。チェックが、異常を検出しなかった場合、関数カウンタは、データ構造中で割振り解除される（図５で、カウンタＣＦ１が割振り解除される）。
【００２８】
関数コードは、多数の条件付きテスト、およびルーチン呼出しまたは同等物、すなわち実行フロー中の分岐を作成する命令からなる。実行パスに関わりなく、関数の終了時にカウンタに対して同じ値を取得するには、起こり得る様々な実行分岐が、平衡をとられなければならない。
【００２９】
命令に対するカウンタ増加値は、命令のマシンコード（オペレーティングコード＋パラメータ値）でよい。この場合、実行される命令において計算されたカウントは、関数に属す実行フロー中の命令において計算されたチェックサムに対応する。割込みによって呼び出され、または実行される関数中の実行される命令は、こうした関数のカウンタで考慮され、したがって、呼出しまたは割り込まれた関数のカウンタでは考慮されない。
【００３０】
関数中の起こり得る全実行パスの平衡をとることは、関数の終了時に、カウンタの同じ値を取得するために、実行されなければならない。この平衡は、命令が交換可能でないせいで複雑である。したがって、しばしば、その唯一の目的が、別の分岐に関してある分岐の平衡をとることである、１つまたは複数の命令を追加することが必要となる。この解決方法は、分岐の平衡のとり直しにより、程度の差はあるが、コードのサイズを増大させる。
【００３１】
別の解決方法は、同じ増加値を有する命令クラスを規定することにある。同じ増分を有するこうしたクラスは、同様の命令、たとえば条件付き分岐のクラス、算術および論理演算のクラス、ジャンプおよび関数呼出しのクラスを含む。ＮＯＰ命令は、増分値０を有し、プログラム命令をＮＯＰに変換することになる攻撃中に、カウンタは増分されず、このことは、攻撃が検出されないことを意味する。この機構は、関数中の実行パスの各命令が、正しく実行することを調べるのに用いられ得る。
【００３２】
同じ増分値を有するクラスに命令をグループ化すると、分岐の平衡をとるのがより容易になる。すなわち、各分岐は、異なるが同様の演算を実行する場合、等しい増分値を有する命令を使うことができる。さらに、平衡は、異なるものではあるが同じクラスに属する命令を、別の分岐で使われるものとして使うことによって実行され得る。たとえば、ある分岐における条件付き分岐は、別の分岐中の次の命令への条件なし分岐と平衡をとられることができる。命令パラメータは、カウンタを増分するときは考慮されず、このことも、分岐の平衡をとるのをより容易にする。分岐は、大きな違いがある場合は、関数カウンタに直接アクセスすることによっても平衡をとられ得る。
【００３３】
関数を出るときまたは中間チェック中に実施される、関数カウンタの値のチェックは、ソフトウェアによって、実行中にプロセッサによって増分される、現在の関数カウンタの値を読むことによって、かつ予め計算された値と比較することによって実行され得る。このチェックは、予め計算されたチェック値をプロセッサに与えることによって、ハードウェアによっても実行され得る。この値は、変更された呼出しからの戻り命令、またはプロセッサ命令セットに特に加えられた命令のパラメータとして与えられ得る。命令は、引数として与えられた、予め計算された値を、現在の関数カウンタの値と比較することによって、チェックを実施する。
【００３４】
データ構造での関数カウンタの割当て、およびこのカウンタの０または別の特定の値への初期化は、変更された関数呼出し命令中に、プロセッサによって、ソフトウェアによっても、またはハードウェアによっても実行され得る。
【００３５】
変形例によれば、本方法は、各ルーチンの開始時に、ポインタを、その前の値をセーブした後で、ルーチンカウンタに初期化することにある。ルーチンを出ると、ポインタは、その前の値（呼出し関数カウンタのアドレス）にリセットされる。この機構は、ルーチン中、かつ特に影響されやすい演算の前に、カウンタの中間チェックを実施するのに用いられ得る。カウンタ値が、ルーチン実行中のこの時点で期待される値でない場合、このことは、ルーチンの実行が妨げられたことを意味する。
【００３６】
プロセッサスタックに関数カウンタを割り当てることは、スタックが、戻りアドレス、およびおそらくは関数呼出し中にいくつかのレジスタを保存するためのみ使われる場合、有用である。この場合、カウンタは、関数本体中のスタックの最上位に留まり、したがって、ルーチン中にチェックを実施するために、このカウンタへのポインタを保持する必要はない。別の実施形態では、ルーチンカウンタは、実行されるルーチンのカウンタを見つける手段（おそらくは、スタックポインタ）を有する、プロセッサスタック以外のデータ構造（たとえば、コンパイラスタック）中に割り当てられ得る。
【００３７】
図７に示される方法の一実施形態は、カウントを実施するのに、プロセッサの全域カウンタ（図７のＣＰ）を使うことにある。命令を実行する際の増加は、この全域カウンタ（ＣＰ）中のプロセッサによって実行される。各関数呼出しまたは割り込み操作の際、全域カウンタの値は、呼出しまたは割り込まれた関数カウンタに加えられ、０にリセットされる（図の「ＣＰが、スタックにある値に加えられ（ＣＦ＝ＣＦ＋ＣＰ）、かつＣＰがリセットされる」）。関数戻りまたは割り込み戻りの間、関数カウンタの最終値は、チェックの前に全域カウンタの値を加えることによって取得され、次いで、全域カウンタは、呼出しまたは割り込まれた関数に対して０にリセットされる。
【００３８】
チェックカウント方法と呼ばれる、図５〜図７に示される実施形態による方法の１つの利点は、チェックカウントが、各ルーチンに固有であることにある。ルーチンの命令のみが考慮され、呼び出されるルーチン、具体的にはランダムまたは非同期化ルーチンは考慮されず、このことは、各ルーチンの本体内部で実行されるだけでよいので、分岐の平衡をより容易にする。さらに、本方法は、必要とみなされる関数に限定されることができ、このことは平衡をとるタスクの規模をさらに低下させる。
【００３９】
同じ増分値を有するクラスに命令をグループ化することは、分岐の平衡をより容易にする。カウンタを増分する際、命令パラメータは考慮されず、このことも、分岐の平衡をより容易にする。
【００４０】
本方法は、プロセッサ命令セットを変更することなく実施され得る。すなわち、プロセッサを変更しなくても、したがって現在のプロセッサにも実施され得る。
【００４１】
チェックカウントの検証は、ルーチンの終了時にのみ実施されることができ、そうすることによって、コードサイズの増大を制限する。
【図面の簡単な説明】
【００４２】
【図１】本発明による方法が実施される装置の例を示す図である。
【図２】添付された図３〜図７を理解するための手がかりを示す図である。すなわち、影なし矩形ａは、実行されるコードの部分を表し、影つき矩形ｂは、実行されないコードの部分を表す。影つき矢印ｃは、攻撃を表し、矢印の長さは、攻撃の持続期間を示し、矢印の位置は、攻撃されるプログラムコードの部分を示す。太枠で囲まれた矩形ｄは、異常の検出を表す。細枠で囲まれた薄い影つき矩形ｅは、予め計算されたデータを表す。大括弧ｆは、事前計算の範囲を表す。角が丸い矩形ｇは、コードアドレスを表す。斜視による矩形ｈは、スタックの状況を示す。指している端部が基本矩形の外に出る幅広影つき矢印ｉ、および影つき楕円形ｊは、ハードウェア機構を表し、二重枠で囲まれた影なし楕円ｋは、ソフトウェア機構を表す。太枠で囲まれた謝しによる矩形ｌは、スタックにあるソフトウェア機構を表す。
【図３】本発明の一実施形態によるセキュリティ方法のステップが例示される、攻撃に直面していないときのプログラムの実行を示す図である。
【図４】図３に表される実施形態によるセキュリティ方法のステップが例示される、攻撃に直面しているプログラムの実行を示す図である。
【図５】本発明の別の実施形態によるセキュリティ方法のステップが例示される、攻撃に直面していないときのプログラムの実行を示す図である。
【図６】図５に表される実施形態によるセキュリティ方法のステップが例示される、攻撃に直面しているプログラムの実行を示す図である。
【図７】図５に表される実施形態の変形例によるセキュリティ方法のステップが例示される、攻撃に直面していないときのプログラムの実行を示す図である。
【図１】
2007513422.tif 000003
【図２】
2007513422.tif 000004
【図３】
2007513422.tif 000005
【図４】
2007513422.tif 000006
【図５】
2007513422.tif 000007
【図６】
2007513422.tif 000008
【図７】
2007513422.tif 000009
【国際調査報告】
2007513422.tif 000010
2007513422.tif 000011
2007513422.tif 000012