(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】5735629
(24)【登録日】2015年4月24日
(45)【発行日】2015年6月17日
(54)【発明の名称】アプリケーションを保護するためのリンキングおよびローディング方法
(51)【国際特許分類】
G06F 21/14 20130101AFI20150528BHJP
G06F 21/12 20130101ALI20150528BHJP
G06F 9/45 20060101ALI20150528BHJP
G06F 9/54 20060101ALI20150528BHJP
【FI】
G06F21/14
G06F21/12 350
G06F9/44 322K
G06F9/06 640B
【請求項の数】27
【全頁数】19
(21)【出願番号】特願2013-501567(P2013-501567)
(86)(22)【出願日】2010年3月31日
(65)【公表番号】特表2013-524321(P2013-524321A)
(43)【公表日】2013年6月17日
(86)【国際出願番号】CA2010000450
(87)【国際公開番号】WO2011120122
(87)【国際公開日】20111006
【審査請求日】2013年3月22日
【前置審査】
(73)【特許権者】
【識別番号】510302168
【氏名又は名称】イルデト カナダ コーポレーション
(74)【代理人】
【識別番号】100104444
【弁理士】
【氏名又は名称】上羽 秀敏
(74)【代理人】
【識別番号】100112715
【弁理士】
【氏名又は名称】松山 隆夫
(74)【代理人】
【識別番号】100125704
【弁理士】
【氏名又は名称】坂根 剛
(74)【代理人】
【識別番号】100120662
【弁理士】
【氏名又は名称】川上 桂子
(72)【発明者】
【氏名】グラント スチュアート グーズ
(72)【発明者】
【氏名】クリフォード リエム
【審査官】
脇岡 剛
(56)【参考文献】
【文献】
米国特許出願公開第2004/0260933(US,A1)
【文献】
国際公開第2006/001365(WO,A1)
【文献】
米国特許第07287166(US,B1)
【文献】
特表2002−514333(JP,A)
【文献】
国際公開第2006/090800(WO,A1)
【文献】
Chongkyung Kil 外4名,Address Space Layout Permutation (ASLP): Towards Fine-GrainedRandomization of Commodity Software,Proceedings of the 22nd Annual Computer Security Applications Conference (ACSAC'06),2006年12月,[online]、[検索日:2014.02.21],URL,http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=4041179
【文献】
Christian Collberg, et. al,A Taxonomy of Obfuscating Transformation,University of Auckland,1997年,[online]、[検索日:2014.02.21],URL,https://researchspace.auckland.ac.nz/bitstream/handle/2292/3491/TR148.pdf?sequence=2
(58)【調査した分野】(Int.Cl.,DB名)
G06F 21/14
G06F 9/45
G06F 9/54
G06F 21/12
(57)【特許請求の範囲】
【請求項1】
ビルドタイムまたはロードタイム時に、セキュリティ変換をオブジェクトコードに適用する方法であって、
前記方法は、
受け取ったランダムシードに基づいて乱数を生成する工程と、
前記乱数に基づいて、実行可能プログラムの区別可能なインスタンスを複数のオブジェクトコードモジュールから生成する工程であって、
前記複数のオブジェクトコードモジュール内の各オブジェクトコードモジュールを、前記乱数に基づいて、当該オブジェクトコードモジュールの複数の区別可能なインスタンスであって、同様の機能性を呈するが異なる性能および/またはセキュリティ特性を有する複数の区別可能なインスタンスから選択することと、
前記乱数に基づいて前記複数のオブジェクトコードモジュールのランダムなレイアウトを決定することと、
前記ランダムなレイアウトにしたがって前記複数のオブジェクトコードモジュールを組み合わせて、前記実行可能プログラムの前記区別可能なインスタンスを生成することと、
によってそれを行う工程と、
前記実行可能プログラムの前記区別可能なインスタンス内のシンボルを解決する工程と、
を含み、
前記工程で生成された前記実行可能プログラムの前記区別可能なインスタンスにおける各オブジェクトコードモジュールは、当該オブジェクトコードモジュールの他の区別可能なインスタンスとは異なる性能および/またはセキュリティ特性を有し、前記実行可能プログラムの前記区別可能なインスタンスにおける各オブジェクトコードモジュールは、当該オブジェクトコードモジュールの他の区別可能なインスタンスと機能的に等価である、方法。
【請求項2】
各オブジェクトコードモジュールの前記複数の区別可能なインスタンスは、インスタンスが作成された複数のオブジェクトコードモジュールを含む多様的に設定されたライブラリを含む、請求項1に記載の方法。
【請求項3】
前記多様的に設定されたライブラリ内の、インスタンスが作成された各オブジェクトコードモジュールは、区別可能なセキュリティ特性でインスタンスが作成され、前記選択は、
前記複数のオブジェクトコードモジュール用のアセット評価とコールサイトのプロファイル重みとを、前記複数のオブジェクトコードモジュール内に埋め込むことと、
前記アセット評価と前記プロファイル重みとに基づいて前記選択を制約することと、
をさらに含む、請求項2に記載の方法。
【請求項4】
前記ランダムなレイアウトを決定することは、前記複数のオブジェクトコードモジュールのそれぞれを、別々のコード部分に分割し、メモリイメージ内の前記コード部分の位置をランダム化することを含む、請求項1に記載の方法。
【請求項5】
前記コード部分の位置をランダム化することは、前記複数のオブジェクトコードモジュールのうちの異なるオブジェクトコードモジュールからのコード部分を混合することを含む、請求項4に記載の方法。
【請求項6】
前記部分の位置をランダム化することは、前記複数のオブジェクトコードモジュールのうちの異なるオブジェクトコードモジュールからのコード部分を、データ部分と混合することを含む、請求項4に記載の方法。
【請求項7】
実行可能プログラムの区別可能なインスタンスを生成することは、セキュリティ変換定数の遅延結合をさらに含み、
前記遅延結合は、前記複数のオブジェクトコードモジュールのうちの各オブジェクトコードモジュール用の前記セキュリティ変換定数を、当該オブジェクトコードモジュールのインスタンスに適用されたセキュリティ変換に関するメタデータに基づいて決定することによって行われる、請求項1に記載の方法。
【請求項8】
前記セキュリティ変換は、プログラム変換である、請求項7に記載の方法。
【請求項9】
前記プログラム変換は、データフロー変換または制御フロー変換である、請求項8に記載の方法。
【請求項10】
実行可能プログラムイメージの複数の多様なインスタンスを生成する方法であって、前記方法は、前記実行可能プログラムイメージの所望のインスタンスの各々について、
受け取ったランダムシードに基づいて乱数を生成する工程と、
前記乱数に基づいて、複数のオブジェクトコードモジュールから生成される実行可能プログラムイメージの区別可能なインスタンスを生成する工程であって、
前記複数のオブジェクトコードモジュールのうちの各オブジェクトコードモジュールを、前記乱数に基づいて、当該オブジェクトコードモジュールの複数の区別可能なインスタンスであって、同様の機能性を呈するが異なる性能および/またはセキュリティ特性を有する複数の区別可能なインスタンスから選択することと、
前記複数のオブジェクトコードモジュールのランダムなレイアウトを前記乱数に基づいて決定することと、
前記ランダムなレイアウトにしたがって、前記複数のオブジェクトコードモジュールを組み合わせて、実行可能プログラムイメージの区別可能なインスタンスを生成することと、によって行われる工程と、
前記実行可能プログラムイメージの区別可能なインスタンス内のシンボルを解決する工程と、
を含み、
前記工程で生成された前記実行可能プログラムの前記区別可能なインスタンスにおける各オブジェクトコードモジュールは、当該オブジェクトコードモジュールの他の区別可能なインスタンスとは異なる性能および/またはセキュリティ特性を有し、前記実行可能プログラムの前記区別可能なインスタンスにおける各オブジェクトコードモジュールは、当該オブジェクトコードモジュールの他の区別可能なインスタンスと機能的に等価である、方法。
【請求項11】
各オブジェクトコードモジュールの前記複数の区別可能なインスタンスは、インスタンスが作成された複数のオブジェクトコードモジュールを含む多様的に設定されたライブラリを含む、請求項10に記載の方法。
【請求項12】
前記多様的に設定されたライブラリ内の、インスタンスが作成された各オブジェクトコードモジュールは、区別可能なセキュリティ特性でインスタンスが作成され、前記選択は、
前記複数のオブジェクトコードモジュール用のアセット評価とコールサイトのプロファイル重みとを、前記複数のオブジェクトコードモジュール内に埋め込むことと、
前記アセット評価と前記プロファイル重みとに基づいて前記選択を制約することと、
をさらに含む、請求項11に記載の方法。
【請求項13】
前記ランダムなレイアウトを決定することは、前記複数のオブジェクトコードモジュールのそれぞれを、別々のコード部分に分割し、メモリイメージ内の前記コード部分の位置をランダム化することを含む、請求項10に記載の方法。
【請求項14】
前記コード部分の位置をランダム化することは、前記複数のオブジェクトコードモジュールのうちの異なるオブジェクトコードモジュールからのコード部分を混合することを含む、請求項13に記載の方法。
【請求項15】
前記部分の位置をランダム化することは、前記複数のオブジェクトコードモジュールのうちの異なるオブジェクトコードモジュールからのコード部分を、データ部分と混合することを含む、請求項13に記載の方法。
【請求項16】
実行可能プログラムの区別可能なインスタンスを生成することは、セキュリティ変換定数の遅延結合をさらに含み、
前記遅延結合は、前記複数のオブジェクトコードモジュールのうちの各オブジェクトコードモジュール用の前記セキュリティ変換定数を、当該オブジェクトコードモジュールのインスタンスに適用されたセキュリティ変換に関するメタデータに基づいて決定することによって行われる、請求項10に記載の方法。
【請求項17】
前記セキュリティ変換は、プログラム変換である、請求項16に記載の方法。
【請求項18】
前記プログラム変換は、データフロー変換または制御フロー変換である、請求項17に記載の方法。
【請求項19】
実行可能プログラムイメージの複数の多様なインスタンスを生成する方法であって、前記方法は、前記実行可能プログラムイメージの所望のインスタンスの各々について、
受けとったランダムシードに基づいて乱数を生成する工程と、
オブジェクトコードモジュールの部分集合を生成するために、前記乱数により決定された多様化操作を、オブジェクトコードモジュールの集合に適用し、かつ、前記オブジェクトコードモジュールの部分集合に関連付けられたシンボルを解決する工程と、
前記解決されたシンボルによって決定された区別可能な設定を有する、前記実行可能プログラムイメージのインスタンスを生成する工程と、
を含み、
前記乱数により決定された多様化操作は、
前記部分集合内の各オブジェクトコードモジュールを、前記乱数に基づいて、当該オブジェクトコードモジュールの複数の区別可能なインスタンスであって、同様の機能性を呈するが異なる性能および/またはセキュリティ特性を有する複数の区別可能なインスタンスから選択することと、
前記乱数に基づいて、前記選択されたオブジェクトコードモジュールのランダムなレイアウトを決定することと、を含み、
前記実行可能プログラムイメージのインスタンスにおける各オブジェクトコードモジュールは、当該オブジェクトコードモジュールの他の区別可能なインスタンスとは異なる性能および/またはセキュリティ特性を有し、前記実行可能プログラムイメージのインスタンスにおける各オブジェクトコードモジュールは、当該オブジェクトコードモジュールの他の区別可能なインスタンスと機能的に等価である、方法。
【請求項20】
前記オブジェクトコードモジュールの部分集合を生成する工程は、前記シンボルを解決して、前記オブジェクトコードモジュールの部分集合のランダム化されたメモリイメージレイアウトを提供することを含む、請求項19に記載の方法。
【請求項21】
前記オブジェクトコードモジュールの部分集合を生成する工程は、前記シンボルを解決して、前記複数のオブジェクトコードモジュールの区別可能なインスタンスのランダム化された選択を提供することを含む、請求項19に記載の方法。
【請求項22】
ビルドタイム時にカプセル化された実行可能プログラムの複数の多様な、区別可能なインスタンスを提供するリンカーであって、前記リンカーは、
プロセッサに、受け取ったランダムシードに基づいて乱数を生成させるよう構成された乱数生成器と、
前記プロセッサにオブジェクトコードモジュールの部分集合を生成させるランタイムモジュールであって、
前記乱数により決定された多様化操作をオブジェクトコードモジュールの集合に適用することと、
前記オブジェクトコードモジュールの部分集合に関連付けられたシンボルを解決し、
前記プログラムの各起動時に、前記解決されたシンボルによって決定された区別可能な設定を有する、実行可能プログラムイメージのインスタンスを生成することによって、それを行うランタイムモジュールと、
を含み、
前記乱数により決定された多様化操作は、
前記部分集合内の各オブジェクトコードモジュールを、前記乱数に基づいて、当該オブジェクトコードモジュールの複数の区別可能なインスタンスであって、同様の機能性を呈するが異なる性能および/またはセキュリティ特性を有する複数の区別可能なインスタンスから選択することと、
前記乱数に基づいて、前記選択されたオブジェクトコードモジュールのランダムなレイアウトを決定することと、を含み、
前記実行可能プログラムイメージのインスタンスにおける各オブジェクトコードモジュールは、当該オブジェクトコードモジュールの他の区別可能なインスタンスとは異なる性能および/またはセキュリティ特性を有し、前記実行可能プログラムイメージのインスタンスにおける各オブジェクトコードモジュールは、当該オブジェクトコードモジュールの他の区別可能なインスタンスと機能的に等価である、リンカー。
【請求項23】
ランタイム時に実行可能プログラムイメージの多様な、区別可能なインスタンスを提供するローダーであって、前記ローダーは、
プロセッサに、受け取ったランダムシードに基づいて乱数を生成させるよう構成された乱数生成器と、
前記プロセッサにオブジェクトコードモジュールの部分集合を生成させるリンキングモジュールであって、
前記乱数により決定された多様化操作をオブジェクトコードモジュールの集合に適用し、
前記オブジェクトコードモジュールの部分集合に関連付けられたシンボルを解決し、
前記解決されたシンボルによって決定された区別可能な設定を有する、前記実行可能プログラムイメージのインスタンスを生成することによって、それを行うリンキングモジュールと、
を含み、
前記乱数により決定された多様化操作は、
前記部分集合内の各オブジェクトコードモジュールを、前記乱数に基づいて、当該オブジェクトコードモジュールの複数の区別可能なインスタンスであって、同様の機能性を呈するが異なる性能および/またはセキュリティ特性を有する複数の区別可能なインスタンスから選択することと、
前記乱数に基づいて、前記選択されたオブジェクトコードモジュールのランダムなレイアウトを決定することと、を含み、
前記実行可能プログラムイメージのインスタンスにおける各オブジェクトコードモジュールは、当該オブジェクトコードモジュールの他の区別可能なインスタンスとは異なる性能および/またはセキュリティ特性を有し、前記実行可能プログラムイメージのインスタンスにおける各オブジェクトコードモジュールは、当該オブジェクトコードモジュールの他の区別可能なインスタンスと機能的に等価である、ローダー。
【請求項24】
実行可能プログラムイメージの複数の多様なインスタンスを生成するローダーであって、前記ローダーは、
プロセッサに、受け取ったランダムシードに基づいて乱数を生成させるよう構成された乱数生成器と、
前記乱数に基づいて、前記プロセッサに、複数のオブジェクトコードモジュールから生成される実行可能プログラムイメージの区別可能なインスタンスを生成させるランタイムモジュールであって、
前記複数のオブジェクトコードモジュールのうちの各オブジェクトコードモジュールを、前記乱数に基づいて、当該オブジェクトコードモジュールの複数の区別可能なインスタンスであって、同様の機能性を呈するが異なる性能および/またはセキュリティ特性を有する複数の区別可能なインスタンスから選択し、
前記複数のオブジェクトコードモジュールのランダムなレイアウトを前記乱数に基づいて決定し、
前記ランダムなレイアウトに準じて前記複数のオブジェクトコードモジュールを組み合わせて、実行可能プログラムイメージの区別可能なインスタンスを生成し、
前記実行可能プログラムイメージの区別可能なインスタンス内のシンボルを解決することによって、それを行うランタイムモジュールと、
を含み、
生成された前記実行可能プログラムの前記区別可能なインスタンスにおける各オブジェクトコードモジュールは、当該オブジェクトコードモジュールの他の区別可能なインスタンスとは異なる性能および/またはセキュリティ特性を有し、前記実行可能プログラムの前記区別可能なインスタンスにおける各オブジェクトコードモジュールは、当該オブジェクトコードモジュールの他の区別可能なインスタンスと機能的に等価である、ローダー。
【請求項25】
前記ランダムなレイアウトは、ランタイムローディング時のランダムなアドレス割り当てを含む、請求項24に記載のローダー。
【請求項26】
前記複数のオブジェクトコードモジュールのうちの各オブジェクトコードモジュールの選択は、さらにランタイム条件に基づく、請求項24に記載のローダー。
【請求項27】
前記ランタイム条件は、不正な違反を検出することを含む、請求項26に記載のローダー。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、改ざんからソフトウェアを保護する方法とシステムに関する。本開示は特に、リンキングおよびローディング時にアプリケーションソフトウェアを保護する方法とシステムに関する。
【背景技術】
【0002】
従来より、所与のソフトウェアモジュールのためのセキュリティ変換がソースコードへ直接適用されている。たとえば、プログラム変換は、ソフトウェアへの逆行分析攻撃や改ざん攻撃への耐性を求める効果的な取り組みであった。加えて、これらセキュリティ変換の多様化は、差分攻撃、結託、その他それらに匹敵する脅威に対する防壁となっている。たとえば、2003年7月15日発行の米国特許第6594761号、および2005年1月11日発行の米国特許第6842862号は、ソフトウェアを保護するために使用できるデータフロー変換技術を記載し、また、2004年8月17日発行の米国特許第6779114号は、ソフトウェアを保護するために使用できる制御フロー変換技術を記載している。
【0003】
セキュリティ変換が適用されると、まずソースファイルがプリコンパイラによって処理されるが、これによってソフトウェアモジュールのソースからソースへのセキュリティ変換が行われ、ユーザーの定めるセキュリティ決定に基づく変換を含む、変換済みソースファイルが生成される。変換済みソースファイルはその後、ネイティブコンパイラによって処理され、オブジェクトコードが生成される。この得られたネイティブオブジェクトコード(静的ライブラリとしてパッケージ化されることもある)はエンドユーザにとってはイミュータブルであり、実行可能バイナリライブラリまたは動的ライブラリにされるにはリンカーによって処理されなければならない。ライブラリはリンカーによってプログラムに統合される。リンカーの出力(特に、メモリ内のソフトウェアモジュールのレイアウト)は自動的に生成され、それはランタイム性能のために最適化された入力ソフトウェアモジュールの確定関数である。メモリレイアウトを変更することが望ましければ、リンカーの大半は複合メタデータの使用を必須とするが、これは一般的には、最上級のユーザーは別として、ユーザーができる範囲を超えている。
【0004】
もしソフトウェアモジュールのセキュリティ決定を修正する必要があれば、またはモジュールの多様なインスタンスの作成が望ましかったとしても、プリコンパイル、コンパイル、およびリンキング/ローディングというステップを繰り返す以外に選択肢は無い。これは、関与するビルドタイムの点だけではなく、品質保証の観点からも、費用がかかる。ソフトウェアモジュールを再構築するためは、得られた実行可能/動的ライブラリの性能(速度、サイズなど)と正確さが再検証されなければならない。
【0005】
従って、セキュリティ決定の変更が必要な時や、多様なインスタンスを作成する必要がある時などに、ソフトウェアモジュールの再構築を不要にするセキュリティ変換を適用するための、改善された方法とシステムとを提供することが望ましい。
【発明の概要】
【0006】
本開示は、得られた実行可能/動的ライブラリにおける多様性によってセキュリティを提供するいくつかのやり方でバイナリ出力コードの内容を変更できるソフトウェアリンカーまたはソフトウェアローダーを提供する。3つの具体的な実施形態が開示されている。第一は、メモリイメージ再配置が関与する。リンカーの結果が、再配置可能なセグメントまたはセクションの各々についての、ランダム化されたベースアドレス割り当ておよびレイアウトであり、これは従来のリンカーによってなされる決定論的結論とは対照的である。この試みは、セクションの予測可能な位置に基づく攻撃に対する、大きな障壁となり得る。第二は、選択的構築が関与する。個別のコードモジュールが、大容量のライブラリ中に、多数の多様な形式で作成でき、分けて設定される。リンカーは、最終的な実行可能ファイルについてランダムにコードインスタンスを選択する。この試みは、差分攻撃を防ぐことができる。第三は、定数の遅延結合が関与する。データおよび制御フローセキュリティ変換などのプログラム変換は、選択された定数で特徴づけられた操作パラメータを有する。これらパラメータは、同様に処理されて再配置アドレスとなり、リンクタイム時に選択され、その結果、実行時の変換の多様化がもたらされる。この試みはまた、差分攻撃に対しても使用でき、また、組織化されたアップデートによって更新できるようにもする。
【0007】
前記リンカーまたはローダーの態様は、この動作の範囲を制御するというオプションや、予測可能に多様なアウトプットイメージの作成を可能にするランダムシードパラメータを受け入れる。リンカーが全く同じ入力ソフトウェアモジュールと、同じランダムシードとで二度起動されると、アウトプットイメージも同じであろう。多様なアウトプットイメージを生成するためには、区別可能なランダムシードが選択されなければならなかったであろう。
【0008】
第一の態様において、ビルドタイム時またはロードタイム時に、オブジェクトコードにセキュリティ変換を適用する方法が提供される。前記方法は、疑似乱数生成器への入力としてランダムシードを特定する工程を含む。次に、前記ランダムシードを前記疑似乱数生成器への入力として適用することによって複数のコンパイルされたソフトウェアモジュールに多様化操作を適用して、前記複数のコンパイルされたソフトウェアモジュールの各々の区別可能なインスタンスの群から、前記複数のコンパイルされたソフトウェアモジュールの各々のインスタンスをランダムに選択し、前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスのランダムなレイアウトを決定することによって、実行可能モジュールの区別可能なインスタンス、または実行可能プログラムイメージが生成される。前記ランダムなレイアウトにしたがって前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスを組み合わせて、前記実行可能モジュールの前記区別可能なインスタンスを生成する。前記実行可能モジュールの前記区別可能なインスタンス内でシンボルが解決される。
【0009】
さらなる態様において、実行可能プログラムイメージの複数の多様なインスタンスを生成する方法が提供される。前記実行可能プログラムイメージの所望のインスタンスの各々について、疑似乱数生成器への入力としてランダムシードが特定される。そして、前記ランダムシードを前記疑似乱数生成器への入力として適用することによって複数のコンパイルされたソフトウェアモジュールに多様化操作を適用して、前記複数のコンパイルされたソフトウェアモジュールの各々の区別可能なインスタンスの群から、前記複数のコンパイルされたソフトウェアモジュールの各々のインスタンスをランダムに選択し、前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスのランダムなレイアウトを決定することにより、実行可能プログラムイメージの区別可能なインスタンスが生成される。前記ランダムなレイアウトにしたがって、前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスを組み合わせ、実行可能プログラムイメージの区別可能なインスタンスを生成する。前記実行可能プログラムイメージの区別可能なインスタンス内のシンボルが解決される。
【0010】
前記ランダムに選択することは、インスタンスが作成された複数のモジュールを含む多様的に設定されたライブラリからランダムな選択をすることを含みうる。前記多様的に設定されたライブラリ内の、インスタンスが作成された各モジュールは、区別可能なセキュリティ特性でインスタンスが作成され、前記ランダムに選択することは、前記複数のコンパイルされたソフトウェアモジュール用のアセット評価とコールサイトのプロファイル重みとを、前記複数のコンパイルされたソフトウェアモジュール内に埋め込むことと、前記アセット評価と前記プロファイル重みとに基づいて前記ランダムな選択を制約することと、をさらに含みうる。
【0011】
前記ランダムなレイアウトを決定することは、前記コンパイルされたソフトウェアモジュールの選択されたインスタンスを、別々のコード部分に分割し、メモリイメージ内の前記コード部分の位置をランダム化することを含みうる。前記コード部分の位置をランダム化することは、前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスのうちの、異なるいくつかからのコード部分を、データ部分と混合することを含みうる。
【0012】
前記多様化操作を適用することは、セキュリティ変換定数の遅延結合をさらに含んでもよく、前記ランダムシードを前記疑似乱数生成器への入力として適用して、前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスに適用されたセキュリティ変換に関するメタデータにしたがって、前記セキュリティ変換定数をランダムに決定することによって、前記遅延結合を行う。前記セキュリティ変換は、プログラム変換、特にデータフロー変換または制御フロー変換から選択できる。
【0013】
さらなる態様において、実行可能プログラムイメージの複数の多様なインスタンスを生成する方法が提供される。前記実行可能プログラムイメージまたは前記動的ライブラリの所望のインスタンスの各々について、疑似乱数生成器への入力としてランダムシードが特定され、ランダムな選択肢が生成される。前記ランダムな選択肢により決定された多様化操作が、複数のコンパイルされたソフトウェアモジュールに適用することによって、かつ、前記複数のコンパイルされたソフトウェアモジュールに関連付けられたシンボルを解決することによって、前記複数のコンパイルされたソフトウェアモジュールが変換される。前記解決されたシンボルによって決定された区別可能な構成を有する、前記実行可能プログラムイメージのインスタンスが生成される。前記複数のコンパイルされたソフトウェアモジュールを変換する工程は、前記シンボルを解決して、前記複数のソフトウェアモジュールのランダム化されたメモリイメージレイアウトを提供することを含む。
【0014】
さらに別の態様において、ビルドタイム時にカプセル化された実行可能モジュールの複数の多様な、区別可能なインスタンスを提供するリンカーまたはローダーが提供される。前記ローダーまたはリンカーは、プロセッサに、各実行可能モジュールの多様な区別可能なインスタンスの各々について区別可能なランダムな選択肢をランタイム時に生成させるよう構成された、疑似乱数生成器と、前記プロセッサに複数のコンパイルされたソフトウェアモジュールを変換させるランタイムモジュールとを含む。前記変換は、前記ランダムな選択肢により決定された多様化操作を複数のコンパイルされたソフトウェアモジュールに適用することによってそれらを変換し、前記複数のコンパイルされたソフトウェアモジュールに関連付けられたシンボルを解決し、前記プログラムの各起動時に、前記解決されたシンボルによって決定された区別可能な構成を有する、実行可能プログラムイメージのインスタンスを生成することによって、達成される。
【0015】
別の態様において、実行可能プログラムイメージの複数の多様なインスタンスを生成するローダーが提供される。前記ローダーは、プロセッサに、前記実行可能プログラムイメージの所望のインスタンスの各々について区別可能なランダムな選択肢を生成させるよう構成された、疑似乱数生成器と、前記プロセッサに前記実行可能プログラムイメージの区別可能なインスタンスを生成させるランタイムモジュールとを含む。前記区別可能なインスタンスは、以下の工程によって行われる:前記ランダムな選択肢を適用することによって複数のコンパイルされたソフトウェアモジュールに多様化操作を適用して、前記複数のコンパイルされたソフトウェアモジュールの各々の区別可能なインスタンスの群から、前記複数のコンパイルされたソフトウェアモジュールの各々のインスタンスを選択し、前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスのランダムなレイアウトを決定し;前記ランダムなレイアウトに準じて前記コンパイルされたソフトウェアモジュールの前記選択されたインスタンスを組み合わせて、実行可能プログラムイメージの区別可能なインスタンスを生成し;前記実行可能プログラムイメージの区別可能なインスタンス内のシンボルを解決する。前記ランダムなレイアウトは、ランタイムローディング時のランダムなアドレス割り当てを含みうる。前記複数のコンパイルされたソフトウェアモジュールの各々のインスタンスの選択は、不正な違反の検出など、ランタイム条件に基づいてもよい。
【0016】
本発明のさらなる様態と特徴は、当業者には、添付の図面とともに本発明の具体的な実施形態についての下記の記載を参照すれば明白になるであろう。
【図面の簡単な説明】
【0017】
本発明の実施形態を、あくまでも例として、添付の図面を参照して説明する。
【
図1】
図1は、多様性によって保護したプロダクトバイナリのビルドタイムリンキングを示す。
【
図2】
図2は、セキュリティ/性能ターゲットのミックスマッチ選択を最適化するためのフローチャートである。
【
図4】
図4は、ランタイムローディングでの多様なモジュールの選択を示す。
【
図5】
図5は、ランタイムローディングでのランダムなアドレス割り当てを示す。
【
図6】
図6は、代替の多様なモジュールを備えた動的ライブラリの構築を示す。
【発明を実施するための形態】
【0018】
本開示は、リンクタイムまたはロードタイムまでにソフトウェアモジュールのセキュリティ変換を延期できる方法であって、従来のソースからソースへのセキュリティ変換と比べて優れた点をいくつも提供する方法について記載する。これら延期されたセキュリティ変換は適用されても非常に軽く、得られる実行可能プログラムに多様性を与える機会を多く作り、セキュリティを改善すると同時に、実行性能と正確さに対する影響を最小限にし、デバッギングの複雑性を減少させる。
【0019】
ソフトウェアリンカーとリンカー技術とは、長年存在し、従来コンパイルされていたソフトウェアモジュールの集合体を単一の実行可能バイナリまたは動的ライブラリにまとめることを可能にしている。リンカーのもともとのジョブは、コンパイルされたソフトウェアモジュールを、単一のメモリイメージにまとめ、各モジュールがメモリ中のどこに存在すべきか決定し、前記選択されたメモリレイアウトの場合にモジュール間のアドレス参照(サブルーチンコールなど)が正しくあるようにそれらを「手配する(fixing up)」すなわち移転させる(たとえばJ. Levine, Linkers and Loaders(リンカーとローダー), Morgan Kaufmann Publishers, 2000参照)。リンカー技術は何年にもわたって、その主要な改良が、性能の向上、様々なプロセッサやオペレーティングシステムをターゲット化する能力の提供、および高度なプログラミング言語の支援に限定されてきた。
【0020】
従来のソフトウェアリンカーは、ネイティブオブジェクトコードをたいていの場合イミュータブルなものとして扱い、入力ソフトウェアモジュール(オブジェクトコード形式)を組み合わせて単一のバイナリライブラリまたは動的ライブラリにするために必要な絶対最小限に、変更を制限する。リンカーまたはリンクエディターは、コンパイラによって生成される一つ以上のオブジェクトを使用して、それらを単一の実行可能プログラムに組み合わせるプログラムである。コンピュータプログラムは、通常、数個のパーツまたはモジュールを含む。それらすべてのパーツ/モジュールが、単一のオブジェクトファイル内に含まれなくてもよく、かかる場合、シンボルによって互いに参照しあう。通常、オブジェクトファイルは以下の3種類のシンボルを含むことができる:定義済みシンボル、オブジェクトファイルが他のモジュールからコールされるようにするもの;未定義シンボル、これらシンボルが定義される前記その他のモジュールをコールするもの;および局所シンボル、前記オブジェクトファイル中で使用され再配置を容易にするもの。プログラムが多数のオブジェクトファイルを含んでいる場合、リンカーは、シンボルを解決しながら、これらファイルを組み合わせて統合された実行可能プログラムにする。
【0021】
リンカーは、ライブラリと称されるオブジェクトまたはサブルーチンの集合から、オブジェクトを取り出すことができる。リンカーには、その出力に全ライブラリを含めないものもあり、他のオブジェクトファイルやライブラリから参照されたシンボルのみを含む。前記リンカーは、プログラムのアドレス空間中にオブジェクトを配置するという処理も行う。これには、別のベースに対する特定のベースアドレスをとるコードを再配置することが含まれてもよい。コンパイラはオブジェクトが置かれる位置を知っていることがほとんどないので、固定ベース位置(たとえば、ゼロ)をとることが多い。マシンコードを再配置することには、たとえば、絶対ジャンプ、ロード、ストアの再ターゲット化などが含まれる。リンカーの実行可能出力は、実行直前に、それが最終的にメモリにロードされる時に、別の再配置パスを必要としてもよい。
【0022】
動的リンキングには、コンパイルタイム時にライブラリのサブルーチンをリンキングするのではなく、ランタイム時にアプリケーションプログラムにロードすることが含まれる。前記サブルーチンはディスク上で個別のファイルのままである。コンパイルタイム時には、リンカーによって最小限の量の作業が行われる。プログラムが必要とするライブラリルーチンと、ライブラリ中の前記ルーチンのインデックス名または番号のみを記録する。前記リンキング作業の大半は、アプリケーションがロードされる時間(ロードタイム)または実行中(ランタイム)に行われる。ローダーと称される、前記必要なリンキング機能性は、実質的には、基礎となるオペレーティングシステムの一部である。適切な時に、前記ローダーはディスク上の関連するライブラリを見つけ、前記ライブラリからの関連するデータを前記プロセスのメモリスペースに追加する。
【0023】
リンカーは通常、ビルドプロセスの最終ステップなので、シンボル解決、レイアウト決定、およびアドレスバインディングという従来のジョブを超える機会がある。前記リンクステップは、多様なインプリメンテーションを多数組み合わせる手段として使用されてクラスアタックの一群に対抗し、従来のリンカー技術を再検討するための基礎を提供する。リンクタイム時に多様性を導入することには、軽量化の利点がある。高価なコンパイルステップを再び実行させる必要が無く、莫大な多様なインスタンスを正しく生成することを実用化する。各インスタンスは、予測可能な性能を有する。コードはたいてい固定化されている(すでにコンパイルされている)ので、この種の多様性は実行性能に大幅な変動をもたらすことはあまりない。これはまたテストの試行を減少することになる。なぜなら、多様なインスタンスの一つのコードは、それ以外の多様なインスタンス全ての挙動を代表するからである。多様なインスタンスの一つを全面的にテストすることは、それ以外の多様なインスタンス全ての動作を代表するとみなすことができる。
【0024】
本開示は、いくつかの方法でバイナリ出力コードの内容を生成できる、ソフトウェアリンカーまたはソフトウェアローダーと、関連するリンキングおよびローディング法とを提供するが、これらすべては、その結果得られる実行可能/動的ライブラリの多様性によってセキュリティを提供する。オブジェクトコードに適用できる3つの具体的な多様化操作が記載される。前記多様化操作は、設計要件に応じたふさわしい方法で、個別に適用されても、組み合わせて適用されてもよい。拡張されたリンカーツーリングは、その動作の範囲を制御するオプションと、疑似乱数生成器(PRNG)への入力としてのシードとを受領し、これによって予測可能に多様なアウトプットイメージの生成が可能になる。全く同じ入力ソフトウェアモジュールと同じシードとでリンカーが2回起動されると、アウトプットイメージは同じになる。多様なアウトプットイメージを生成するためには、区別可能なシードが選択される。
【0025】
図1は、以下に詳細に記載する3つの多様化操作を実行するようにされる、セキュリティ駆動リンカー100を示す。3つの多様化操作とは、多様なインスタンスが作成されたライブラリおよびオブジェクトモジュール106に基づく、メモリ再配置102、選択的構築104、ならびに変換定数の遅延結合108であり、これらはすべて、PRNGに対するシード、任意のセキュリティターゲットおよび性能の制約などの入力110に従って決定される。前記多様化操作の結果は、改ざんに対して耐性のあるプロダクトバイナリ若しくはアウトプットイメージのセキュリティ改善インスタンス112、または、前記入力110を変更することによって決定されたアウトプットイメージの、多数の様々なインスタンス112である。前記アウトプットイメージ112は内容に応じて、実行可能プログラムイメージ、メモリイメージ、実行可能モジュール、または動的ライブラリと記載される。
【0026】
メモリイメージ再配置
従来のリンカーは、コマンドライン上でのその順序付けに基づいて、かつその相互依存性(どのモジュールが他のどのモジュールを参照するか)に基づいて、出力メモリイメージにその入力ソフトウェアモジュールを予測可能に配置する。さらに、通常、たとえば一つのメモリセグメント中に定数ストリングデータのすべてを置くなど、メモリセグメントの同じような種類のものがグループ化されるようにする。これがなされるのは、簡便性(簡易な再配置アルゴリズム)、デバッギングの容易さなどのため、かつ、キャッシュの局所性の結果得られた実行可能イメージのランタイム性を最大にするためである。
【0027】
図1を参照すると、本発明の第一の多様化操作には、メモリイメージ再配置102が関与する。リンカーの結果は、0x...A, 0x...Fなどのランダム化された基底アドレス割り当て、および、再配置可能なコードの各セグメントまたはセクションのランダム化されたレイアウトであり得るが、これは従来のリンカーによって作成された決定論的結論とは対照的である。この試みは、セクションの予測可能な配置に基づく攻撃への重要な障壁となり得る。リンカー100は、要求に応じて、かつ、PRNG用のシードなどの入力110に基づき、確実に、各アウトプットイメージ112が完全に新しいメモリイメージレイアウトを有する(すなわち、再配置可能なコードの各セグメントまたはセクションが、ランダムシードパラメータによってランダムに決定されている)ようにすることができ、さらに、メモリイメージ全体で、様々なタイプのメモリセグメントを混合する(intermix, or intermingle)ことができる。これによって、ソフトウェアモジュールの個々の機能のコードを決定論的に再配置することができるというだけの、リンカーの従来の再配置機能が、コードおよびデータを自由に混合するという能力をリンカー100に与えることにより拡張される。データおよびコードを混合するということは、IDA Pro(登録商標)などのバイナリイメージ逆アセンブラ/分析機の正確な操作に対する障害として作用する。
【0028】
理想的には、前記実行可能アウトプットイメージ112の正確な機能的挙動がメモリレイアウトの多様なインスタンスの全てに対して同じであるべきである。基本的な実行性能はキャッシュ局所性という問題に影響されるが、メモリレイアウトアルゴリズムの適切な選択により、性能の変動は最小限に低減できる。その結果、メモリイメージ再配置を使用した際に、前記拡張されたリンカーによって作成された全ての多様なインスタンスにわたって、性能および正確性が維持されよう。
【0029】
選択的構築
従来のリンカーを使用すると、外から見えるエンティティ(機能やグローバル変数など)の各々は、入力ソフトウェアモジュールの一群の中に一度だけ提供されなければならない。さもなくば、前記エンティティは「多重定義されている」とみなされ、エラーが発行される。当該リンカー100において、第二の多様化操作には、「ミックスアンドマッチ」リンキング、すなわち、各ライブラリ106内の多様なインスタンスが作成されたオブジェクトモジュールに基づく選択的構築104が関与する。
【0030】
ライブラリ106は、複数のインプリメンテーションモジュールで作成できる。たとえば、プログラムモジュールの多数のバージョン、すなわちインスタンス(Mod A1, Mod A2, …; Mod B1, Mod B2, …; Obj1, Obj2, …)が作成できる。所与のプログラムモジュールの各インスタンスは、同じ機能的挙動を行う。前記多数の多様なインスタンス(Mod A1, Mod A2, … Mod B1, Mod B2,…; Obj1, Obj2, …)は、大容量ライブラリ中に分かれて設けることができる。全インスタンスは同じ機能性を呈するので、当該リンカー100は、最終実行ファイル用の特定のインスタンスをランダムに選択することができる。この試みは、比較により情報を得ようとする差分攻撃を阻むことができる。前記リンカー100は、外から見える所与のエンティティ(通常は、機能)の多数の多様なインスタンスの一群のうちの一つが、同じくシードによって決定されるランダム選択に基づいて選択されるモードを支援することができる。もし多くの多様なインスタンス(セキュリティ変換の独自の一群をそれぞれ備えている)において多くの機能があるなら、考えられうる多様なアウトプットイメージの数は、かかる機能とインスタンスの数の積である。これは、多数の多様なインスタンスを作成するための驚異的な範囲を提供し、さらに、各インスタンスには個々の機能の非常に様々なインプリメンテーションが関与し得るので、一つのインスタンスを逆行分析することから得られる知識を他のインスタンスに適用する能力が最小化される。
【0031】
前記多数のインスタンスは、差分解析を阻むための多様なインプリメンテーションを有することができるだけではない。様々な性能および/またはセキュリティ特性を有するように作成することもできる(入力110参照)。たとえば、前記リンカー100は、暗号学的ハッシュを行う機能のためには、タイムクリティカルでない領域またはプロセス中で、高度に保護されてはいるけれども遅いインプリメンテーションを使用することを選択できる。タイムクリティカルな領域またはプロセスでは、前記リンカーは、高度な性能のインプリメンテーションのためにセキュリティの面をトレードオフすることも選択できる。セキュリティと性能のターゲットを正しく入力すると、設計検討によって判断されたように、インプリメンテーションとアルゴリズム解析情報の適切な特性評価とを組み合わせられ、前記リンカー100は機能的インプリメンテーションのミックスマッチによって制約の釣り合いをとる機会を得る。
【0032】
図2は、セキュリティ対性能の釣り合いをとるための最適化方法を示す。前記方法は、次のように進められる。ステップ200で、ユーザーがアプリケーション内の高価値アセットについての情報を提供する。これは、クリティカルなアセット対あまりクリティカルでないアセットの評価(すなわち、アセット評価)を追加することを含む。これらクリティカルなアセットの例としては、システムにおける暗号化キー、ノードロック計算、および権利管理ロジックなどがある。ステップ202で、プロファイリングに基づいてコールサイトに重み付けが割り当てられる。動的または静的ソースレベルプロファイリングが、機能および基礎ブロックレベルでアプリケーションのために作成される。動的プロファイリングが好ましい。しかしそれが無ければ、ソースレベルのアナライザ(たとえば、コンパイラやプリコンパイラ)によって、コールグラフを通じてループ頻度についての推測を伝えることで、静的プロファイリングが作成できる。アプリケーションに見られる機能コールサイトそれぞれに、プロファイル重みが関連付けられてもよい。ステップ204で、前記アセット評価とプロファイル重みとが適切なオブジェクトとライブラリモジュールとに埋め込まれる。たとえば、作成されてアセット評価とプロファイル重みとに含められた情報は、コンパイルとライブラリ作成との段階を通して保持され、ライブラリ中のモジュールに関連付けられた追加情報として埋め込まれる。ステップ206で、リンカー100はモジュールを選択するために埋め込まれた情報を使用し、制約ベースの解法アルゴリズムを利用して前記セキュリティ/性能ターゲット用に最適化する。制約解決へのアプローチは公知のものが多数ある。
【0033】
変換定数の遅延結合
従来のソフトウェアリンカーは、入力ネイティブオブジェクトコード中の、そのリンカーの最終メモリイメージレイアウト決定に基づいて「固定(fixed up)」(または再配置)されなければならない位置を特定する。それらは通常、他のソフトウェアモジュールに見られる、外から見えるシンボルへのリファレンスである。かかる再配置は通常、ネイティブオブジェクトコードの、リンキングプロセスによって実際に変更される唯一の部分である。コードおよびデータについてのセキュリティ変換には、よく固有の定数が使用される。たとえば、データ変換には、データ操作および位置の両方を数学的空間へ変換する、数学的マッピング機能を使用するが、これは2003年7月15日発行の米国特許第6594761号、および2005年1月11日発行の米国特許第6842862号に記載されており、この参照によりその内容すべてをここに包含する。これを行うためには、マッピングツール(すなわち「トランスコーダ」)が、各マッピングについて機能ファミリーの一群と多数の固有の定数を使用する。同様に、制御フロー変換(2004年8月17日発行の米国特許第6779114号(この参照により全体をここに包含する)に記載されたような)が、フローを制御する多数の機能を使用して、所与のプログラムを新たな制御フロー形式にマップする。これら機能はまた、選択された定数の一群を伴う。
【0034】
これらの場合のそれぞれにおいて、前記定数はランダムに(かつ互いに一貫して)選択される。定数の一群は、プログラムインスタンスの特徴的な因子となり、前記プログラムが正しく機能するために必要である。これら定数の正確な値は、変換関数の特性に基づき、マッピングツール(すなわちトランスコーダ)によって選択される。さらに、互いに一貫するよう選択された、アプリケーション全体に見られる多数の相互に関連したセキュリティ変換定数があってもよく、一つの定数を変更するには、何らかの一貫した方法で多数のその他の定数を変更することが必要になってもよい。
【0035】
オブジェクトコードに適用できるさらなる多様化操作として、プログラム変換に使用される定数の遅延結合、特にデータおよび制御フローの変換を行うことが可能である。前記定数の一群が、第2の定数の群(ランダムに選択された)と置き換えられてもよいが、この第2の定数の群は一貫して機能しなければならない一方で前記プログラムインスタンスの第二の特徴的な因子を示す。これら定数は、再配置アドレスに対して同様に処理されることができ、リンクタイムに選択でき、実行タイムでの変換の多様化をもたらす。かかる変更は、さらに差分攻撃に対する防御となり、また、組織化されたアップデートによって更新できるようにもする。
【0036】
前記リンカーは、従来のリンカーの再配置機能と同様に、データおよび制御フローの変換などのプログラム変換用の固有の定数の群を変更する。これら群は、シードによって初期化されるPRNG(疑似乱数生成器)によって生成される。各群の定数は、非常に様々な値であり、得られる実行可能または動的ライブラリの多様性が非常に大きくなる。
図3を参照すると、リンクタイムに定数を選択する方法が示されている。リンカー300は、複数のソフトウェアモジュール(モジュールA1,モジュールA2…)を提供するライブラリAとやりとりする。各ソフトウェアモジュールは、セキュリティ変換の特性に関する定数セクション302およびメタデータ304を含む。前記リンカー300はまず、モジュールを選択し(ステップ310)、その後、選択されたモジュールと関連付けられたメタデータ304を読み込む(ステップ312)。メタデータに基づいて、リンカー300が新たな定数を選択し(ステップ314)、前記定数セクションを、プロダクトバイナリ322内の新たな定数の群320と置き換える。
【0037】
定数の各群はアプリケーションの正常な挙動に影響を与えないので(前記群がメタデータ内に与えられた数学的制約を満たすと仮定する)、かかる多様なインスタンスの性能/正確さの検証は容易である。定数の一貫した群は、定数の別の群と同じ挙動をすると予想される。リンクタイム多様性のこの形式は、ユーザーにとっての最小のオーバーヘッドと差分攻撃に対抗する最大のセキュリティとの間の、良好なトレードオフを示す。それはまた、実施されているアプリケーションに更新性を提供するためには理想的であり、そこでは、アプリケーションバイナリが新たな固有の定数群で周期的に更新され、これは、いかなるアタッカーにとっても固定されたバイナリイメージを解析する余裕がない、ということを意味する。
【0038】
ランタイムローディング
ローダーは、ランタイム時に起動されるリンカーとも考えられる。ビルドタイム、またはロードタイムのリンキング特性機能について記述した上記技術すべては、ランタイム時に起動されるとも考えられる。ランタイム時のかかる特性機能を行うことの利点は、他の安全な防御技術を挿入できることと、フィールドでの条件に対応できることである。ローダーは
図4、5に示されている。
図4は、プロダクトバイナリへロードされるモジュールの多様なインスタンスからの選択を示し、
図5は、ランタイムローディング時のランダムなアドレス割り当てを示す。
【0039】
図4の実施形態において、ソフトウェアモジュールの多数の多様なインスタンス(Mod A1, Mod A2, Mod A3, Mod A4 …, Mod B1, Mod B2, Mod B3, Mod B4 …)を、動的ライブラリAおよび動的ライブラリBなどの動的ライブラリに分けて設定できる。前記インスタンスは、個別のインプリメンテーション因子または基準によってさらに特徴づけることができる。たとえば、あるインスタンスは、「Strong Protection(強力な保護)」のモジュールMod A1およびMod A2のように、高セキュリティレベルを特徴としてもよい、または、「Fast(高速)」なモジュールMod A3、Mod A4のように、その実行速度を特徴としてもよい。
【0040】
ランタイム時の多様性を提供するためには、ローダー400は、ランタイムエントロピーソース402と疑似乱数生成器(PRNG)とを必要とし、これが疑似乱数の決定を行うために多様モジュールセレクタ404を制御し、ランタイムローダーの挙動、すなわち出力実行ファイル406が、各起動ごとに異なるようにする。ランタイムローダー400は、ランタイム条件に基づき、動的ライブラリ中に見られる様々なインプリメンテーションからの選択を行う。たとえば、違反管理モジュールが、攻撃の発生を発見すると(たとえば、プロセスがエミュレートされた、デバッグされた、など)、最高セキュリティレベルのインプリメンテーションと現在のプロテクション能力とをロードするようローダーに伝達できる(すなわち、モジュールMod A1およびMod A2や、Mod B1およびMod B2からのランダム化された選択)。他の条件に基づけば、他の決定がなされる。たとえば、アプリケーションが繰り返し起動されると、ローダーは、そのクリティカルな実行ポイントへは決して到達せずに、通常よりも細かい粒度にランダムなインプリメンテーションをロードすることを選択してもよい。これによって、差分攻撃を妨げ、反復性と予測可能性に依拠している敵対者は阻止されるだろう。
【0041】
図5に示された実施形態においても、ソフトウェアモジュールの多数の多様なインスタンス(Mod A1, Mod A2, Mod A3, Mod A4 …, Mod B1, Mod B2, Mod B3, Mod B4 …、およびMod C1, Mod C2, Mod C3, Mod C4 …)を、動的ライブラリA、動的ライブラリB、動的ライブラリCなどの動的ライブラリに分けて設定でき、ランタイムローダー500もランタイムエントロピーソース502と疑似乱数生成器(PRNG)とを含み、これが疑似乱数の決定を行うために多様モジュールセレクタ504を制御する。本実施形態においては、前記多様セレクタモジュール504はメモリイメージ再配置と選択的構築に関して上記のように機能するようインプリメントされる。モジュールの特定の多様なインスタンスが選択され、選択された各モジュールにはランタイム時にロードされる時にランダムアドレスを割り当てることができる。前記実行ファイル506は、その機能性の大半が動的ライブラリモジュールで成立するように構成できる。モジュールが様々な実行時にロードされるので、モジュールが多様な選択肢群から選択されることに加え、前記モジュールもまたメモリ中のランダムアドレスにロードされる。これは、デバッギングまたはエミュレーションのセッションをアタッカーが行うことを阻む大きな障害となる。プログラムが実行されるにつれ、予測不可能な種々のモジュールがロードされるだけでなく、前記モジュールの配置も予測不可能であり、繰り返されない。
【0042】
動的ライブラリの構築
動的ライブラリ(たとえば、Windows(登録商標)やLinux(登録商標)のdll、Macのdylibなど)は、通常ネイティブリンカーによって生成され、直接実行可能イメージと密接に比較される。従来、動的なエンティティにおけるシンボルの大半は、前記動的ライブラリが生成される時までに解決されている。動的ライブラリが生成されるときまでにプログラムの実行は準備される。他方で、動的ライブラリは、プログラムの実行前に、実行するプログラムにロードされている必要がある。ローダーが動的ライブラリの実行前にいくつかのシンボルを移動させる機会はこのときである。動的ライブラリにおける全ての未解決のシンボルは、プログラムの実行直前に解決される。前記動的ライブラリは、リンカーによって生成されているので、曖昧に定義されたシンボルを含みようがない。少数の再配置されたシンボルは別として、前記ライブラリはほぼ実行が可能な状態である。
【0043】
しかし、
図6に示されるように、多様性はまた、プロダクト動的ライブラリの構築においても導入できる。動的ライブラリの作成メカニズムは、AltMod A1, AltMod A2, AltMod B1, AltMod B2…といった多数の代替のモジュール(すなわち、機能とデータ)を提供する。各代替モジュールは、元のそれぞれのモジュールのインスタンス(Mod A1, Mod A2, …; Mod B1, Mod B2, …; Obj1, Obj2, … )と等価のオプションである。前記ライブラリの作成には、代替モジュールを前記プロダクト動的ライブラリ602にカプセル化するリンカー600が必要である。それはまた、代替モジュールを示すテーブルを備える。上記に詳述したように、その後ランタイム時に、適宜インプリメントされたローダーが前記テーブルに問い合わせることによって、代替の多様なモジュールからランダムな選択を行うことができる。
【0044】
上記の記載では、実施形態の全面的な理解を提供するために、説明を目的として数々の詳細が述べられた。しかし、これら特定の詳細は必須ではないことは、当業者に明らかであろう。理解を妨げないように、公知の電気構造や回路はブロック図で示されていることもある。たとえば、本明細書中で記載された実施形態がソフトウェアルーチンか、ハードウェア回路か、ファームウェアか、またはそれらの組み合わせかでインプリメントされるかどうかについては、具体的な詳細は述べられていない。
【0045】
本開示の実施形態は、機械が読み取り可能な媒体(コンピュータが読み取り可能媒体、プロセッサが読み取り可能な媒体、または、コンピュータが読み取り可能なプログラムコードを実施させるコンピュータ使用可能な媒体、とも呼ばれる)に記憶されたコンピュータプログラム製品としてあらわされることができる。前記機械が読み取り可能な媒体は、ディスケット、読み取り専用のコンパクトディスクメモリ(CD−ROM)、記憶装置(揮発性または不揮発性)、または同様の記憶機構などの、磁気的、光学的、又は電気的な記憶媒体を含む、なんらかの適切な、非一時的な有形の媒体である。前記機械が読み取り可能な媒体は、インストラクション、コードシーケンス、コンフィグレーション情報や、その他のデータを含むことができ、これらは実行されたときに、プロセッサに本開示の実施形態に準じた方法のステップを行わせる。前述されたインプリメンテーションをインプリメントするために必要なその他のインストラクションやオペレーションの、前記機械が読み取り可能な媒体への記憶が可能であることも、当業者であれば理解できるであろう。前記機械が読み取り可能な媒体に記憶されたインストラクションは、プロセッサやその他の適切な処理装置によって実行可能であり、上述されたタスクを行うための回路構成とのインターフェースともなり得る。
【0046】
本発明の前記の実施形態は、単なる例示である。当業者によって、添付のクレームによってのみ定義される本発明の範囲を逸脱することなく、前記特定の実施形態に変更、変形、変種がもたらされるであろう。