説明

特にスマートカードにおけるコンピュータプログラムの実行を保護する方法

本発明は、コンピュータプログラムの実行を保護する方法に関するものであり、この方法は、プログラムの命令パイル内に既定値をスタックするステップと、このパイルをスタックポップするステップと、を有し、スタックポップステップは、適宜に異常実行を検出できるように適合されている。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、コンピュータプログラムの実行を保護する方法と、この種の方法を実装する安全な電子的エンティティに関するものである。
【0002】
本発明は、特に、スマートカードを保護するべく使用可能である。
【0003】
本明細書における「コンピュータプログラムの保護」に対する言及は、コンピュータプログラムの正常な動作の変更を目的とした悪意を有する攻撃の検出と、コンピュータプログラム(特に、衛星などの非常に高度な干渉を受け易い環境内において実行されるプログラムや、例えば、心臓の移植物を制御するプログラムなどの非常に高い信頼性を必要とするコンピュータプログラム)の実行の信頼性の向上を目的とした処理と、を意味している。
【0004】
また、「コンピュータプログラム」という表現は、採用するコンピュータ言語およびストレージ手段とは関係なしに、あらゆるプログラムを意味している。非限定的な例として、コンピュータプログラムは、機械言語、アセンブラ言語、C、C++、Java(登録商標)、またはVHDLによって作成可能である。プログラムは、例えば、ROM、EEPROM、またはハードディスクなどの永久的なメモリ、あるいは、例えば、RAMなどの揮発性のメモリ内に保存可能である。また、プログラムは、例えば、FPGA(Field−Programmable Gate Array)やASIC(Application−Specific Integrated Circuit)などの集積回路の形態でも、同様に実装可能である。
【0005】
本発明は、例えば、スマートカード、安全なPCMIAカード(例えば、IBMの4758カード)、USBキー、または1枚の頁に非接触式マイクロチップを内蔵したパスポートなどの安全な電子的エンティティ上におけるコンピュータプログラムの実行を変更することを目的とした攻撃を検出する。また、本発明は、このような攻撃に対する対策を起動する。
【0006】
特に、本発明は、例えば、いわゆる、障害攻撃(fault attack)などの電子的エンティティの動作を妨げる攻撃を検出する。
【背景技術】
【0007】
このような攻撃は、コンテンツを違法に変更したり、レジスタ、メモリ、もしくはバスのコンテンツを読み取ったり、あるいは、コンピュータプログラムの特定の命令を実行しないように、もしくは、それらを不正に実行するように、プロセッサに強いたりすることを目的としている。この結果、攻撃を受けたコンピュータプログラムは、本来設計されている実行方式とは非常に異なった方式で実行されることになる。
【0008】
この種の当技術分野において既知の攻撃には、プロセッサの電源端子の1つに電圧スパイクを生成するもの、その温度を突然上昇させるもの、そのクロック周波数または供給電圧を急激に変化させるもの、ならびに、それを構成しているシリコンの一部に光のフラッシュ、レーザービームもしくは電界を印加するものが含まれる。
【0009】
当業分野の現在の状況においては、当業者は、コンピュータプログラムを保護するための、特に、スマートカード内に障害を生成することによる攻撃と戦うための、様々な方法に関する知識を有している。
【0010】
第1の方法は、スマートカードコンポーネント内にセンサを設置し、これらの攻撃を検出するステップを有している。
【0011】
しかしながら、実際には、コンポーネントの表面全体にわたってセンサを配置することは不可能であるため、この種の方法の有効性は限られている。また、センサもシリコンから製造されているため、これらに干渉したり、これらが伝送する情報を変更することも可能である。
【0012】
大部分のスマートカードオペレーティングシステムの保護に使用されている第2の従来技術による方法は、「セマフォ(semaphore)」の使用に基づくものであり、これは、重要な命令の組を実行する際にメモリ領域のコンテンツを変更するステップと、このメモリ領域のコンテンツを読み取ることにより、前述の変更ステップが実行されていることを検証する検証ステップと、を含んでいる。
【0013】
メモリ領域がまだ変更されていなければ、これは、変更ステップがまだ実行されておらず、従って、前述の重要な命令が正しく実行されていないことを意味している。
【0014】
なお、本明細書における「セマフォ」という用語は、並行プロセスのプログラミング分野において使用されている同名のプロセスとは異なる概念を意味していることに留意されたい。
【0015】
このソフトウェアによって実装される第2の方法は、前述の第1の方法の欠点を具備していない。
【発明の開示】
【発明が解決しようとする課題】
【0016】
しかしながら、セマフォは、従来、作業メモリ(RAM)内に存在する変数によって実装されており、これらの操作(配置、読み取り)は、相対的に低速であり、かつ、メモリ空間の観点から高価である。この制約は、特に、スマートカードなどの限られたリソース(メモリ、演算パワーなど)を具備するシステム上でプログラムを実行する場合に、非常に不利である。本発明は、このような欠点を具備していないソフトウェアによる方法を目的としている。
【課題を解決するための手段】
【0017】
このために、本発明は、コンピュータプログラムの実行を保護する方法を提供し、この方法は、プログラムの命令スタック内に既定値をスタックするステップと、適宜、実行異常を検出するべく、適合されているスタックをアンスタックするステップと、を含んでいる。
【0018】
命令スタックとは、データを一時的に保存するためのメモリ領域のことである。以降、本明細書においては、値は、それぞれ、PUSHとPOPと呼ばれる2つの特定の命令により、スタック内にスタックされ、かつ、スタックからアンスタックされる。
【0019】
これらの命令は、例えば、1バイトなどの固定サイズの値のみを操作する。
【0020】
スタックの使用は、LIFO(Last In First Out)アルゴリズムによって制御されている。
【0021】
特に、スタックは、プロシージャのリターンアドレスを保存する(例えば、80x86アセンブラ言語におけるRET命令)。これは、当技術分野において周知である。
【0022】
従って、本発明の方法は、実行スタックを使用することにより、実行異常を検出するための値を保存している。
【0023】
実行スタックは、読み取りおよび書き込みモードにおけるアクセスが高速であり、かつ、メモリ空間の観点から低コストであるため、本発明の方法は、限られたリソースを具備するシステム上において実行されるコンピュータプログラムを保護するのに、特に適している。
【0024】
また、この命令スタックの新しい使用法は、後述するその他の利点をも具備している。
【0025】
好適な実施例においては、スタックおよびアンスタックステップは、それぞれ、プログラムの命令の少なくとも1つのサブセットの要素と関連付けられている。
【0026】
例えば、スタックステップは、ファイルをオープンする「open(file)」命令と関連付け可能であり、アンスタックステップは、ファイルをクローズする「close(file)」命令と関連付け可能である。
【0027】
例えば、エディタを使用してスタックおよびアンスタック動作を前述の要素(すなわち、先程の例の「open」および「close」命令)と関連付けることにより、命令の作成を自動化可能であるため、この特徴は特に有利である。
【0028】
この好適な実施例の第1の変形においては、命令のサブセットの要素は、それぞれ、括弧の組の開き括弧と閉じ括弧である。
【0029】
コンピュータ言語分野の知識を有する者であれば、言語理論においては、テキストが、閉じ括弧と同数の開き括弧を含んでおり、かつ、そのテキストの任意の開始地点が、閉じ括弧の数以上の数の開き括弧を含んでおれば、括弧の組が存在していることを知っている。
【0030】
この特に有利な特徴によれば、スタックおよびアンスタックステップは、それぞれ、「(」と「)」、または、「{」と「}」、または、「begin」と「end」、または、「repeat」と「until」の各命令と関連付けることができる。
【0031】
この好適な実施例の別の変形においては、アンスタックステップは、プログラムまたはプログラムのサブルーチンのリターン命令と関連付けられている。
【0032】
有利なことに、この特徴によれば、(リターン命令の実行の際の)プログラムまたはサブルーチンから戻る際にこれまで実行されている通常のアンスタック動作を使用して(このときにアンスタックされる値が、プログラムの正常な実行の際にアンスタックされるものと対応していない場合に)実行異常を検出可能である。
【0033】
本発明の別の特徴によれば、プログラムは、その実行によってスタックステップを実装する第1命令および/またはその実行によってアンスタックステップを実装する第2命令を含むプログラミング言語によって作成されている。
【0034】
この実施例においては、新しい命令がプログラミング言語内に内蔵され、それぞれの命令は、プログラムを保護するべく、その独自の関数と、スタック関数またはアンスタック関数のいずれかを具備している。
【0035】
先程簡単に触れた例を再度参照すれば、「open(file)」と呼ばれる新しい命令を生成することにより、ファイルのオープンと、プログラムの命令スタック内への既定値のスタックと、を同時に実現可能である。
【0036】
この結果、セキュリティ機能を考慮する必要なしに、かつ、特定のソフトウェアツールを必要とすることなしに、それぞれのファイルのオープンに関するセキュリティ機能の実行がプログラマに対して保証される。
【0037】
第2の命令は、好ましくは、プログラムまたはプログラムのサブルーチンを終了させる。
【0038】
この実施例は、スタックおよびアンスタック命令が、内部に内蔵されるのではなく、プログラムの命令のサブセットの要素と関連付けられている前述の実施例と同一の利点を具備している。従って、これに関する詳細な説明は省略する。
【0039】
本発明の好適な実施例においては、既定値は、プログラムの重要な命令のサブセットを表している。
【0040】
この特徴は、本方法を使用してプログラムの命令の複数のサブセットを保護する場合に、特に有利である。
【0041】
これにより、(実行によって別の既定値がスタックされることになる別の命令のサブセットではなく)特定の命令のサブセットが正しく実行されたことをアンスタックステップにおいて検出可能である。
【0042】
当業者であれば、この特徴を使用することにより、試験の様々な分岐(C言語の「if」、「then」、「else」タイプ)を保護可能であることを容易に理解するであろう(異なる既定値が分岐のそれぞれにおいてスタックされ、その試験の終了時点においてアンスタックステップが実行される)。
【0043】
また、プログラムがサブルーチンを呼び出す場合には、この特徴は、サブルーチン呼び出しの後に、障害攻撃を受けることなく、サブルーチンに進入していることを、そのサブルーチンの実行の際に保証する。
【0044】
付録AおよびCを参照し、この特徴の使用法の2つの例について後程詳述する。
【0045】
本発明の別の特徴によれば、本発明の方法は、既定値以外の値がアンスタックステップにおいてアンスタックされた場合に実行される異常処理ステップを含んでいる。
【0046】
この特徴は、攻撃によってプログラムの正常な実行(並びに、特に、そのプログラムの関数の呼び出しまたはその実行からのリターン)が変更された場合に直ぐに異常処理ステップを実行可能であるという利点を具備している。この場合に、本方法は、特に有効である。
【0047】
例えば、スマートカード内において本発明の方法を使用する場合には、異常処理は、そのオペレーティングシステムを破壊することによってカードを動作不能にするステップを有することができる。
【0048】
付録A、C、およびDを参照し、この特徴の使用法の3つの例について後程詳述する。
【0049】
プログラムがサブルーチンに対する少なくとも1つの呼び出しを含んでいる特定の一実施例においては、アンスタックステップは、その呼び出しの前に実行され、既定値は、サブルーチンの実行の際にスタックから除去される。
【0050】
従って、この特徴は、サブルーチンが実行されており、かつ、それが正しく実行されていることをチェックする。
【0051】
サブルーチンに対する呼び出しがスキップされていたり、または、アンスタックステップが実行されていない場合には、命令スタックは、スタックされている既定値を保持している。
【0052】
付録BおよびCを参照して後述するように、続いて、この値をアンスタックすることにより、実行異常が検出されることになる。
【0053】
この特定の実施例においては、既定値は、好都合なことに、異常処理関数のアドレスであってよい。
【0054】
従って、例えば、サブルーチンを実行しないという結果をもたらす攻撃の結果、サブルーチンの実行の際に既定値がアンスタックされなければ、続いて、プロセッサがその値をアンスタックすることにより、この処理関数が実行されることになる。付録Bを参照し、一例について後程後述する。
【0055】
この特徴は、サブルーチンの実行を妨げるという結果をもたらすあらゆる種類の攻撃をプログラムが受けた場合に、処理機能を起動する。従って、これは、例えば、認証手順などの重要な機能を保護するために特に有用である。
【0056】
プログラムがサブルーチンに対する少なくとも1つの呼び出しを含んでいる別の特定の実施例においては、スタック段階は、サブルーチンの実行の際に実行され、既定値は、サブルーチンの実行の後に除去される。
【0057】
この特徴は、サブルーチンからのリターンが正しく実行されることをチェックする。
【0058】
サブルーチンからのリターンが妨げれられた場合には、命令スタックは、スタックされた既定値を保持している。
【0059】
付録Dを参照し、この特定の実施例について詳述する。
【0060】
このもう1つの特定の実施例においては、既定値は、好都合なことに、異常処理関数のアドレスであってよい。
【0061】
前述の理由から、この特徴は、サブルーチンの実行を妨げるという結果をもたらすあらゆる種類の攻撃をプログラムが受けた場合に、処理機能を起動する。従って、これは、例えば、認証手順などの重要な機能を保護するために特に有用である。
【0062】
付録Eを参照し、この特徴の使用法の例を提示する。
【0063】
本発明は、コンピュータによって読み取り可能であり、かつ、適宜、完全にまたは部分的に除去可能な、特に、CD−ROM、または、ハードディスクやディスケットなどの磁気媒体、または、電気信号や光学信号などの伝送可能な媒体などの情報媒体をも提供し、この情報媒体は、プログラムが電子データ処理システム内に読み込まれ、これによって実行された場合に、先程概説した方法を実行するコンピュータプログラムの命令を含んでいる。
【0064】
また、本発明は、情報媒体上に保存されたコンピュータプログラムをも提供し、このプログラムは、このプログラムが電子データ処理システム内に読み込まれ、これによって実行された場合に、先程概説した方法を実行する命令を含んでいる。
【0065】
また、本発明は、先程概説した方法を実装する手段を含む安全な電子的エンティティおよびスマートカードをも目的としている。
【0066】
情報媒体、コンピュータプログラム、およびスマートカードに固有の特定の利点および特徴については、本発明の方法を参照して前述したものと同一であるため、ここでは、再度の説明を省略する。
【0067】
本発明のその他の態様および利点については、本発明に従って保護されるコンピュータプログラムの5つの例を含む付録A〜Eを参照し非限定的な例として提示される特定の実施例に関する以下の説明を参照することにより、更に明らかとなろう。
【0068】
これらのプログラムは、C言語および80c51アセンブラ言語によって作成されている。この説明を円滑に行うために、それぞれの行の先頭には、文字列「/*」および「*/」に挟まれた注釈が付与されている。
【発明を実施するための最良の形態】
【0069】
本発明のスマートカードの好適な実施例については、図1を参照して説明する。
【0070】
付録Aは、/*a1*/から/*a33*/という番号が付与された33行の命令からなるコンピュータプログラムを有しており、この実行は、本発明の方法の好適な実施例によって保護されている。
【0071】
/*a1*/行は、命令ではない。これは、この付録Aのプログラムが、プログラムを保護するための命令に加え、文字列「...」の代わりに特定数の命令を含むことができるという事実を象徴している。これは、本発明とは無関係の命令の組を表している。
【0072】
/*a2*/行は、#pragma asmというディレクティブを含んでおり、これは、後続の命令行が80c51アセンブラ言語で作成されていることをコンパイラに通知している。
【0073】
/*a3*/行は、付録Aのプログラムの命令スタック内に(16進表記された)既定値0をスタックするステップを実行する命令を含んでいる。以下においては、わかりやすくするために、「値0を/*a3*/行においてスタックする」と記述する。
【0074】
次いで、値1を/*a4*/行においてスタックしている。
【0075】
この説明対象の好適な実施例においては、これらの既定値00hおよび01hは、それぞれ、2バイト符号化された(16進表記されている)値1の上位バイトと下位バイトを表している。
【0076】
/*a5*/行は、#pragma endasmというディレクティブを含んでおり、これは、後続の命令行が、もはや、80c51アセンブラ言語ではなく、Cによって作成されていることをコンパイラに通知している。
【0077】
前述の/*a1*/行に類似した/*a6*/および/*a7*/行は、本発明とは無関係の命令の組を表している。
【0078】
/*a8*/行は、「test」変数のコンテンツが「TRUE」に等しいかどうかを判定する試験を実行する命令を含んでいる。付録Aのプログラムの実行時に、これが真である場合には、プロセッサは、/*a8*/行の試験の後に、/*a9*/〜/*a23*/の命令を実行する。これは、当技術分野において周知である。
【0079】
そうでない場合には、このプログラムは、/*a24*/行の命令を直接実行する。
【0080】
/*a9*/行は、前述の/*a2*/行と同一である。
【0081】
/*a10*/および/*a11*/行は、前述の/*a3*/および/*a4*/行に類似している。これらは、2バイト符号化された(16進表記されている)値1を2つのステップにおいてスタックしている。
【0082】
/*a12*/行は、前述の/*a5*/行と同一である。
【0083】
前述の/*a1*/行に類似した/*a13*/および/*a14*/行は、本発明とは無関係の命令の組を表している。当然のことながら、これらの命令は、/*a14*/行の後に、命令スタックを/*a13*/の命令の前の状態に保持するという条件の下に、命令スタックを操作可能である。
【0084】
/*a15*/行は、前述の/*a2*/行と同一である。
【0085】
/*a16*/行は、その実行によって命令スタックからのアンスタックステップが実行される命令を含んでおり、アンスタックされた値は、レジスタA内に保存される。わかりやすくするために、以下においては、これを「/*a16*/行において、レジスタA内にアンスタックする」と記述する。
【0086】
/*a16*/の命令の後に、レジスタAは、スタック内にスタックされた最後の値を保存している(スタックは、LIFOメカニズムに従って動作している)。
【0087】
/*a17*/行は、レジスタAのコンテンツを値02Hと比較する命令を含んでいる。通常、/*a11*/行の命令の終了時点以降に、プログラムが、その実行において攻撃を受けていなければ、レジスタAは、/*a11*/行の命令においてスタックされた値02Hを含んでいる。
【0088】
従って、/*a16*/行のアンスタックステップにより、本発明の方法による実行異常の検出が実現する。
【0089】
/*a17*/行の比較ステップにおいて、レジスタAの値が値02Hと異なっていると検出された場合には、付録Aのプログラムは、/*a18*/行の命令において、「anomaly」というアドレスに分岐する。
【0090】
この説明対象の実施例においては、「anomaly」というアドレスは、本発明の方法の異常処理ステップのアドレスである。実際には、「anomaly」というアドレスは、プロセッサが直接解釈可能な16進表記によるアドレスである。
【0091】
一方、/*a17*/行の比較ステップにおいて、レジスタAが値02Hを保存していると検出された場合には、付録Aのプログラムは、/*a29*/行の命令を実行する。
【0092】
/*a19*/〜/*a21*/行は、前述の/*a16*/〜/*a18*/行に類似しており、
/*a19*/行において、レジスタA内にアンスタックし、
/*a20*/行において、レジスタAを値00Hと比較し(値00Hは、/*a10*/行においてスタックされた既定値に対応している)、
/*a20*/行の命令を実行した際にレジスタAが値00Hを含んでいない場合に、/*a21*/行の命令において、「anomaly」というアドレスに分岐する。
【0093】
一方、レジスタAが、値00Hを含んでいる場合には、プログラムは、/*a22*/行の命令を実行し、これは、前述の/*a5*/と同一である。
【0094】
/*a24*/および/*a25*/行は、前述の/*a1*/行に類似しており、本発明とは無関係の命令の組を表している。
【0095】
/*a26*/〜/*a33*/行は、前述の/*a15*/〜/*a22*/行と類似している。
【0096】
これらは、スタックが、破壊されており、/*a27*/行の命令を実行する直前に、それぞれ、/*a4*/および/*a3*/行内においてスタックされた既定値01Hおよび00Hを含んでいない場合に、プログラムの実行異常を検出可能なアンスタックステップ/*a28*/および/*a30*/を含んでいる。
【0097】
結論として、それぞれ、/*a6*/〜/*a25*/および/*a13*/〜/*a14*/行からなる2つの命令のサブセットが保護される。
【0098】
/*a6*/および/*a25*/行から構成されている命令の組は、
2バイト符号化された既定値1をスタックするステップ(/*a3*/および/*a4*/行)と、
/*a27*/および/*a30*/行のスタックステップと、によって保護されている。
【0099】
同様に、/*a13*/および/*a14*/行から構成されている命令のサブセットは、
2バイト符号化された既定値2をスタックするステップ(/*a10*/および/*a11*/行)と、
/*a16*/および/*a19*/行のスタックステップと、によって保護されている。
【0100】
この実装は、本発明をいずれの面においても制限するものではなく、既定値1および2も、同一であってもよく、あるいは、ランダムに選択することも可能であろう。
【0101】
付録Bは、/*b1*/〜/*b28*/という番号が付与された28行の命令からなるコンピュータプログラムを含んでおり、この実行は、本発明の好適な実施例によって保護されている。
【0102】
/*b1*/および/*b2*/行は、Cによって作成された関数「function」を宣言する最初の2行を構成しており、この関数は、入力パラメータとリターン値を具備していない。/*b11*/行は、この関数の宣言の最後の命令を含んでいる。
【0103】
付録Aを参照して前述した/*a1*/行に類似した/*b3*/行は、本発明とは無関係の命令の組を表している。
【0104】
/*b4*/行は、付録Aを参照して前述した/*a2*/行と同一である。
【0105】
/*b5*/および/*b6*/行の命令においては、2バイト符号化された既定値を2つのステップにおいてスタックするステップが実行されており、この値は、本発明の好適な実施例においては、異常処理関数OS_killcardのアドレスである。実際には、「OS_killcard」というアドレスは、プロセッサが直接解釈可能な16進表記のアドレスである。
【0106】
本方法を使用してマイクロ回路カードを保護する場合には、OS_killcard関数は、例えば、そのオペレーティングシステムを破壊することによってカードの動作を禁止する。
【0107】
/*b7*/行は、付録Aを参照して前述した/*a5*/行と同一である。
【0108】
付録Aを参照して前述した/*a1*/行に類似した/*b8*/行は、本発明とは無関係の命令の組を表している。
【0109】
/*b9*/行は、重要な関数である「critical_function」を呼び出す命令を含んでおり、このコードについては、/*b12*/〜/*b28*/行を参照して説明する。
【0110】
サブルーチンを呼び出すと、命令のスタック内に、そのサブルーチンのリターンアドレスが自動的にスタックされることになる。これは、当技術分野においては周知である。従って、2バイト符号化されたリターンアドレスが、スタックの2つのレジスタを占有することになる。この例においては、このアドレスは、/*b10*/行の命令のアドレスに対応しており、関数「critical_function」から戻る際に、この命令を実行しなければならない。
【0111】
一方では、/*b12*/および/*b13*/行が、他方では、/*b28*/行が、関数「critical_function」の宣言の最初の2行と最後の行を構成しており、この関数は、入力パラメータとリターン値を具備していない。
【0112】
/*b12*/および/*b13*/行の命令を実行した後に、命令スタック内にスタックされている最新の4つの値は、時系列の順に、関数OS_killcardのアドレスの上位バイト(/*b5*/行)、関数OS_killcardのアドレスの下位バイト(/*b6*/行)、/*b10*/行の第1の命令のアドレスの上位バイト、ならびに/*b10*/行の第1の命令のアドレスの下位バイトである。
【0113】
付録Aを参照して前述した/*a1*/行に類似した/*b14*/行は、本発明とは無関係の命令の組を表している。
【0114】
付録Aの/*a13*/および/*a14*/行を参照して前述したように、これらの命令は、命令スタックを/*b14*/の命令の前の状態に保持するものと仮定されている。
【0115】
/*b15*/行は、付録Aを参照して前述した/*a2*/行と同一である。
【0116】
/*b16*/行において、命令スタックがレジスタA内にアンスタックされ、このレジスタAのコンテンツは、その後、ステップ/*b17*/において、レジスタR7内に保存されている。
【0117】
同様に、/*b18*/行において、命令スタックがレジスタA内に再度アンスタックさ、このレジスタAのコンテンツは、ステップ/*b19*/において、レジスタR6内に保存されている。
【0118】
従って、以上の内容に鑑み、付録Bのプログラムが正常に実行された場合には、/*b19*/行の命令を実行した後に、レジスタR6およびR7は、それぞれ、
/*b10*/行の第1の命令のアドレスの上位バイトと、
/*b10*/行の第1の命令のアドレスの下位バイトと、を含んでいる。
【0119】
次いで、命令スタックは、/*b20*/および/*b21*/行において、レジスタA内に2回アンスタックされ、この結果、付録Bのプログラムが正常に実行されると、サブルーチン「critical_function」の実行の際に、命令スタックから関数OS_killcardの2バイトのアドレスが除去されることになる。
【0120】
/*b22*/行において、レジスタA内に、レジスタR6のコンテンツ、すなわち、/*b10*/行の第1の命令の上位バイトが保存され、/*b23*/行のステップにおいて、この値が命令スタック内にスタックされる。
【0121】
まったく同一の方式で、/*b24*/および/*b25*/行において、レジスタR7内に保存されている/*b10*/行の第1の命令の下位バイトがスタックされる。
【0122】
/*b26*/行は、付録Aを参照して前述した/*a5*/行と同一である。
【0123】
付録Aを参照して前述した/*a1*/行に類似した/*b27*/行は、本発明とは無関係の命令の組を表している。
【0124】
/*b28*/行は、サブルーチン「critical_function」の最後の行である。これは、実行した際に命令スタックの最初の2つのレジスタ内に保存されているアドレスへのプログラムのジャンプを引き起こす「RETURN」または「RET」タイプの命令によってアセンブラに変換される。これは、当技術分野において周知である。
【0125】
実行の際に攻撃を受けなければ、本プログラムは、/*b10*/行の第1の命令に分岐する(この命令のアドレスは、/*b23*/および/*b25*/行においてスタックされている)。
【0126】
付録Aを参照して前述した/*a1*/行に類似した/*b10*/行は、本発明とは無関係の命令の組を表している。
【0127】
/*b11*/行は、関数「function」を終了させる。
【0128】
結論として、付録Bの特定の実施例においては、関数OS_killcardのアドレスをスタックするステップは、サブルーチン「critical_fucntion」を呼び出す前に実行され、このアドレスは、このサブルーチンの実行の際に、/*b20*/および/*b21*/行において、スタックから除去されている。
【0129】
従って、この実施例は、サブルーチン「critical_function」が実際に実行されたことをチェックしている。
【0130】
例えば、このサブルーチンに対する呼び出しが妨げられた場合、または、更に一般的には、アンスタックステップが実行されなかった場合には、命令スタックは、関数OS_killcardの値を保持しており、その後、例えば、リターン命令の実行時点において、この値がアンスタックされると、実行異常が検出され、異常処理関数OS_killcardが実行されることになる。
【0131】
付録Cは、/*c1*/〜/*c32*/という番号が付与された32行の命令からなるコンピュータプログラムを含んでおり、この実行は、本発明の方法の好適な実施例によって保護されている。
【0132】
/*c1*/〜/*c11*/行は、命令スタック内に、関数OS_killcardのアドレスの代わりに、2バイト符号化された16進表記の既定値05F1Hがスタックされる点を除いて(/*c5*/および/*c6*/行)、付録Bを参照して前述した/*b1*/〜/*b11*/行に類似している。
【0133】
このスタックステップは、この場合にも、サブルーチンcritical_functionに対する呼び出しの前に実行されている。
【0134】
この特定の実施例においては、既定値05F1Hは、/*c12*/〜/*c19*/行の命令から構成されたサブセットを表している。
【0135】
/*c12*/〜/*c19*/行は、付録Bを参照して説明した/*b12*/〜/*b19*/行に類似している。
【0136】
従って、付録Cのプログラムが正常に実行された場合には、/*c19*/行の命令の実行の後に、レジスタR6およびR7は、それぞれ、関数「ciritial_function」のリターンアドレスに対応した/*c10*/行の第1の命令のアドレスの上位バイトと下位バイトとを含んでいる。
【0137】
次いで、命令スタックは、/*c20*/行において、レジスタA内にアンスタックされ、その後、このレジスタのコンテンツが、/*c21*/行において、F1Hという16進値と比較される。
【0138】
通常、(特に、関数「ciritical_function」を呼び出す時点において)プログラムが攻撃を受けていなければ、レジスタAは、/*c5*/行の命令においてスタックされた値F1Hを含んでいる。
【0139】
従って、/*c20*/行のアンスタックステップにより、本発明による実行異常の検出が実現する。
【0140】
/*c21*/行の比較ステップにおいて、レジスタAの値が値F1Hと異なっていると検出された場合には、付録Cのプログラムは、/*c22*/行の命令において、「OS_killcard」というアドレスに分岐する。これは、特に、(呼び出すことなしに、関数「critical_function」の実行をもたらすことになる)障害攻撃の後に発生し得るものである。
【0141】
従って、本発明の方法のこの実施例においては、アンスタックステップ(/*c20*/の命令)において、/*c6*/の命令においてスタックされた既定値F1Hとは異なる値がアンスタックされた場合に、異常処理プログラムOS_killcardが実行される。
【0142】
一方、/*c21*/行の比較ステップにおいて、レジスタAが値F1Hを保持していると検出された場合には、付録Cのプログラムは、/*c23*/行の命令を実行する。
【0143】
/*c23*/〜/*c25*/行は、前述の/*c20*/〜/*c22*/行に類似しており、
/*c23*/行において、レジスタA内にアンスタックされ、
/*c24*/行において、レジスタAを値05Hと比較し(値05Hは、/*c5*/行においてスタックされた既定値である)、
/*c25*/行の命令の実行時点においてレジスタAが値05Hを含んでいない場合に、/*c25*/行の命令において、アドレス「OS_killcard」に分岐する。
【0144】
一方、レジスタAが値05Hを含んでいる場合には、プログラムは、/*c26*/行の命令を実行する。
【0145】
いずれにせよ、/*c20*/および/*c23*/行の命令の実行により、実行スタックから既定値05F1Hが除去される。
【0146】
/*c26*/〜/*c29*/行は、付録Bを参照して前述した/*b22*/〜/*b25*/行に類似している。
【0147】
これらを使用することにより、/*c17*/および/*c19*/行の命令を実行した際にレジスタR6およびR7内に保存された値(すなわち、それぞれ、
/*c10*/行の第1の命令のアドレスの上位バイトと、
/*c10*/行の第1の命令のアドレスの下位バイト)と、を命令スタック内にスタックしている。
【0148】
/*c30*/〜/*c32*/行は、付録Bを参照して前述した/*b26*/〜/*b28*/行に類似している。
【0149】
従って、攻撃を受けなかった場合には、本プログラムは、/*c10*/行の第1の命令に分岐する(この命令のアドレスは、/*c27*/および/*c29*/行においてスタックされている)。
【0150】
付録Aを参照して前述した/*a1*/行に類似した/*c10*/行は、本発明とは無関係の命令の組を表しており、/*c11*/行は、付録Cの関数「function1」を終了させる。
【0151】
この実施例においては、値05F1Hは、異常処理関数のアドレスであってよい。/*c20*/〜/*c25*/行の試験を実行する際に攻撃が発生したとしても、この攻撃が、この異常処理関数の後続の使用によって検出されることになるため、この特定の実施例によれば、プログラムが更に保護される。
【0152】
この代わりに、複数の異常処理関数のアドレスを使用することも可能である(これらのアドレスのそれぞれは、重要な命令の組と関連付けられた既定値である)。
【0153】
付録Dは、/*d1*/〜/*d32*/の番号が付与された32行の命令からなるコンピュータプログラムを有しており、この実行は、本発明の方法の好適な実施例によって保護されている。
【0154】
この特定の実施例においては、プログラムは、/*d4*/行において、サブルーチン「critical_function」に対する呼び出しを含んでいる。
【0155】
この呼び出しにより、このサブルーチンのリターンアドレス(すなわち、/*d5*/行の命令のアドレス)が自動的にスタックされることになる。
【0156】
サブルーチン「critical_function」の/*d20*/〜/*d23*/行の命令を実行する際に、レジスタR6およびR7内に、命令スタックの最初の値、すなわち、このサブルーチンの2バイト符号化されたリターンアドレスが保存される。
【0157】
次いで、/*d24*/および/*d25*/行において、既定値05F1Hがスタックされる。
【0158】
この実施例においては、このスタックステップが、サブルーチン「critical_function」の実行の際に実行されていることに留意されたい。
【0159】
最終的に、/*d27*/および/*d29*/行の命令を実行する際に、レジスタR6およびR7のコンテンツがスタックされる(これらのレジスタは、前述のように、/*d5*/行の命令のアドレスを含んでいる)。
【0160】
従って、付録Dのプログラムは、サブルーチン「critical_function」の終了時点において/*d5*/行に分岐する。
【0161】
/*d5*/行の命令を実行する前において、命令スタックの最初の2つの値は、通常、/*d24*/および/*d25*/行においてスタックされた既定値05HおよびF1Hである。
【0162】
付録Aを参照して前述した/*a1*/行に類似した/*d5*/行は、本発明とは無関係の命令の組を表している。これらの命令は、命令スタックを/*d5*/行の前の状態に保持するものと仮定されている。
【0163】
/*d7*/〜/*d12*/行は、付録Cを参照して前述した/*c20*/〜/*c25*/行に類似しており、
/*d7*/および/*d10*/行において、レジスタA内にアンスタックし、
/*d8*/および/*d11*/行において、レジスタAを既定値F1Hおよび05Hと比較し、
/*d9*/および/*d12*/行の命令を実行する各時点において、レジスタAが、それぞれ値F1Hおよび05Hを含んでいない場合には、それぞれ/*d9*/および/*d12*/の命令において、アドレス「OS_killcard」に分岐する。
【0164】
従って、例えば、アンスタックステップ/*d7*/において、既定値F1Hと異なる値がアンスタックされた場合に、異常処理サブルーチンOS_killcardが実行される。
【0165】
この実施例においては、既定値05F1Hは、サブルーチン「critical_function」の実行の後に実行スタックから除去されており(別のサブルーチンの実行時点において攻撃が発生した後にではない)、攻撃の結果は、/*d6*/〜/*d13*/行の実行であることに留意されたい。
【0166】
従って、この実装は、/*d6*/〜/*d13*/行の命令が、サブルーチン「critical_function」の実行後に実行されることを保証している。
【0167】
/*d14*/および/*d15*/行は、付録Dのプログラムを終了させる。
【0168】
付録Eは、/*e1*/〜/*e28*/という番号が付与された28行の命令からなるコンピュータプログラムを含んでおり、この実行は、本発明の方法の好適な実施例によって保護されている。
【0169】
/*e1*/〜/*e5*/および/*e12*/〜/*e28*/行は、命令スタック内に、既定値05F1Hの代わりに、異常処理関数OS_killcardのアドレスがスタックされる点を除いて(/*e20*/および/*e21*/行)、それぞれ、付録Dを参照して説明した/*d1*/〜/*d5*/および/*d16*/〜/*d32*/行に類似している。
【0170】
サブルーチン「critical_function」の実行の際に、スタックステップも実行されている。
【0171】
従って、付録Eのプログラムは、サブルーチン「critical_function」の後に/*e5*/行に分岐する。
【0172】
/*e5*/行の命令を実行する前において、命令スタックの最初の2つの値は、通常、関数OS_killcardのアドレスの下位バイトおよび上位バイトであり、これらの既定値は、/*e21*/および/*e20*/行においてスタックされている。
【0173】
これらの値は、/*e7*/および/*e8*/行の命令を実行する際にアンスタックされる。
【0174】
この特定の実施例は、障害攻撃の後にではなく、呼び出された際に関数「critical_function」が実行されることを保証している。
【0175】
そうでない場合には、サブルーチンの実行から戻る必然的な時点において関数OS_killcardのアドレスをアンスタックすることにより(具体的には、この関数を実行することにより)、実行異常を検出することができよう。
【0176】
/*e10*/および/*e11*/行が付録Eのプログラムを終了させている。
【0177】
図1は、本発明のスマートカード100の好適な実施例を表している。
【0178】
わかりやすくするべく、マイクロ回路のコンテンツのみを図式的に示している。
【0179】
本発明のスマートカード100は、従来のスマートカードのハードウェアおよびソフトウェア要素(特に、半剛体材料の支持部および電源手段)を更に含んでいる。これらは、いずれも当業分野において周知であり、これらの要素に関する説明は、ここでは省略する。
【0180】
本発明のマイクロ回路カード100は、付録A〜Eを参照して前述した方法を実行する手段を含んでいる。
【0181】
本明細書において説明した好適な実施例においては、これらの手段は、特に、不揮発性のEEPROM、命令スタック(STACK)を収容するRAM、およびオペレーティングシステム(OS)を収容するROMと関連付けられたプロセッサ110から構成されている。
【0182】
半揮発性のEEPROMは、特に、付録A〜Eのプログラムを収容しており、プロセッサ100は、これらのプログラムを読み取って実行する。
【0183】
また、EEPROMは、「anomaly」および「OS_killcard」という2つのサブルーチンも収容している。
【0184】
付録A〜Eのプログラムを実行する際には、レジスタR6、R7およびtestレジスタはRAM内に保存される。
【0185】
本明細書において説明した実施例においては、レジスタAは、プロセッサ110のアキュムレータである。
【0186】
【表1】

