特許第6906057号(P6906057)IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ タレス・ディス・フランス・エス・アの特許一覧 ▶ エス・エフ・エヌ・テー・ジャーマニー・ゲー・エム・ベー・ハーの特許一覧

特許6906057ソフトウェアコードをセキュアにするための方法
<>
  • 特許6906057-ソフトウェアコードをセキュアにするための方法 図000002
  • 特許6906057-ソフトウェアコードをセキュアにするための方法 図000003
  • 特許6906057-ソフトウェアコードをセキュアにするための方法 図000004
  • 特許6906057-ソフトウェアコードをセキュアにするための方法 図000005
  • 特許6906057-ソフトウェアコードをセキュアにするための方法 図000006
  • 特許6906057-ソフトウェアコードをセキュアにするための方法 図000007
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】6906057
(24)【登録日】2021年6月30日
(45)【発行日】2021年7月21日
(54)【発明の名称】ソフトウェアコードをセキュアにするための方法
(51)【国際特許分類】
   G06F 21/14 20130101AFI20210708BHJP
【FI】
   G06F21/14
【請求項の数】12
【全頁数】15
(21)【出願番号】特願2019-541324(P2019-541324)
(86)(22)【出願日】2018年1月25日
(65)【公表番号】特表2020-505708(P2020-505708A)
(43)【公表日】2020年2月20日
(86)【国際出願番号】EP2018051865
(87)【国際公開番号】WO2018138211
(87)【国際公開日】20180802
【審査請求日】2019年9月24日
(31)【優先権主張番号】17153413.4
(32)【優先日】2017年1月26日
(33)【優先権主張国】EP
(73)【特許権者】
【識別番号】519271263
【氏名又は名称】タレス・ディス・フランス・エス・ア
(73)【特許権者】
【識別番号】519271274
【氏名又は名称】エス・エフ・エヌ・テー・ジャーマニー・ゲー・エム・ベー・ハー
(74)【代理人】
【識別番号】110001173
【氏名又は名称】特許業務法人川口國際特許事務所
(72)【発明者】
【氏名】ガロー,エリク
(72)【発明者】
【氏名】ボルペ,セバスチャン
(72)【発明者】
【氏名】ガルバ,ペーター
【審査官】 吉田 歩
(56)【参考文献】
【文献】 特開2003−280754(JP,A)
【文献】 米国特許出願公開第2010/0115287(US,A1)
【文献】 特開2006−053406(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 21/14
(57)【特許請求の範囲】
【請求項1】
少なくとも1つの定数値を備えたソフトウェアコード(SC)をセキュアにし、セキュアなソフトウェアコード(SSC)を生成する方法であって、
− 保護されるべき定数値を、ソフトウェアコードにおいて、プロセッサ(21)によって決定するステップ(S1)と、
− プロセッサによって、値のインデクス付けされた配列をソフトウェアコードに挿入し、配列の1つの値(X)から、保護されるべき定数値が決定され得るようにするステップ(S2)と、
− 保護されるべき定数値を、ソフトウェアコードにおいて、プロセッサによって、置換変数によって置換するステップ(S3)と、
− 命令の第1のシーケンスを、プロセッサによってソフトウェアコードに挿入するステップ(S4)であって、命令の第1のシーケンスは、ランタイムにおいて実行されたとき、
○ 保護されるべき定数値が決定され得る値(X)の、配列におけるインデクス(i)を計算し(E1)、
〇 前記配列における前記計算されたインデクス(i)に位置する値(X)を、前記配列から抽出し(E2)、
〇 前記抽出された値(X)から、保護されるべき定数値を決定し(E3)、
〇 前記置換変数の値を、決定された定数値に等しく設定する(E4)、ステップと
を備えた、方法。
【請求項2】
命令の第1のシーケンスが、ランタイムにおいて実行されたとき、第1の中間値(v)を返す、命令の第2のシーケンスと、ランタイムにおいて実行されたとき、前記インデクス(i)を計算するために、第1の変換関数(f)を前記第1の中間値(v)に適用する、命令の第3のシーケンスとを備えた、請求項1に記載の方法。
【請求項3】
第1の変換関数(f)が、所定の変換関数の第1のセットにおいてランダムに選択される、請求項2に記載の方法。
【請求項4】
保護されるべき定数値が決定され得る、配列における前記値(X)が、保護されるべき定数値に等しい、請求項1に記載の方法。
【請求項5】
保護されるべき定数値が、メモリアドレスであり、ソフトウェアコードがプロセッサによって実行されるとき、前記配列における値が、有効なメモリアドレスである、請求項1に記載の方法。
【請求項6】
命令の第1のシーケンスが、
− ランタイムにおいて実行されたとき、第2の変換関数(g)を、前記第1の中間値(v)に適用することにより、第2の中間値(m)を決定する命令の第4のシーケンスと、
− ランタイムにおいて実行されたとき、抽出された値(X)および第2の中間値(m)に基づいて、保護されるべき定数値を決定する命令の第5のシーケンスとを含む、請求項2に記載の方法。
【請求項7】
第2の変換関数(g)が、所定の変換関数の第2のセットにおいてランダムに選択される、請求項6に記載の方法。
【請求項8】
保護されるべき定数値が、メモリアドレスであり、ソフトウェアコードがプロセッサによって実行されるとき、前記配列における値が、無効なメモリアドレスである、請求項1に記載の方法。
【請求項9】
保護されるべき定数値が、第3の変換関数を、抽出された値および第2の中間値に適用することによって決定される、請求項6に記載の方法。
【請求項10】
第3の変換関数(h)が、所定の変換関数の第3のセットにおいてランダムに選択される、請求項6に記載の方法。
【請求項11】
プロセッサ(31)による実行のためのセキュアなソフトウェアコードの命令でエンコードされた非一時的な機械可読記憶媒体であって、
・ 前記セキュアなソフトウェアコードは、保護されるべき定数値を備えたセキュアでないソフトウェアコードの変更されたバージョンであり、
・ 保護されるべき前記定数値は、セキュアなコードにおいて、置換変数によって置換され、
・ 非一時的な機械可読記憶媒体は、
− 値のインデクス付けされた配列であって、保護されるべき前記定数値が、配列の1つの値(X)から決定され得る、配列と、
− 命令の第1のシーケンスと
でエンコードもされ、命令の第1のシーケンスは、ランタイムにおいて実行されたとき、
○ 保護されるべき前記定数値が決定され得る値(X)の、配列におけるインデクス(i)を計算し(E1)、
○ 前記配列における前記計算されたインデクス(i)に位置する値(X)を、前記配列から抽出し(E2)、
○ 前記抽出された値(X)から、保護されるべき前記定数値を決定し(E3)、
○ 前記置換変数の値を、前記決定された定数値に等しく設定する(E4)、
非一時的な機械可読記憶媒体。
【請求項12】
プロセッサ(31)による実行のためのセキュアなソフトウェアコードの命令を実行する方法であって、
・ 前記セキュアなソフトウェアコードは、保護されるべき定数値を備えたセキュアでないソフトウェアコードの変更されたバージョンであり、
・ 保護されるべき前記定数値が、セキュアなコードにおいて、置換変数によって置換され、
・ 前記セキュアなソフトウェアコードは、値のインデクス付けされた配列を備え、保護されるべき前記定数値が配列の1つの値(X)から決定され得るようにされ、
前記方法は、
・ 保護されるべき前記定数値が決定され得る値(X)の、配列におけるインデクス(i)を計算するステップ(E1)と、
・ 前記配列における前記計算されたインデクス(i)に位置する値(X)を、前記配列から抽出するステップ(E2)と、
・ 前記抽出された値(X)から、保護されるべき前記定数値を決定するステップ(E3)と、
・ 前記置換変数の値を、前記決定された定数値に等しく設定するステップ(E4)と
を備えた、
方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、ソフトウェア保護の分野に関し、より詳細には、改ざん防止技術の分野に関する。これは、ソフトウェアにおいて、定数値を安全に使用することを特に可能にする難読化方法を開示する。
【背景技術】
【0002】
現在、ソフトウェアアプリケーションを作動させることにより、多くのサービスがユーザに提供される。このようなアプリケーションは、デスクトップコンピュータ、ラップトップ、店頭(point of sale)端末、スマートフォンなど、モバイルまたはモバイル以外の様々なデバイスで作動する。このようなアプリケーションは、ローカルで作動することも、LANやインターネットなどのネットワークを介して実装されることもできる。スマートカードや銀行のクレジットカードなどのいくつかのデバイスは、1つまたはいくつかのアプリケーションの作動専用になっている場合もある。このようなアプリケーションは通常、セキュアにされていない環境で作動させられ、そこでは、攻撃者は、アプリケーションを作動させているシステムの動作のいくつかを制御するか、または完全に制御することさえできる。この結果、これらのアプリケーションのほとんどは、アプリケーションによって取り扱われるデータが、このような攻撃者によって読み取られる、または変更されることを防ぐために、いくつかのセキュリティメカニズムを実装する必要がある。
【0003】
攻撃者は、システムによって実行される、コンパイル済みのコードをリバースエンジニアリングすることによって、ソフトウェアの動作を理解しようとする場合がある。攻撃者は、その後、悪意のある動作を実施するために、ソフトウェアによって取り扱われるセキュアな情報にアクセスしたり、および/または、ソフトウェアを変更する可能性がある。たとえば、攻撃者は、悪意のある金融取引を実施するために、銀行業務ソフトウェアを変更したり、ライセンスを購入せずに無料で、ライセンスで保護されたソフトウェアを作動させるために、それを変更したりできる。このようなリバースエンジニアリングは通常、コードアナライザやデバッガなどのツールを使用して実施され、これらのツールは、コード内の命令の実行の順序を示す制御フローグラフなど、コードの動作に関する情報をコンパイル済みのコードから抽出する。
【0004】
ソフトウェアコードのあらゆる変更を阻止するために、改ざん防止技術が開発された。改ざん防止技術は、たとえば、ソフトウェアコードの特定の領域でチェックサム値を計算し、次いで、取得した値を知られている参照値と比較することによって、コードのある部分において完全性チェックを実施することにしばしば依存する。値が一致しない場合、コードは改ざんされており、ソフトウェアの通常の実行を拒否するか、ふりをするかのいずれかにより、ソフトウェアの実行を阻止する必要がある。それにも関わらず、このような保護も、攻撃者によってリバースエンジニアリングされ、破壊される可能性がある。デバッガまたはコードアナライザにとって、変数の定数値への初期化と、改ざん防止プロセスによって実施される比較におけるこのような定数値の使用とを突き止めることは特に簡単である。この種の情報は、コードにおいて実装されている保護の種類を識別するために攻撃者によって使用される可能性があり、それで、これにより保護を破ることができる。たとえば、攻撃者は、完全性チェックが実施されるソフトウェアの領域の開始と終了を識別し、コードが変更されていないときに完全性チェックルーチンによってこの領域で計算されるチェックサム値を推定し、次いで、チェックサム値が計算されるソフトウェアの領域内であっても、ソフトウェアコードの他の変更に関係なく、常に有効なチェックサム値を提供するために、完全性チェックルーチンにパッチを当てることができる。
【発明の概要】
【発明が解決しようとする課題】
【0005】
その結果、コンパイル済みのコードを解析する攻撃者に、ソフトウェア操作に関する情報を提供することなく、ソフトウェアにおいて、定数値を取り扱うことを可能にする方法に対するニーズがある。
【課題を解決するための手段】
【0006】
この目的のために、第1の態様によれば、本発明は、少なくとも1つの定数値を備えたソフトウェアコードをセキュアにする方法に関し、前記方法は、セキュアなソフトウェアコードを生成し:
− 保護されるべき定数値を、ソフトウェアコードにおいて、プロセッサによって決定するステップと、
− プロセッサによって、値のインデクス付けされた配列をソフトウェアコードに挿入し、配列の1つの値から、保護されるべき定数値が決定され得るようにするステップと、
− 保護されるべき定数値を、ソフトウェアコードにおいて、プロセッサによって、置換変数によって置換するステップと、
− 命令の第1のシーケンスを、プロセッサによってソフトウェアコードに挿入するステップであって、命令の第1のシーケンスは、ランタイムにおいて実行されたとき:
・ 保護されるべき定数値が決定され得る値の配列におけるインデクスを計算し、
・ 前記配列における前記計算されたインデクスに位置する値を、前記配列から抽出し、
・ 前記抽出された値から、保護されるべき定数値を決定し、
・ 前記置換変数の値を、決定された定数値に等しく設定する、ステップと
を備えている。
【0007】
定数値は、ソフトウェアコードにおいて、もはやそれとして出現しないため、定数値を攻撃者から隠すことができる一方、ランタイムにおいて、攻撃者によって容易に理解および再現されない手法で定数値を取得することを可能にする。結果として、セキュアなソフトウェアコードは、少なくともコードの静的解析に抵抗する可能性がより高くなる。
【0008】
実施形態では、命令の第1のシーケンスは、ランタイムにおいて実行されたとき、第1の中間値を返す、命令の第2のシーケンスと、ランタイムにおいて実行されたとき、前記インデクスを計算するために、第1の変換関数を前記第1の中間値に適用する、命令の第3のシーケンスとを備えている。
【0009】
保護されるべき定数値が決定され得る、値の配列におけるインデクスの2ステップの決定は、攻撃者が自分で前記インデクスを決定することを難しくし、したがって、この方法のセキュリティを強化する。
【0010】
実施形態では、第1の変換関数は、所定の変換関数の第1のセットにおいてランダムに選択される。
【0011】
変換関数をランダムに選択することが、異なる変数を保護するために異なる変換関数を使用することを可能にする。またこれは、保護されるべき定数値が決定され得る、値の配列におけるインデクスを検索するために、攻撃者が、使用する変換関数を予測することも不可能にする。
【0012】
実施形態では、保護されるべき定数値が決定され得る、配列における前記値は、保護されるべき定数値に等しい。
【0013】
これは、第1の変換関数によって返されたインデクスにおける配列における値を読み取ることにより、定数値のすばやく簡単な決定を可能とする。
【0014】
保護されるべき定数値は、メモリアドレスであり得、ソフトウェアコードがプロセッサによって実行されるとき、前記配列における値は、有効なメモリアドレスであり得る。
【0015】
こうすることで、攻撃者は、配列におけるアドレスの有効性に基づいて配列における定数値を認識できない。
【0016】
実施形態では、命令の第1のシーケンスは:
− ランタイムにおいて実行されたとき、第2の変換関数を前記第1の中間値に適用することによって、第2の中間値を決定する命令の第4のシーケンスと、
− ランタイムにおいて実行されたとき、抽出された値および第2の中間値に基づいて、保護されるべき定数値を決定する命令の第5のシーケンスとを含んでいる。
【0017】
このような実施形態は、配列における値からの定数値の間接的な決定を実施することを可能にする。こうすることで、定数値は、セキュアなソフトウェアコードのどこにも出現しなくなり、配列にさえも出現しなくなる。このような定数値の2ステップの決定が、攻撃者がプロセスを理解し、定数値を自分で検索することを、より困難にする。
【0018】
実施形態では、第2の変換関数は、所定の変換関数の第2のセットにおいてランダムに選択される。
【0019】
このような第2の変換関数のランダムな選択は、上記の第1の変換関数のランダムな選択と同じ利点を有する。これは、定数値が検索され得る、値のインデクスを決定することを可能にするプロセスを多様化し、したがって、リバースエンジニアリングをより困難にする。
【0020】
実施形態では、保護されるべき定数値は、メモリアドレスであり、ソフトウェアコードがプロセッサによって実行されるとき、前記配列における値は、無効なメモリアドレスである。
【0021】
配列における無効なメモリアドレスのみを使用するので、攻撃者は、どのアドレスであれば定数値の取得を可能にするのかを推測できない。
【0022】
保護されるべき定数値は、第3の変換関数を、抽出された値および第2の中間値に適用することによって決定され得る。実施形態では、第3の変換関数は、所定の変換関数の第3のセットにおいてランダムに選択される。
【0023】
これは、攻撃者が、使用されるべき関数を知らずに、定数値を決定することを不可能にする。
【0024】
第2の態様によれば、本発明は、プロセッサによる実行のためのセキュアなソフトウェアコードの命令でエンコードされた非一時的な機械可読記憶媒体に関し:
・ 前記セキュアなソフトウェアコードは、保護されるべき定数値を備えたセキュアでないソフトウェアコードの変更されたバージョンであり、
・ 保護されるべき前記定数値は、セキュアなコードにおいて、置換変数によって置換され、
・ 非一時的な機械可読記憶媒体は:
− 値のインデクス付けされた配列であって、保護されるべき前記定数値が配列の1つの値から決定され得る、配列と、
− 命令の第1のシーケンスと
でエンコードもされ、命令の第1のシーケンスは、ランタイムにおいて実行されたとき:
〇 保護されるべき前記定数値が決定され得る値の配列におけるインデクスを計算し、
〇 前記配列における前記計算されたインデクスに位置する値を、前記配列から抽出し、
〇 前記抽出された値から、保護されるべき前記定数値を決定し、
〇 前記置換変数の値を、前記決定された定数値に等しく設定する命令の第1のシーケンスでエンコードもされる。
【0025】
第3の態様によれば、本発明は、プロセッサによる実行のためのセキュアなソフトウェアコードの命令を実行する方法に関し:
・ 前記セキュアなソフトウェアコードは、保護されるべき定数値を備えたセキュアでないソフトウェアコードの変更されたバージョンであり、
・ 保護されるべき前記定数値は、セキュアなコードにおいて、置換変数によって置換され、
・ 前記セキュアなソフトウェアコードは、値のインデクス付けされた配列も備え、保護されるべき前記定数値が配列の1つの値から決定され得るようにされ、
前記方法は:
・ 保護されるべき前記定数値が決定され得る値の配列におけるインデクスを計算するステップと、
・ 前記配列における前記計算されたインデクスに位置する値を、前記配列から抽出するステップと、
・ 前記抽出された値から、保護されるべき前記定数値を決定するステップと、
・ 前記置換変数の値を、前記決定された定数値に等しく設定するステップとを備えている。
【0026】
第2の態様によるこのような非一時的機械可読記憶媒体、および第3の態様による方法は、第1の態様による方法のものと同じ利点を示す。
【0027】
前述の目的および関連する目的を達成するために、1つ以上の実施形態は、以下で十分に説明され、特に特許請求の範囲で指摘される特徴を備えている。
【0028】
以下の説明および添付の図面は、特定の例示的な態様を詳細に説明し、実施形態の原理が採用され得る様々な方法のほんのわずかを示している。他の利点および新規の特徴は、図面と併せて考慮されるとき、後続する詳細な説明から明らかになり、開示される実施形態は、このようなすべての態様およびそれらの均等物を含むことが意図される。
【図面の簡単な説明】
【0029】
図1】ソフトウェアをコンパイルするプロセスを示す図である。
図2】本発明の実施形態によるセキュアにするデバイスを概略的に示す図である。
図3】本発明の実施形態による実行デバイスを概略的に示す図である。
図4】本発明の実施形態によるソフトウェアコードをセキュアにする方法を概略的に示す図である。
図5】本発明の実施形態によるインデクス付けされた配列を示す図である。
図6】本発明の実施形態によるセキュアなソフトウェアコードの命令を実行する方法を概略的に示す図である。
【発明を実施するための形態】
【0030】
以下に詳述する説明では、本発明が実践され得る特定の実施形態を例示として示す添付図面に対する参照がなされる。これらの実施形態は、当業者が本発明を実践できるように十分詳細に説明されている。本発明の様々な実施形態は、異なるが、必ずしも相互に排他的ではないことを理解されたい。たとえば、1つの実施形態に関連して本明細書で説明される特定の特徴、構造、または特性は、本発明の精神および範囲から逸脱することなく、他の実施形態内で実装され得る。それに加えて、開示された各実施形態内の個々の要素の位置または配置は、本発明の精神および範囲から逸脱することなく変更され得ることを理解されたい。したがって、以下に詳述する説明は限定的な意味で解釈されるべきではなく、本発明の範囲は添付の特許請求の範囲によってのみ定義され、請求項が権利を与えられる均等物の全範囲とともに、適切に解釈される。
【0031】
本発明は、このソフトウェアコードにおいて保護されるべき少なくとも1つの定数値を難読化することにより、ソフトウェアコードSCをセキュアにすることを目的とする。これは、コンパイル済みのセキュアなソフトウェアコードSSCを作り出し、攻撃者が、コードアナライザまたはデバッガを用いて、コンパイル済みのセキュアなソフトウェアコードを解析することによって、これらの定数値についての知識を得ることを困難にする。
【0032】
コンパイルは、CやFortranなどの高級プログラミング言語で記述されたソースコード11を、図1に示すように、コードが実行されることになっているシステムのハードウェア実装を考慮に入れたマシンコード15などの低級言語で記述されたオブジェクトコードに変換する。コンパイルは、シンタックス解析12、制御フローグラフ生成13、およびアセンブリコード生成14などの中間ステップを実施することがよくある。コンパイル済みのコードの実行可能ファイルをビルドするために、通常、コンパイルは、オブジェクトコードを含む多数のファイルを単一の実行可能ファイルにともにリンクするリンクステップによって後続される。
【0033】
以下に説明する実施形態のほとんどのステップは、ソースコード、アセンブリコード、およびマシンコードのいずれにも適用され得る。以下の段落では、本発明による難読化方法の、以下ソフトウェアコードと呼ばれるコンパイル済みのコードへの適用について説明するが、これは、本発明の範囲の限定として解釈されないものとする。本発明の1つ以上のステップをソースコードに適用することにより当業者によって導出され得る様々な構成が、本発明の範囲に含まれる。
【0034】
本発明の第1の態様は、少なくとも1つの定数値を備えたソフトウェアコードSCをセキュアにするための難読化方法である。このようなセキュアにする方法は、少なくとも1つの定数値を備えたコンピュータコード命令を備えたコンパイル済みのソフトウェアコードSCを取り扱い、セキュアなソフトウェアコードSSCを作り出すセキュアにするデバイス20によって実施される。その後、取得されたセキュアなソフトウェアコードSSCは、実行デバイス30によって、セキュアに実行され得る。
【0035】
このようなセキュアにするデバイス20は、プロセッサを含む任意の電子デバイスであり得る。たとえば、これは、開発環境がインストールされたパーソナルコンピュータPCであり得る。図2は、第1のプロセッサ21、第1のRAMメモリ22、イーサネットまたはWifiネットワークアダプタのような第1の通信ユニット23、第1のディスプレイ24、ハードドライブのような第1の大容量記憶手段25、および第1のユーザ入力手段26を備えた、このようなセキュアにするデバイスの例示的な実施形態を説明する。セキュアにされるべきソフトウェアコードSCは、セキュアにするデバイスの第1の大容量記憶手段25に記憶され得る。セキュアにするデバイス20が、第1の態様による方法をソフトウェアコードSCに適用した後に得られるセキュアなソフトウェアコードSSCは、第1の大容量記憶装置25に記憶されることもできる。
【0036】
図3は、実行デバイス30の例示的な実施形態を説明する。たとえば、実行デバイス30は、パーソナルコンピュータPC、スマートフォンやタブレットのようなモバイルデバイス、または、銀行や店頭における公共端末であり得る。これは、スマートカードまたはクレジットカードに含まれる単純なチップでもよい。これは、第2のプロセッサ31、第2のRAMメモリ32、イーサネットまたはWifiネットワークアダプタのような第2の通信ユニット33、第2のディスプレイ34、ハードドライブのような第2の大容量記憶手段35、および第2のユーザ入力手段36を備え得る。実行デバイス30の第2のプロセッサ31によって実行されるべきセキュアなソフトウェアコードSSCは、実行デバイスの第2の大容量記憶手段35に記憶されてもよい。電子デバイス30は、実行デバイスのものと類似または異なる任意のタイプのものであり得る。両デバイスは、x86、ARM、PowerPCのような同じハードウェアアーキテクチャを共有することも、または異なるアーキテクチャを有することもある。
【0037】
セキュアにする方法の主なステップ
以下の段落では、図4に示すように、ソフトウェアコードSCをセキュアにし、セキュアなソフトウェアコードSSCを作り出す、本発明の第1の態様による方法のステップを説明する。これらのステップは、セキュアにするデバイス20の第1のプロセッサ21によって実施され、ステップ番号が後続する文字「S」ですべてラベル付けされている。
【0038】
必要なとき、第1の態様による方法が完了した後、セキュアなソフトウェアコードSSCを実行したときに実行デバイス30によって実施されるステップが参照される。このような実行ステップには、ステップ番号が後続する文字「E」でラベル付けされている。
【0039】
セキュアにする方法の主なステップ:第1のセキュアにするステップ
第1のセキュアにするステップS1では、保護されるべき定数値が、ソフトウェアコードにおいて決定される。保護されるべきこのような定数値は、人間のオペレータによって第1のプロセッサ21へ指定され得る。あるいは、これは、第1のプロセッサ21自体によってランダムに決定され得るか、または第1のプロセッサ21によって実行される解析プログラムによって決定され得る。第1の大容量記憶手段25から読み取られたソフトウェアコードをパーシングすることにより、第1のプロセッサ21は、たとえば、変数が、このような定数値に初期化されたとき(変数=constant_value)、または、定数値が、比較(if 変数>constant_value then ...)のような演算のパラメータとして使用されているとき、1つ以上の定数値を突き止めることができる。このような定数値はまた、セキュアなコードSCの命令が、実行デバイス30によって実行されたとき、実行デバイス30の第2のRAMメモリ内の位置を指定するメモリアドレスであり得る。このようなアドレスは、たとえば、完全性チェックが実施されるべきメモリのセクションの開始または終了を指定し得る。ソフトウェアコードを、攻撃者によるリバースエンジニアリングおよび改ざんから保護するために、このような定数値は、可能な限り攻撃者から隠されるべきであり、第1の態様にしたがう方法によって作り出されたセキュアなソフトウェアコードSSCにおいて「プレーンテキストで」留まるべきではない。
【0040】
以下のステップでは、目的は、ソフトウェアコードにおいて、定数値を、置換変数(replacement variable)と呼ばれる変数で置換し、実行デバイス30の第2のプロセッサ31によって実行されたとき、以下ターゲット値Xと呼ばれる別の値に基づいて、この置換変数の値を、保護された定数値に等しく設定する命令を、コードに挿入することである。コードの静的解析により定数値の検索を試みる攻撃者に対して、問題をより困難にするために、ターゲット値Xは多数の値を含む配列に格納され、実行デバイス30の第2のプロセッサ31により実行されたとき定数値が決定され得る、ターゲット値の配列におけるインデクスを計算する命令が、変更されたコードに挿入される。
【0041】
セキュアにする方法の主なステップ:第2のセキュアにするステップ
より正確には、第2のセキュアにするステップS2では、セキュアにされたデバイス20の第1のプロセッサ21が、図5に説明された値のインデクス付けされた配列を、ソフトウェアコードに挿入し得、保護されるべき定数値が、以下ターゲット値Xと呼ばれる配列の1つの値から決定されるようになる。以下の方法のステップでは、このような配列は、配列におけるターゲット値Xを読み取ることにより、定数値の間接的な決定を可能にする。
【0042】
セキュアにする方法の主なステップ:第3のセキュアにするステップ
第3のセキュアにするステップS3では、第1のプロセッサ21は、ソフトウェアコードにおいて、保護されるべき定数値を、置換変数によって置換する。実行デバイス30の第2のプロセッサ31が、セキュアなソフトウェアコードSSCを実行するときに、配列において読み取られたターゲット値に基づいて、定数値に等しく設定するのは、この置換変数の値である。
【0043】
この第3のセキュアにするステップS3の間、第1のプロセッサは、定数値の1つ、いくつか、またはすべての出現さえも、同じ置換変数によって置換し得る。攻撃者に対して効率的であるために、定数値のすべての出現が変数で置換される方が良いが、すべての出現が、同じ唯一の変数で置換されることは必須ではない。たとえば、半分の出現が、第1の置換変数によって、他の半分が、第2の変数によって置換され得る。特定の実施形態では、第1の態様による方法のすべてのステップが、定数値の出現ごとに別々に適用され得る。セキュアなソフトウェアコードは、それで、定数値の出現ごとに、専用の配列、ターゲット値、および置換変数を含んでいる。
【0044】
セキュアにする方法のメインステップ:第4のセキュアにするステップ
第4のセキュアにするステップS4では、第1のプロセッサ21が、命令の第1のシーケンスをソフトウェアコードに挿入する。この命令の第1のシーケンスは、この命令の第1のシーケンスを備えたセキュアなソフトウェアコードSSCが、実行デバイス30の第2のプロセッサ31によって実行されたとき、実行ステップE1からE4で説明されるアクションが実施されるようになっており、これら実行ステップは、以下および図6で説明される。この命令の第1のシーケンスは、セキュアなソフトウェアコードを実行するとき、実行デバイスが、配列におけるターゲット値Xに基づいて定数値を検索することを可能にすることを目的とする。
【0045】
SSCランタイムにおいて実行デバイスによって実行されたとき、命令の第1のシーケンスは:
− 保護されるべき定数値が決定され得る値Xの配列におけるインデクスiを計算し、
− 前記配列における前記計算されたインデクスiに位置する値Xを、前記配列から抽出し、
− 前記抽出された値Xから、保護されるべき定数値を決定し、
− 前記置換変数の値を、決定された定数値に等しく設定する。
【0046】
セキュアにする方法の例示的な実施形態
以下の段落では、セキュアにするデバイス20によって実施される本発明の第1の態様によるセキュアにする方法の例示的かつ非限定的な実施形態について説明する。
【0047】
上記で説明したように、第1のセキュアにするステップS1では、保護されるべき定数値が、ソフトウェアコードSCにおいて決定される。
【0048】
その後、第2のセキュアにするステップS2では、値のインデクス付けされた配列が挿入され、保護されるべき定数値が、ターゲット値Xと呼ばれる、配列の1つの値から決定され得るようにされる。
【0049】
第1のプロセッサ21は、ランダムに選択されたインデクスiにおいて、ターゲット値Xを、配列に含め得る。
【0050】
第1の実施形態では、ターゲット値Xは、保護されるべき対応する定数値に単に等しい。この実施形態では、保護されるべき定数値がメモリアドレスであれば、配列における値、好ましくはこれらのすべては、セキュアなソフトウェアコードが第2のプロセッサ31によって実行されるとき有効なメモリアドレスから、第1のプロセッサ21によって選択され得る。こうすることで、攻撃者は、配列における値を解析し、有効なメモリアドレスではない値を破棄することによって、定数値に対応する、配列における値を突き止めることができない。より一般的には、どんな定数値のタイプであろうと、配列における値は定数値と同じタイプであり得、定数値は、これらと調和するように選択され得る。
【0051】
その後、第3のセキュアにするステップS3では、保護されるべき定数値が、ソフトウェアコードにおいて置換変数によって置換される。
【0052】
そしてその後、第4のセキュアにするステップS4では、命令の第1のシーケンスが、ソフトウェアコードに挿入される。この命令の第1のシーケンスは、ランタイムにおいて実行されたとき、ターゲット値Xの配列におけるインデクスiを計算する。これを行うために、命令の第1のシーケンスは:
・ ランタイムにおいて実行されたとき、第1の中間値vを返す、命令の第2のシーケンスと、
・ ランタイムにおいて実行されたとき、第1の変換関数fを前記第1の中間値vに適用し、i=f(v)と記され得る前記インデクスiを計算する、命令の第3のシーケンスとを備え得る。
【0053】
命令の第2のシーケンスによる第1の中間値vの計算は、意図的に必要以上に、より複雑化され得る。これは、攻撃者が、リバースエンジニアリングすることと、このような計算を理解することとをより困難にすることを可能にする。このような計算は、オペイク(opaque)計算と呼ばれる。命令の第2のシーケンスは、ソフトウェアコードにおいて、第1の中間値を計算するだけではない別の目的を有するシーケンスであり得る。たとえば、これは、別の改ざん防止保護のために必要とされる完全性チェックであり得る。または、ループ(for、whileなど…)の組合せや、値がソフトウェアコードの別の部分で割り当てられている変数に対する動作など、攻撃者によって容易に理解できない手法で、第1の中間値を計算する以外の目的を持たない様々な命令からなる大きなシーケンスであり得る。
【0054】
命令の第3のシーケンスにおいて適用される第1の変換関数fは、配列のインデクス値の範囲における値を出力し、第1の中間値vに適用されたときに配列におけるターゲット値Xのインデクスを出力する任意の関数であり得る。たとえば、これは、インデクス値を出力するために、第1の中間値のマスクされたハッシュ、または第1の中間値のほんの少数の所定のビットを選択するマスクであり得る。
【0055】
第1の変換関数fは、関係i=f(v)を検証する所定の変換関数の第1のセットから、セキュアにするデバイス20の第1のプロセッサ21によってランダムに選択され得る。
【0056】
本発明の第1の態様による方法が、定数値のいくつかの出現に別々に適用されるとき、および、第1の変換関数が、所定の変換関数の第1のセットから毎回ランダムに選択されるとき、各命令の第3のシーケンスは、異なる変換関数を適用し得る。
【0057】
その後、この命令の第1のシーケンスは、ランタイムにおいて実行されたとき、前記配列における、前記計算されたインデクスiに位置する値Xを、前記配列から抽出し、その後、前記抽出された値Xから、保護されるべき定数値を決定し、最後に、前記置換変数の値を、決定された定数値に等しく設定する。
【0058】
第1の実施形態では、ターゲット値は、単純に、保護されるべき対応する定数値に等しい。この実施形態では、セキュアなソフトウェアコードSSCを実行したとき、第1の変換関数によって出力されたインデクスiにおいて、配列における定数値を単に読み取ることによって、定数値が取得される。この実施形態では、保護されるべき定数値の発見を試みる攻撃者は、配列においてそれを読み取ることができるが、配列におけるどの値が定数値であるかを発見する簡単な手法を有していない。
【0059】
第2の実施形態では、命令の第1のシーケンスは、ランタイムにおいて実行されたとき、第2の変換関数gを、前記第1の中間値vに適用することにより、第2の中間値mを決定する命令の第4のシーケンスを含んでいる。これは、m=g(v)と記され得る。
【0060】
この第2の実施形態では、命令の第1のシーケンスは、ランタイムにおいて実行されたとき、抽出されたターゲット値Xおよび第2の中間値mに基づいて、保護されるべき定数値を決定する命令の第5のシーケンスも含んでいる。このような実施形態は、定数値は、配列内でさえも、セキュアなソフトウェアコードにもはや格納されないため、攻撃者が、定数値を検索することをさらに困難にする。定数値を検索するために、攻撃者は、配列におけるすべての値からターゲット値Xを決定し、第2の中間値mを取得せねばならず、最後に、ターゲット値および第2の中間値に基づいて、定数値がどのように決定されるかを発見する必要がある。
【0061】
例として、この第2の実施形態では、保護されるべき定数値は、セキュアなソフトウェアコードSSCを実行したとき、配列からターゲット値Xを抽出し、前記第2の中間値mを決定した後、第3の変換関数hを、抽出されたターゲット値Xおよび第2の中間値mに適用することによって決定され得る。これは、constant_value=h(X,m)と記され得る。
【0062】
第1の変換関数が選択され得る手法は、所定の関数の第1のセットからの第1の変換関数のランダムな選択を含めて上記で説明された。同様に、第2の変換関数は、所定の変換関数の第2のセットにおいてランダムに選択され得、第3の変換関数は、所定の変換関数の第3のセットにおいてランダムに選択され得、前記セットは、ハッシュ関数およびマスク関数を含んでいる。これは、本発明の方法によって保護される各定数値または定数値の出現に対して異なる第2および第3の変換関数を使用することを可能にし、攻撃者が、セキュアなソフトウェアコードをリバースエンジニアリングすることをより困難にする。
【0063】
この第2の実施形態において、保護されるべき定数値がメモリアドレスの場合、定数値が決定され得るターゲット値Xは、セキュアなソフトウェアコードSSCが第2のプロセッサによって実行されるとき、実行デバイス30の第2のRAMメモリ32内の任意のオブジェクトの有効なメモリアドレスとはならない可能性が高い。配列におけるすべての値からターゲット値を隠蔽し続けるために、セキュアなソフトウェアコードが第1のプロセッサによって実行されるとき、配列における他の値が、無効なメモリアドレスとして選択され得る。こうすることで、メモリアドレスと見なされる配列における値の有効性に関する攻撃者による解析は、配列におけるどの値がターゲット値Xであるかを明らかにしないであろう。
【0064】
セキュアなソフトウェアコード実行
上記で説明されたステップが、セキュアなソフトウェアコードを作り出すセキュアにするデバイスによって実施された後、このようなセキュアなソフトウェアコードは、実行デバイス30の第2のプロセッサ31によって、セキュアに実行され得る。セキュアなソフトウェアコードを実行したとき、実行デバイスは、命令の第1のシーケンス:
− 第1の実行ステップE1の間、第2のプロセッサ31は、保護されるべき定数値が決定され得るターゲット値Xの配列におけるインデクスiを計算する。
− 第2の実行ステップE2の間、第2のプロセッサ31は、前記配列における前記計算されたインデクスiに位置する、ターゲット値Xである値を前記配列から抽出する。
− 第3の実行ステップE3の間、第2のプロセッサ31は、前記抽出された値から、保護されるべき定数値を決定する。
− 第4の実行ステップE4の間、第2のプロセッサ31は、前記置換変数の値を、決定された定数値に等しく設定する、
を実行する。
【0065】
実施形態では、第1の実行ステップE1は:
・ 第1の中間値vを返す第1の計算ステップE11と、
・ i=f(v)と記され得る前記インデクスiを計算するために、第1の変換関数fを前記第1の中間値vに適用する第2の計算ステップE12とを備え得る。
【0066】
上記で説明された第2の実施形態において、命令の第1のシーケンスは、m=g(v)と記され得る第2の変換関数gを前記第1の中間値vに適用することによって、第2の中間値mを決定することを含んでいる。その後、実行デバイス30の第2プロセッサ31が、配列からターゲット値Xを抽出し、前記第2の中間値mを決定した後、保護されるべき定数値は、抽出されたターゲット値Xおよび第2の中間値mに基づいて、第2のプロセッサ31によって決定される。
【0067】
保護されるべき定数値は、セキュアなソフトウェアコードSSCを実行したとき、配列からターゲット値Xを抽出し、前記第2の中間値mを決定した後、関数hを、抽出されたターゲット値Xおよび第2の中間値mに適用することによって決定され得る。
【0068】
他の態様
第2の態様では、本発明は、セキュアにするデバイス20の第1のプロセッサ21が、上記で説明された第1の態様による方法の少なくともセキュリティ保護ステップS1からS4を実施した後に得られるセキュアなソフトウェアコードの命令でエンコードされた非一時的機械可読記憶媒体にも関する。前記セキュアなソフトウェアコードは、そのとき、第1の態様による前記方法が適用され、保護されるべき定数値を備えたセキュアでないソフトウェアコードの変更されたバージョンである。前記記憶媒体上にエンコードされた命令において、保護されるべき前記定数値は、セキュアなコードにおいて、置換変数によって置換される。
【0069】
非一時的な機械可読記憶媒体は、値のインデクス付けされた配列でエンコードもされ、保護されるべき前記定数値は、配列の1つの値と、ランタイムにおいて実行されたとき、上記で説明された実行ステップE1からE4:
− 保護されるべき定数値が決定され得る値の配列におけるインデクスを計算し、
− 前記配列における前記計算されたインデクスに位置する値を、前記配列から抽出し、
− 前記抽出された値から、保護されるべき前記定数値を決定し、
− 前記置換変数の値を、前記決定された定数値に等しく設定する、
を実施する、命令の第1のシーケンスから決定されるようになる。
【0070】
第3の態様では、本発明はまた、実行デバイス30の第2のプロセッサ31によって実行されるような、セキュアなソフトウェアコードの命令を実行する方法に関する。前記セキュアなソフトウェアコードは、それで、上記で説明された第1の態様による方法が適用され、保護されるべき定数値を備えた、セキュアでないソフトウェアコードの変更されたバージョンである。保護されるべき前記定数値は、セキュアなコードにおいて、置換変数によって置換されており、前記セキュアなソフトウェアコードは、値のインデクスされた配列も備え、保護されるべき前記定数値が、配列の1つの値から決定され得るようになる。セキュアなソフトウェアコードの命令を実行する方法は、上記で説明された実行ステップE1からE4:
− 第1の実行ステップE1の間、第2のプロセッサ31は、保護されるべき定数値が決定され得るターゲット値Xの配列におけるインデクスiを計算し、
− 第2の実行ステップE2の間、第2のプロセッサ31は、前記配列における前記計算されたインデクスiに位置する値であるターゲット値Xを前記配列から抽出し、
− 第3の実行ステップE3の間、第2のプロセッサ31は、前記抽出された値から、保護されるべき定数値を決定し、
− 第4の実行ステップE4の間、第2のプロセッサ31は、前記置換変数の値を、決定された定数値に等しく設定すること
を備えている。
図1
図2
図3
図4
図5
図6