【0187】
【表2】

【0188】
【表3】

【0189】
【表4】

【0190】
【表5】

【図面の簡単な説明】
【0191】
(原文記載なし)
【図1】


【特許請求の範囲】
【請求項1】
コンピュータプログラムの実行を保護する方法において、
前記プログラムの命令スタック内に既定値をスタックするスタックステップと、
適宜、実行異常を検出するべく、適合された前記スタックをアンスタックするアンスタックステップと、
を含むことを特徴とする方法。
【請求項2】
前記スタックステップおよび前記アンスタックステップは、それぞれ、前記プログラムの命令の少なくとも1つのサブセットの要素と関連付けられていることを特徴とする請求項1に記載の方法。
【請求項3】
前記要素は、それぞれ、括弧の組における開き括弧と閉じ括弧であることを特徴とする請求項2に記載の方法。
【請求項4】
前記アンスタックステップは、前記プログラムまたは前記プログラムのサブルーチンのリターン命令と関連付けられていることを特徴とする請求項2に記載の方法。
【請求項5】
前記プログラムは、その実行によって前記スタックステップを実装する第1命令および/またはその実行によって前記アンスタックステップを実装する第2命令を含むプログラム言語によって作成されていることを特徴とする請求項1〜4のいずれか一項に記載の方法。
【請求項6】
前記第2命令は、前記プログラムまたは前記プログラムのサブルーチンを終了させることを特徴とする請求項5に記載の方法。
【請求項7】
前記既定値は、前記プログラムの重要な命令のサブセットを表していることを特徴とする請求項1〜6のいずれか一項に記載の方法。
【請求項8】
前記アンスタックステップにおいて前記既定値以外の値がアンスタックされた場合に実行される異常処理ステップを含む請求項1〜7のいずれか一項に記載の方法。
【請求項9】
前記プログラムは、サブルーチンに対する少なくとも1つの呼び出しを含んでいる請求項1〜8のいずれか一項に記載の方法であって、前記スタックステップは、前記呼び出しの前に実行され、前記既定値は、前記サブルーチンの実行の際に前記スタックから除去されることを特徴とする方法。
【請求項10】
前記既定値は、異常処理関数のアドレスである請求項9に記載の方法。
【請求項11】
前記プログラムは、サブルーチンに対する少なくとも1つの呼び出しを含んでいる請求項1〜8のいずれか一項に記載の方法であって、前記スタックステップは、前記サブルーチンの実行の際に実行され、前記既定値は、前記サブルーチンの実行の後に前記スタックから除去されることを特徴とする方法。
【請求項12】
前記既定値は、異常処理関数のアドレスであることを特徴とする請求項11に記載の方法。
【請求項13】
コンピュータによって可読である情報媒体であって、
適宜に全体的または部分的に除去可能な、特に、CD−ROM、もしくは、ハードディスクやディスケットなどの磁気媒体、あるいは、電気的もしくは光学的信号などの伝送可能な媒体などの情報媒体において、
コンピュータプログラムが電子データ処理システム内に読み込まれ、これによって実行された場合に、請求項1〜12のいずれか一項に記載の方法を実装する前記コンピュータプログラムの命令を含んでいることを特徴とする情報媒体。
【請求項14】
情報媒体上に保存されたコンピュータプログラムであって、
該コンピュータプログラムが電子データ処理システム内に読み込まれ、これによって実行された場合に、請求項1〜12のいずれか一項に記載の方法を実行する命令を含んでいるコンピュータプログラム。
【請求項15】
保護されている電子的エンティティであって、
請求項1〜12のいずれか一項に記載の方法を実装する手段を含んでいることを特徴とする電子的エンティティ。
【請求項16】
スマートカードであることを特徴とする請求項15に記載の電子的エンティティ。

【公表番号】特表2007−516490(P2007−516490A)
【公表日】平成19年6月21日(2007.6.21)
【国際特許分類】
【出願番号】特願2006−518286(P2006−518286)
【出願日】平成16年7月6日(2004.7.6)
【国際出願番号】PCT/FR2004/001755
【国際公開番号】WO2005/008451
【国際公開日】平成17年1月27日(2005.1.27)
【出願人】(501094410)オベルトゥル カード システムズ ソシエテ アノニム (9)
【Fターム(参考)】