IP Force 特許公報掲載プロジェクト 2022.1.31 β版

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

▶ スターナム リミテッドの特許一覧

<>
  • 特許-動的メモリ保護 図1
  • 特許-動的メモリ保護 図2
  • 特許-動的メモリ保護 図3
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-02-07
(45)【発行日】2024-02-16
(54)【発明の名称】動的メモリ保護
(51)【国際特許分類】
   G06F 21/52 20130101AFI20240208BHJP
【FI】
G06F21/52
【請求項の数】 13
(21)【出願番号】P 2020558916
(86)(22)【出願日】2019-10-02
(65)【公表番号】
(43)【公表日】2022-01-31
(86)【国際出願番号】 IL2019051076
(87)【国際公開番号】W WO2020089885
(87)【国際公開日】2020-05-07
【審査請求日】2022-09-29
(31)【優先権主張番号】62/751,774
(32)【優先日】2018-10-29
(33)【優先権主張国・地域又は機関】US
(73)【特許権者】
【識別番号】520407231
【氏名又は名称】スターナム リミテッド
【氏名又は名称原語表記】STERNUM LTD.
【住所又は居所原語表記】Yigal Alon St 94, Tower 2 Floor 9, Tel Aviv-Yafo, Israel
(74)【代理人】
【識別番号】110002952
【氏名又は名称】弁理士法人鷲田国際特許事務所
(72)【発明者】
【氏名】ツォウヴァ ナタリ
(72)【発明者】
【氏名】グラノット リアン
【審査官】平井 誠
(56)【参考文献】
【文献】米国特許出願公開第2016/0026791(US,A1)
【文献】米国特許第06832302(US,B1)
【文献】特開2001-216161(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 21/00-88
G06F 12/14
(57)【特許請求の範囲】
【請求項1】
動的メモリ保護を適用するためにコードファイルを調整するコンピュータ実施方法であって、
複数のルーチンを含む少なくとも1つのコードファイルを受信することであって、前記少なくとも1つのコードファイルは、メモリブロックのランタイム動的割り当てをサポートする動的メモリ領域を使用して、少なくとも1つのプロセッサにより実行するために作成された、少なくとも1つのコードファイルを受信することと、
前記複数のルーチンの少なくとも1つのエクスプロイトに脆弱なルーチンを識別するために前記少なくとも1つのコードファイルを分析することと、
前記少なくとも1つの脆弱なルーチンの実行が完了すると、前記動的メモリ領域に割り当てられた複数のブロックの直近に割り当てられたブロックの少なくとも1つのサブセットのメモリ空間から、前記複数のブロックの隣接する1つのメモリ空間まで、を超過する書き込み動作を、直近に割り当てられたブロックの前記サブセットの前記直近に割り当てられたブロックのそれぞれの少なくとも1つの境界にある前記動的メモリ領域に挿入された複数のマーカの少なくとも1つを使用して、検出するように構成されたメモリ整合性コードセグメントを追加することと、
前記少なくとも1つの調整されたコードファイルを出力することと、
により前記少なくとも1つのコードファイルを調整することと、を含み、
ランタイムに前記超過書き込み動作が検出された場合、メモリ整合性コードセグメントは、前記少なくとも1つのプロセッサに少なくとも1つの事前定義された動作を開始させる、
コンピュータ実施方法。
【請求項2】
前記少なくとも1つのコードファイルは、
コンパイラによるコンパイル前に調整されたソースコードファイルであり、前記少なくとも1つのプロセッサによって実行される少なくとも1つのそれぞれの実行可能コードファイルの生成に使用される少なくとも1つのそれぞれの中間コードファイルを作成するように適合される、ソースコードファイルと、
前記少なくとも1つのプロセッサによって実行される少なくとも1つのそれぞれの実行可能コードファイルが生成される前にコンパイラによって生成された中間コードファイルであり、前記少なくとも1つの中間コードファイルは、オブジェクトファイルおよびアーカイブファイルからなるグループの1つである、中間コードファイルと、
前記少なくとも1つのプロセッサによる実行のために生成されたマシンコードを含む実行可能ファイルと、からなるグループの1つであり、
前記少なくとも1つのコードファイルが中間コードファイルである場合、前記メモリ整合性コードセグメントは、前記少なくとも1つのエクスプロイトに脆弱なルーチンの代わりに呼び出され、前記少なくとも1つのエクスプロイトに脆弱なルーチンの実行が完了した後に、前記少なくとも1つのエクスプロイトに脆弱なルーチンを最初に呼び出し、その後に前記メモリ整合性コードセグメントの呼び出しが続くように構成されるトランポリン分岐関数を追加することによって追加され、
前記少なくとも1つのコードファイルが中間コードファイルである場合、前記メモリ整合性コードセグメントは、前記少なくとも1つのエクスプロイトに脆弱なルーチンの実行が完了した直後に、前記メモリ整合性コードセグメントを呼び出すために、前記少なくとも1つのエクスプロイトに脆弱なルーチンの最後に分岐命令を追加することによって、追加され、
前記少なくとも1つのコードファイルが実行可能コードファイルである場合、前記メモリ整合性コードセグメントは、前記少なくとも1つのエクスプロイトに脆弱なルーチンのための置換ルーチンを含むように構成された少なくとも1つの動的に事前ロードされたライブラリを作成することによって追加され、前記置換ルーチンは、前記少なくとも1つのエクスプロイトに脆弱なルーチンの実行が完了した後に、前記少なくとも1つのエクスプロイトに脆弱なルーチンを最初に呼び出し、その後に前記メモリ整合性コードセグメントの呼び出しが続くように構成される、請求項1に記載の方法。
【請求項3】
前記複数のルーチンのそれぞれは、ルーチン、サブルーチン、および関数からなるグループの1つである、請求項1または2に記載の方法。
【請求項4】
前記メモリ整合性コードセグメントは、前記少なくとも1つのプロセッサによって実行されるオペレーティングシステムに固有の少なくとも1つのメモリ管理ルーチンに追加される、請求項1から3のいずれか1項に記載の方法。
【請求項5】
前記メモリ整合性コードセグメントは、前記少なくとも1つのエクスプロイトに脆弱なルーチンの呼び出しの前に、前記少なくとも1つのエクスプロイトに脆弱なルーチンによる差し迫った書き込み動作を検出するために呼び出すようにさらに構成され、前記エクスプロイトに脆弱なルーチンは直近に割り当てられたブロックのサブセットのうちの少なくとも1つの直近に割り当てられたブロックのメモリ空間から潜在的に超過し、前記メモリ整合性コードセグメントは、前記少なくとも1つのエクスプロイトに脆弱なルーチンに転送されたアドレス範囲を分析して、前記転送されたアドレス範囲が前記少なくとも1つの境界を超えるかどうかを判定する処理を行うことによって、超過書き込み動作を検出する、請求項1から4のいずれか1項に記載の方法。
【請求項6】
前記メモリ整合性コードセグメントは、
少なくとも1つの最近の割り当てリストを横断することによって、直近に割り当てられたブロックのサブセットの1つを識別することであって、前記直近に割り当てられたブロックの各々は、前記少なくとも1つの最近の割り当てリスト内で、それぞれの直近の割り当てブロックへのポインタと、複数のマーカのそれぞれの1つと、それぞれの直近の割り当てブロックのサイズとを関連づけ、前記少なくとも1つの最近の割り当てリストに列挙された直近に割り当てられたブロックの最大数は事前に定義される、識別することと、
前記直近に割り当てられたブロックの前記少なくとも1つの境界において前記動的メモリ領域に挿入された前記少なくとも1つのマーカの値が、前記少なくとも1つの最近の割り当てリスト内で前記直近に割り当てられたブロックに関連付けられた前記少なくとも1つのマーカの値と一致しないことを検出することによって、前記超過書き込み動作を検出することと、を行うように構成され、
前記少なくとも1つの最近の割り当てリストは、前記動的メモリ領域内のブロックを割り当て、前記動的メモリ領域内のブロックを解放することからなるグループの1つである少なくとも1つのメモリ割り当て動作を実行するように構成された前記複数のルーチンのうちの少なくとも1つの調整されたメモリ管理ルーチンによって保持され、前記少なくとも1つの調整されたメモリ管理ルーチンは、前記少なくとも1つのコードファイルに追加された割り当て追跡コードセグメントを呼び出すように調整され、
前記割り当て追跡コードセグメントは、
新たに割り振られたブロックに対するエントリを追加するように前記少なくとも1つの最近の割り当てリストを更新することであって、前記追加されたエントリは、前記新たに割り当てられたブロックをそれぞれの一意のマーカと、前記新たに割り当てられたブロックへのポインタと、前記新たに割り当てられたブロックのサイズとに関連付ける、更新することと、
前記新たに割り当てられたブロックの少なくとも1つの境界に前記それぞれの一意のマーカを挿入することと、
により、前記新たに割り当てられたブロックの割り当て時に、新たに割り当てられたブロックを前記少なくとも1つの最近の割り当てリストに追加し、
除去された割り当てられたブロックの少なくとも1つの境界に挿入されたそれぞれの一意のマーカと、前記少なくとも1つの最近の割り当てリスト内の、除去された割り当てられたブロックに関連付けられた前記それぞれの一意のマーカとを比較することによって、前記除去された割り当てられたブロックのメモリ空間に超過書き込み動作が発生したかどうかを判定することによって、前記除去された割り当てられたブロックを検証することと、
前記除去された割り当てられたブロックをマッピングするエントリを前記少なくとも1つの最近の割り当てリストから除去することと、
により、割り当てられたブロックを前記少なくとも1つの最近の割り当てリストから除去する、ように構成された、請求項1から5のいずれか1項に記載の方法。
【請求項7】
前記割り当て追跡コードセグメントは、前記複数のマーカのうちの別の1つとして機能するように、前記新たに割り当てられたブロックの少なくとも1つの境界に、前記新たに割り当てられたブロックのサイズを挿入するようにさらに構成される、請求項6に記載の方法。
【請求項8】
前記それぞれの一意のマーカは、前記割り当て時に、前記割り当てられたブロックに対してランダムに選択される、請求項6に記載の方法。
【請求項9】
前記メモリ整合性コードセグメントは、前記少なくとも1つのエクスプロイトに脆弱なルーチンの実行が完了すると、前記複数のマーカのうちの少なくとも1つを使用して、前記複数のブロックのうちのエクスプロイトの影響を受けやすいブロックのサブセットのうちの1つのメモリ空間から前記複数のブロックのうちの隣接するブロックのメモリ空間への書き込み動作の超過を検出するようにさらに構成され、前記エクスプロイトの影響を受けやすいブロックのサブセットのそれぞれは、前記少なくとも1つのエクスプロイトに脆弱なルーチンによる使用のために、前記動的メモリ領域内に以前に割り当てられており、
前記エクスプロイトの影響を受けやすいブロックのサブセットは、影響を受けやすいブロックリストに列挙され、前記エクスプロイトの影響を受けやすいブロックのそれぞれは、前記影響を受けやすいブロックリストにおいて、それぞれのエクスプロイトの影響を受けやすいブロックへのポインタ、前記複数のマーカのそれぞれの1つ、およびそれぞれのエクスプロイトの影響を受けやすいブロックのサイズに関連付けられ、前記影響を受けやすいブロックリストに列挙されたエクスプロイトの影響を受けやすいブロックの最大数は事前定義される、請求項1から8のいずれか1項に記載の方法。
【請求項10】
少なくとも1つのクリティカルルーチンの呼び出しの前に、メモリ整合性コードセグメントの実行を呼び出すように少なくとも1つのコードファイルを調整することをさらに含む、請求項1から9のいずれか1項に記載の方法。
【請求項11】
前記少なくとも1つの事前定義された動作は、前記少なくとも1つのプロセッサの実行をクラッシュさせること、前記少なくとも1つのプロセッサの実行を停止させること、前記少なくとも1つのプロセッサを事前定義されたアドレスに分岐させること、前記少なくとも1つのプロセッサが少なくとも1つの潜在的に悪意のあるコード命令を実行することを妨げること、動的メモリオーバーランの指標を生成すること、からなるグループの1つである、請求項1から10のいずれか1項に記載の方法。
【請求項12】
動的メモリ保護を適用するためにコードファイルを調整するシステムであって、
コードを記憶するプログラムストアと、
前記記憶されたコードを実行するために前記プログラムストアに結合された少なくとも1つのプロセッサと、を備え、
前記コードは、
複数のルーチンを含む少なくとも1つのコードファイルを受信するためのコード命令であって、前記少なくとも1つのコードファイルは、メモリブロックのランタイム動的割り当てをサポートする動的メモリ領域を使用して少なくとも1つのプロセッサにより実行するために作成された、コード命令と、
前記複数のルーチンの少なくとも1つのエクスプロイトに脆弱なルーチンを識別するために前記少なくとも1つのコードファイルを分析することと、
前記少なくとも1つのエクスプロイトに脆弱なルーチンの実行が完了すると、前記動的メモリ領域に割り当てられた複数のブロックの直近に割り当てられたブロックの少なくとも1つのサブセットのメモリ空間から、前記複数のブロックの隣接する1つのメモリ空間まで、を超過する書き込み動作を、直近に割り当てられたブロックの前記サブセットの前記直近に割り当てられたブロックのそれぞれの少なくとも1つの境界にある前記動的メモリ領域に挿入された複数のマーカの少なくとも1つを使用して、検出するように構成されたメモリ整合性コードセグメントを追加することと、
により前記少なくとも1つのコードファイルを調整するためのコード命令と、
前記少なくとも1つの調整されたコードファイルを出力するためのコード命令と、を含み、
ランタイムに前記超過書き込み動作が検出された場合、メモリ整合性コードセグメントは、前記少なくとも1つのプロセッサに少なくとも1つの事前定義された動作を開始させる、
システム。
【請求項13】
非一時的コンピュータ可読記憶媒体であって、
複数のプログラム命令であって、それぞれが、ランタイム動的割り当てをサポートする動的メモリ領域を使用して、少なくとも1つのプロセッサによる実行のための少なくとも1つの調整されたコードファイルから生成された実行可能ファイルの複数のルーチンの各ルーチンであり、前記少なくとも1つの調整されたコードファイルは、前記複数のルーチンの少なくとも1つのエクスプロイトに脆弱なルーチンの実行完了時に、前記動的メモリ領域に割り当てられた複数のブロックのうちの直近に割り当てられたブロックの少なくとも1つのサブセットのメモリ空間から、隣接する複数のブロックのメモリ空間まで、を超過する書き込み動作を、直近に割り当てられたブロックの前記サブセットの前記直近に割り当てられたブロックのそれぞれの少なくとも1つの境界にある前記動的メモリ領域に挿入された複数のマーカのうちの少なくとも1つを使用して、検出するように構成されたメモリ整合性コードセグメントを追加することによって、動的メモリ保護をサポートするように調整される、複数のプログラム命令を含み、
ランタイムに前記超過書き込み動作が検出された場合、メモリ整合性コードセグメントは、前記少なくとも1つのプロセッサに少なくとも1つの事前定義された動作を開始させ、
前記複数のプログラム命令は、前記非一時的コンピュータ可読記憶媒体から前記少なくとも1つのプロセッサによって実行される、
非一時的コンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【0001】
関連出願
本出願は2018年10月29日に出願された米国仮特許出願第62/751,774号からの優先権の利益を主張し、その内容は、その全体が参照により本明細書に組み込まれる。
【背景技術】
【0002】
本発明は、そのいくつかの実施形態では動的メモリ保護を適用することに関し、より具体的には、しかし排他的ではなく、ポストコーディングフェーズで動的メモリ保護を適用することに関する。
【0003】
コンピュータ化された近代的環境が絶えず進歩し、発展している中で、サイバー脅威が大きな関心事となっている。悪意のある人々は、あらゆる方法の金銭的利益のための利己的利用を通した無害なハッキングから重要なシステムにおけるエクスプロイトまでの範囲にわたる複数の目標および/または目的のために、複数のプラットフォーム、アプリケーション、および/またはサービスに対する制御を獲得しようとして、複数のプラットフォーム、アプリケーション、および/またはサービスに対するサイバー攻撃を開始することがある。
【0004】
これらの懸念は、膨大な数の装置、典型的には、複数の分野、エリアおよび市場、例えば、自律車両、スマートシティ、農業、医療および医療処置などにおける自動化をサポートするために使用される小型のローエンド埋め込み装置の急速な配備によって劇的に深刻化する可能性がある。そのようなローエンド埋め込み装置は、典型的には、そのようなサイバー脅威に対処するために高度な軽減措置を適用するには不十分であり得る限られたリソースを有することがある。
【0005】
しかしながら、これらの限られたリソース埋め込み装置は、重要なアプリケーション、サービスおよび/または同様のものに関与し、任意選択的に、より高いレベルのプラットフォームおよびシステムへのアクセスポイントとして働くことができる。従って、埋め込まれた装置は、悪意のある人々によってエクスプロイトされる可能性がある重大なセキュリティ侵害を引き起こす可能性がある。
【発明の概要】
【0006】
本発明の第1の態様によれば、動的メモリ保護を適用するために調整されたコードファイルを生成するコンピュータ実施方法が提供される。
【0007】
コンピュータ実施方法は、
-複数のルーチンを含む1つまたは複数のコードファイルを受信することであって、コードファイルは、メモリブロックのランタイム動的割り当てをサポートする動的メモリ領域を使用して、1つまたは複数のプロセッサにより実行するために作成された、1つまたは複数のコードファイルを受信することと、
-コードファイルを調整することであって、
コードファイルを分析して、複数のルーチンのうちの1つまたは複数のエクスプロイトに脆弱なルーチンを識別し、
各脆弱なルーチンの実行完了時に、動的メモリ領域に割り当てられた複数のブロックの直近に割り当てられたブロックの1つまたは複数のサブセットのメモリ空間から、複数のブロックの隣接する1つのメモリ空間まで、を超える書き込み動作を、サブセットの各ブロックの1つまたは複数の境界にある動的メモリ領域に挿入された複数のマーカの1つまたは複数を使用して、検出するように構成されたメモリ整合性コードセグメントを追加する、コードファイルを調整することと、
-調整したコードファイルを出力することと、を含む。
【0008】
ランタイムに書き込み動作が検出された場合、メモリ整合性コードセグメントは、プロセッサに1つまたは複数の事前定義された動作を開始させる。
【0009】
本発明の第2の態様によれば、動的メモリ保護を適用するために調整されたコードファイルを生成するためのシステムであって、コードを格納するプログラムストアと、記憶されたコードを実行するためにプログラムストアに結合された1つまたは複数のプロセッサとを備えるシステムが提供される。
【0010】
システムは、
-複数のルーチンを含む1つまたは複数のコードファイルを受信するためのコード命令であって、コードファイルは、メモリブロックの実行時動的割当をサポートする動的メモリ領域を使用して1つまたは複数のプロセッサによって実行するために作成された、コード命令と、
-1つまたは複数のコードファイルを調整するためのコード命令であって、
1つまたは複数のコードファイルを分析して、複数のルーチンのうちの1つまたは複数のエクスプロイトに脆弱なルーチンを識別し、
各脆弱なルーチンの実行完了時に、動的メモリ領域に割り当てられた複数のブロックの直近に割り当てられたブロックの1つまたは複数のサブセットのメモリ空間から、複数のブロックの隣接する1つのメモリ空間まで、を超える書き込み動作を、サブセットの各ブロックの1つまたは複数の境界にある動的メモリ領域に挿入された複数のマーカの1つまたは複数を使用して、検出するように構成されたメモリ整合性コードセグメントを追加する、コード命令と、
-1つまたは複数の調整されたコードファイルを出力するためのコード命令と、を含む。
【0011】
ランタイムに書き込み動作が検出された場合、メモリ整合性コードセグメントは、1つまたは複数のプロセッサに1つまたは複数の事前定義された動作を開始させる。
【0012】
本発明の第3の態様によれば、動的メモリ保護をサポートするために調整された1つまたは複数のコードファイルから生成されたコンピュータプログラム実行可能ファイルが提供される。
【0013】
コンピュータプログラム実行可能ファイルは、
非一時的コンピュータ可読記憶媒体と、メモリ整合性コードセグメントを追加することによって動的メモリ保護をサポートするように調整された1つまたは複数のコードファイルから、メモリ領域のランタイム動的割り当てをサポートする動的メモリ領域を使用して、1つまたは複数のプロセッサによって実行するために生成された実行可能ファイルの複数のルーチンの各ルーチンである複数のプログラム命令と、を含む。メモリ整合性コードセグメントは、複数のルーチンのうちの1つまたは複数のエクスプロイトに脆弱なルーチンの実行が完了すると、動的メモリ領域に割り当てられた複数のブロックのうちの直近に割り当てられたブロックのうちの1つまたは複数のサブセットのメモリ空間から、複数のブロックのうちの隣接する1つのメモリ空間まで、を超える書き込み動作を、サブセットのブロックのそれぞれの1つまたは複数の境界内の動的メモリ領域内に挿入された複数のマーカのうちの1つまたは複数を使用して、検出するように構成される。一方、複数のプログラム命令は、一時的でないコンピュータ読み取り可能な記憶媒体からプロセッサによって実行される。
【0014】
第1、第2および/または第3の態様のさらなる実施形態では、1つまたは複数のコードファイルは、コンパイラによるコンパイル前に調整されたソースコードファイルであり、1つまたは複数のプロセッサによって実行される1つまたは複数のそれぞれの実行可能コードファイルの生成に使用される1つまたは複数のそれぞれの中間コードファイルを作成するように適合される。
【0015】
第1、第2および/または第3の態様のさらなる実施形態では、1つまたは複数のコードファイルは、1つまたは複数のプロセッサによって実行される1つまたは複数のそれぞれの実行可能コードファイルが生成される前にコンパイラによって生成された中間コードファイルであり、1つまたは複数の中間コードファイルは、オブジェクトファイルおよびアーカイブファイルからなるグループの1つである。
【0016】
第1、第2および/または第3の態様のさらなる実施形態では、1つまたは複数のコードファイルは、1つまたは複数のプロセッサによって実行されるために生成されたマシンコードを含む実行可能コードファイルである。
【0017】
第1、第2および/または第3の態様のさらなる実施形態では、複数のルーチンのそれぞれは、ルーチン、サブルーチンおよび/または関数からなるグループの1つである。
【0018】
第1、第2および/または第3の態様のさらなる実施形態では、1つまたは複数の脆弱なルーチンは、1人以上のエキスパートによって手動で定義され、そのエキスパートは開発者、オペレータおよび/またはユーザからなるグループの1つである。
【0019】
第1、第2、および/または第3の態様のさらなる実施形態では、1つまたは複数の脆弱なルーチンは、1つまたは複数のコードファイルの分析に基づいて自動的に定義される。
【0020】
第1、第2および/または第3の態様のさらなる実施形態では、書き込み動作は、1つまたは複数のマーカが挿入されたメモリ位置におけるデータオーバーランをチェックすることによって検出される。
【0021】
第1、第2および/または第3の態様のさらなる実施形態では、1つまたは複数のコードファイルが中間コードファイルである場合、メモリ整合性コードセグメントは、各脆弱なルーチンの代わりに呼び出され、1つまたは複数の脆弱なルーチンの実行が完了した後、1つまたは複数の脆弱なルーチンを最初に呼び出し、その後にメモリ整合性コードセグメントの呼び出しが続くように構成されるトランポリン分岐関数を追加することによって追加される。
【0022】
第1、第2および/または第3の態様のさらなる実施形態では、1つまたは複数のコードファイルが中間コードファイルである場合、メモリ整合性コードセグメントは、それぞれの脆弱なルーチンが実行を完了した直後に、メモリ整合性コードセグメントを呼び出すために、各脆弱なルーチンの最後に分岐命令を追加することによって追加される。
【0023】
第1、第2および/または第3の態様のさらなる実施形態では、1つまたは複数のコードファイルが実行可能コードファイルである場合、脆弱なルーチンごとに置換ルーチンを含むように構成された1つまたは複数の動的に事前ロードされたライブラリを作成することによって、メモリ整合性コードセグメントが追加される。置換ルーチンは、それぞれの脆弱なルーチンが実行を完了した後、それぞれの脆弱なルーチンを最初に呼び出し、その後にメモリ整合性コードセグメントの呼び出しが続くように構成される。
【0024】
第1、第2および/または第3の態様のさらなる実施形態では、メモリ整合性コードセグメントは、1つまたは複数のプロセッサによって実行されるオペレーティングシステムに固有の1つまたは複数のメモリ管理ルーチンに追加される。
【0025】
第1、第2および/または第3の態様のオプションの実施形態では、メモリ整合性コードセグメントは、1つまたは複数の脆弱なルーチンの呼び出しの前に、直近に割り当てられたブロックのサブセットの1つのメモリ空間から超過する、少なくとも1つの脆弱なルーチンによって実行される潜在的な差し迫った書き込み動作を検出するために呼び出すようにさらに構成される。メモリ整合性コードセグメントは、少なくとも1つの脆弱なルーチンに転送されたアドレス範囲を分析して、転送されたアドレス範囲が1つまたは複数の境界を超えているかどうかを判断する処理を行うことによって、超過書き込み動作を検出する。
【0026】
第1、第2および/または第3の態様のさらなる実施形態では、最近割り振られたブロックのサブセットは、動的メモリ領域に割り振られたすべてのブロックを含む。
【0027】
第1、第2および/または第3の態様のさらなる実施形態では、メモリ整合性コードセグメントの呼び出し時に、コンテキストスイッチおよび割り込みは無効化される。
【0028】
第1、第2および/または第3の態様のさらなる実施形態では、メモリ整合性コードセグメントは、1つまたは複数の最近の割り当てリストを横断することによって、直近に割当られたブロックのサブセットの1つを識別する。直近に割り当てられたブロックの各々は、1つまたは複数の最近の割り当てリスト内で、それぞれの直近の割り当てブロックへのポインタと、複数のマーカのそれぞれの1つと、それぞれの直近の割り当てブロックのサイズとを関連付ける。ここで、最近の割り当てリストに列挙されている、直近に割り当てられたブロックの最大数は、事前定義されている。
【0029】
第1、第2および/または第3の態様のさらなる実施形態では、メモリ整合性コードセグメントは、直近に割り当てられたブロックの1つまたは複数の境界内の動的メモリ領域に挿入された1つまたは複数のマーカの値が、最近の割り当てリストの1つまたは複数の中の直近に割り当てられたブロックに関連付けられた1つまたは複数のマーカの値と一致しないことを検出することによって、書き込み動作を検出する。
【0030】
第1、第2および/または第3の態様のさらなる実施形態では、最近の割り当てリストの各々が動的メモリ領域内のブロックを割り当てる、および/または動的メモリ領域内のブロックを解放(フリー)することからなるグループの1つである1つまたは複数のメモリ割り当て動作を実行するように構成された複数のルーチンの1つまたは複数の調整されたメモリ管理ルーチンによって保持される。調整されたメモリ管理ルーチンの各々は、1つまたは複数のコードファイルに追加された割り当て追跡コードセグメントを呼び出すように調整される。割り当て追跡コードセグメントは、
新たに割り当てられたブロックに対するエントリを追加するように、1つまたは複数の最近の割り当てリストを更新することであって、追加されたエントリは、新たに割り当てられたブロックをそれぞれの一意のマーカと、新たに割り当てられたブロックへのポインタと、新たに割り当てられたブロックのサイズとに関連付ける、更新することと、
割り当てられたブロックの1つまたは複数の境界内の動的メモリ領域にそれぞれの一意のマーカを挿入することと、
-により、新たに割り当てられたブロックの割り当て時に、新たに割り当てられたブロックを少なくとも1つの最近の割り当てリストに追加し、
除去された割り当てられたブロックの1つまたは複数の境界に挿入された一意のマーカと、最近の割り当てリスト内の除去された割り当てられたブロックの一意のマーカとを比較することによって、除去された割り当てられたブロックのメモリ空間に超過書き込み動作が発生したかどうかを判定することによって、除去された割り当てられたブロックを検証することと、
削除された割り当てられたブロックをマッピングするエントリを最近の割り当てリストから削除することと、
-により、最近の割り当てリストから、割り当てられたブロックを削除する。
【0031】
第1、第2、および/または第3の態様のさらなる実施形態では、割り当て追跡コードセグメントは、複数のマーカのうちの別の1つとして機能するように、新たに割り当てられたブロックの1つまたは複数の境界に、新たに割り当てられたブロックのサイズを挿入するようにさらに構成される。
【0032】
第1、第2、および/または第3の態様のさらなる実施形態では、それぞれの一意のマーカは、割り当て時に、割り当てられたブロックに対してランダムに選択される。
【0033】
第1、第2、および/または第3の態様のさらなる実施形態では、最近の割り当てリストが一杯である間に、別の新たに割り当てられたブロックの割り当てが必要とされる場合、割り当て追跡コードセグメントは、少なくとも1つの最近の割り当てリストから、
少なくとも最近に割り当てられたブロックを検証し、
少なくとも最近に割り当てられたブロックをマッピングしているエントリを、最近の割り当てリストから除去すること、
によって、少なくとも最近に割り当てられたブロックを除去する。
【0034】
第1、第2、および/または第3の態様のさらなる実施形態では、割り当て追跡コードセグメントは、
少なくとも最近に割り当てられたブロックの1つまたは複数の境界に位置するそれぞれの一意のマーカをグローバルマーカで置換することであって、グローバルマーカは、プロセッサおよび/または同様のものによって実行される1つまたは複数のプロセスの開始中に、1つまたは複数のプロセッサの起動イベントのたびにランダムに選択される、置換し、
少なくとも最近に割り当てられたブロックの上部境界に、少なくとも最近に割り当てられたブロックのサイズを挿入する、
ように、さらに構成される。
【0035】
第1、第2、および/または第3の態様のさらなる実施形態では、割り当て追跡コードセグメントは、解放された割り当てブロックの1つまたは複数の境界に挿入されたグローバルマーカの検証に基づいて、解放された割り当てられたブロックのメモリ空間に超過書き込み動作が発生したかどうかを判定することによって、最近の割り当てリストに列挙されていない解放された割り当てブロックのそれぞれを検証するようにさらに構成され、割り当て追跡コードセグメントは解放された割り当てブロックの上部境界に挿入された解放された割り当てブロックのサイズを使用してグローバルマーカを取り出す。
【0036】
第1、第2、および/または第3の態様のさらなる実施形態では、グローバルマーカは、1つまたは複数のプロセッサの起動イベントのたびにランダムに選択される。
【0037】
第1、第2および/または第3の態様のさらなる実施形態では、1つまたは複数のコードファイルが中間コードファイルである場合、割り当て追跡コードセグメントは1つまたは複数のメモリ管理ルーチンの代わりに呼び出され、1つまたは複数のメモリ管理ルーチンの実行の前後に割り当て追跡コードセグメントを呼び出すように構成されたトランポリン分岐関数を追加することによって追加される。
【0038】
第1、第2および/または第3の態様のさらなる実施形態では、1つまたは複数のコードファイルが中間コードファイルである場合、割り当て追跡コードセグメントは1つまたは複数のメモリ管理ルーチンの実行開始時および実行終了時に割り当て追跡コードセグメントを呼び出すために、1つまたは複数のメモリ管理ルーチンの開始および終了時に分岐命令を追加することによって追加される。
【0039】
第1、第2および/または第3の態様のさらなる実施形態では、1つまたは複数コードファイルが実行可能コードファイルである場合、割り当て追跡コードセグメントは1つまたは複数のメモリ管理ルーチンのための置換ルーチンを含むように構成された1つまたは複数の動的に事前ロードされたライブラリを作成することによって追加される。置換ルーチンは、1つまたは複数のメモリ管理ルーチンの実行の前後に割り当て追跡コードセグメントを呼び出すように構成される。
【0040】
第1、第2、および/または第3の態様のさらなる実施形態では、メモリ整合性コードセグメントは、1つまたは複数の脆弱なルーチンの実行が完了すると、複数のブロックのうちのエクスプロイトの影響を受けやすいブロックのサブセットのうちの1つまたは複数のメモリ空間から、複数のマーカのうちの1つまたは複数のマーカを使用して、複数のブロックのうちの隣接する1つのメモリ空間への書き込み動作の超過を検出するようにさらに構成される。エクスプロイトの影響を受けやすいブロックの各サブセットは1つまたは複数の脆弱なルーチンが使用するために、動的メモリに事前に割り当てられている。
【0041】
第1、第2、および/または第3の態様のさらなる実施形態では、エクスプロイトの影響を受けやすいブロックのサブセットは、影響を受けやすいブロックリストに列挙される。エクスプロイトの影響を受けやすいブロックの各々は、影響を受けやすいブロックリストにおいて、それぞれのエクスプロイトの影響を受けやすいブロックへのポインタ、複数のマーカのそれぞれの1つ、およびそれぞれのエクスプロイトの影響を受けやすいブロックのサイズに関連付けられる。ここで、影響を受けやすいブロックリストに列挙されたエクスプロイトの影響を受けやすいブロックの最大数は、事前定義される。
【0042】
第1、第2、および/または第3の態様の任意選択的な実施形態では、1つまたは複数のクリティカルルーチンの呼び出しの前に、メモリ整合性コードセグメントの実行を呼び出すように1つまたは複数コードファイルを調整する。
【0043】
第1、第2および/または第3の態様のさらなる実施形態では、事前定義された動作は、1つまたは複数のプロセッサの実行をクラッシュさせること、1つまたは複数のプロセッサの実行を停止させること、1つまたは複数のプロセッサを事前定義されたアドレスに分岐させること、1つまたは複数のプロセッサが1つまたは複数の潜在的に悪意のあるコード命令を実行することを妨げること、および/または動的メモリオーバーランの指標を生成することからなるグループの1つである。
【0044】
第1、第2、および/または第3の態様の任意選択的な実施形態では、1つまたは複数のコードファイルのうちが中間コードファイルである場合、1つまたは複数の中間コードファイルは追加されたコードセグメントの追加によって影響を受ける命令および/またはデータ要素を修正するように調整される。
【0045】
第1、第2、および/または第3の態様の任意選択的な実施形態では、1つまたは複数のコードファイルが中間コードファイルである場合、1つまたは複数の中間コードファイルは追加されたコードセグメントの包含および調整されたルーチンのサイズの増加を反映するように、そのシンボルテーブルを更新するように修正される。
【0046】
本開示の他のシステム、方法、特徴、および利点は以下の図面および詳細な説明を検討することにより、当業者には明らかになるのであろう。そのような追加のシステム、方法、特徴、および利点はすべて、この説明内に含まれ、本開示の範囲内にあり、添付の特許請求の範囲によって保護されることが意図される。
【0047】
別段の定義がない限り、本明細書で使用されるすべての技術用語および/または科学用語は、本発明が関係する技術分野の当業者によって一般に理解されるものと同じ意味を有する。本明細書に記載されるものと同様または同等の方法および材料を、本発明の実施形態の実施または試験において使用することができるが、例示的な方法および/または材料を以下に記載する。矛盾する場合には、定義を含む特許明細書が優先する。さらに、材料、方法、および実施例は、例示にすぎず、必ずしも限定することを意図するものではない。
【0048】
本発明の実施形態の方法および/またはシステムの実施は選択されたタスクを手動で、自動的に、またはそれらの組合せで実行または完了することを含むことができる。さらに、本発明の方法および/またはシステムの実施形態の実際の計装および機器によれば、いくつかの選択されたタスクは、ハードウェア、ソフトウェア、またはファームウェア、またはオペレーティングシステムを使用するそれらの組合せによって実施することができる。
【0049】
例えば、本発明の実施形態による選択されたタスクを実行するためのハードウェアは、チップまたは回路として実装することができる。ソフトウェアとして、本発明の実施形態による選択されたタスクは、任意の適切なオペレーティングシステムを使用してコンピュータによって実行される複数のソフトウェア命令として実装することができる。本発明の例示的な実施形態では、本明細書で説明する方法および/またはシステムの例示的な実施形態による1つまたは複数のタスクが複数の命令を実行するためのコンピューティングプラットフォームなどのデータプロセッサによって実行される。任意選択的に、データプロセッサは命令および/またはデータを記憶するための揮発性メモリ、および/または命令および/またはデータを記憶するための、磁気ハードディスクおよび/またはリムーバブルメディアなどの不揮発性記憶装置を含む。任意選択的に、ネットワーク接続も同様に提供される。ディスプレイおよび/またはキーボードやマウスなどのユーザ入力装置も、任意選択で提供される。
【図面の簡単な説明】
【0050】
本発明のいくつかの実施形態は、添付の図面を参照して、単に例として本明細書に記載される。ここで図面を詳細に特に参照すると、示される詳細は、例として、および本発明の実施形態の例示的な議論の目的のためであることが強調される。この点に関して、図面を参照した説明は、本発明の実施形態がどのように実施され得るかを当業者に明らかにする。
図1図1は、本発明のいくつかの実施形態による、動的メモリ保護を適用するためにコードファイルを調整する例示的なプロセスのフローチャートである。
図2図2は、本発明のいくつかの実施形態による、動的メモリ保護を適用するためにコードファイルを調整するための例示的なシステムの概略図である。
図3図3は、本発明のいくつかの実施形態による、動的メモリ保護を適用するために割り当てられた動的メモリブロックをマッピングするために作成され、使用される例示的な最近の割り当てリストの概略図である。
【発明を実施するための形態】
【0051】
本発明は、そのいくつかの実施形態では、動的メモリ保護を適用することに関し、より具体的には、しかし排他的ではなく、ポストコーディングフェーズで動的メモリ保護を適用することに関する。
【0052】
本発明のいくつかの実施形態によれば、1つまたは複数のプロセッサによって使用されるメモリをそれらの実行のために保護するためにメモリ保護を適用するように構成された追加のコード(ロジック)を含むように1つまたは複数のコードファイルを調整するための方法、システム、およびコンピュータプログラム製品が提供される。特に、メモリ保護は、実行時におけるメモリブロックの動的割り当ておよび解放をサポートする、例えばヒープ、データセグメントおよび/または同様のものなどの動的メモリに向けられる。
【0053】
コードファイルは、例えば、ソースコードファイル、中間コードファイル、および/または実行可能コードファイルを含み、各々は、本明細書で集合的に指定された複数のルーチン、サブルーチン、関数および/または同様のものを含むことができる。
【0054】
動的メモリ保護コード(論理)を含むように調整されたコードファイルは、コードファイルのプログラマ(開発者)が、コードファイルがそれぞれの実行可能コードを生成する準備ができているようにコーディングを完了した、ことを意味する(ポストコーディングフェーズで)ポストコーディングされる。ソースコードファイルは、1つまたは複数のそれぞれの中間コードファイル、例えば、オブジェクトファイル、ライブラリファイル、アーカイブファイル、および/または、1つまたは複数のそれぞれの実行可能ファイルを生成するように適用された1つまたは複数のコンパイラによって、コンパイル前に調整されてもよい。コンパイラによってソースコードファイルから生成された中間コードファイルは、それぞれの実行可能ファイルの生成、構築および/またはリンクの前に調整することができる。マシンコードを含む実行可能コードファイルの場合、追加された動的メモリ保護コードは、動的メモリ保護コードを含む1つまたは複数の動的に事前ロードされたライブラリを作成することによって追加されてもよい。実行可能ファイルは、本明細書では以下で装置と総称する1つまたは複数の装置、システム、および/またはプラットフォームの1つまたは複数のプロセッサによって実行することができる。
【0055】
マルウェア(悪意のあるコード)、例えば、コンピュータウイルス、ワーム、トロイの木馬、ランサムウェア、スパイウェア、アドウェア、スケアウェア等は、潜在的に悪意のある人々によって使用され、プロセッサの制御(実行)フローに対する制御を得ることができる。マルウェアは、1つまたは複数のセキュリティエクスプロイト、例えば、バッファオーバーフロー、バッファオーバーランおよび/または同様のものを適用して、その実行のためにプロセッサによって使用される1つまたは複数の動的メモリ領域、例えば、ヒープメモリ、データセグメントおよび/または同様のもの(典型的には揮発性メモリリソースに実装される)を操作することができる。マルウェアは実行可能コードを保持することが分かっている領域内の悪意のあるコードを起動させたり、プログラムの状態に関連するデータを選択的に上書きさせたりするために、バッファオーバーフローおよび/またはオーバーランを引き起こすことによって、プロセッサを制御しようとしてプロセッサの動的メモリを操作する可能性があり、従って、元のプログラマ(開発者)によって意図されなかった挙動を引き起こす。
【0056】
ランタイム間に、メモリブロックは、メモリリソースを必要とするプロセッサによって実行される1つまたは複数のルーチン、プロセスおよび/またはタスクによって使用されるために、動的メモリ内に割り当てられてもよい。マルウェアは、エクスプロイトされたルーチンによって使用されるために動的メモリ内に割り当てられた1つまたは複数のブロックのメモリ空間から超過する動的メモリ内のメモリ空間に書き込むことによって、動的メモリをオーバーラン(オーバーフロー)するために、1つまたは複数のルーチンを侵害したり、エクスプロイトしたりする可能性がある。オーバーランイベントは、特定の割り当てられたブロックのメモリ空間から、動的メモリ内の隣接するブロックのメモリ空間、例えば、1つまたは複数のルーチンによって使用するために割り当てられたブロックである先行ブロックおよび/または後続ブロック、調整されたコードファイル、データ構造などを使用して生成された実行可能ファイルを実行するプロセッサによって使用されるスタック、を超える書き込み動作によって表されてもよい。マルウェアによって侵害および/またはエクスプロイトされたルーチンは、典型的には、メモリ操作ルーチン、例えば、メモリコピールーチン、メモリ移動ルーチン、ストリングコピールーチンおよび/または同様なものを含み得る。これらのルーチンは動的メモリの操作を目的としているため、マルウェアによるエクスプロイトの対象となる可能性があり、従って脆弱なルーチンとみなされる可能性がある。
【0057】
コードファイル内の動的メモリ保護を適用するために、コードファイル内の1つまたは複数のルーチンを調整して、動的にオーバーランを識別し、動的メモリを操作して悪意のあるコードを呼び出すことによって、マルウェアがプロセッサの制御フローを引き継がないようにするために適合された動的保護ロジック(コード)を含むようにしてもよい。動的保護は、割り当てられたブロックのメモリ空間の境界にメモリ位置にマーカを挿入し、脆弱なルーチンの実行完了後にマーカの値を検証することに基づいている。
【0058】
コードファイルの各々は、複数のルーチン、特に脆弱なルーチンを識別するために分析されてもよい。コードファイルは、さらに、1つまたは複数のメモリ管理ルーチン、特にメモリ割り当てルーチン、例えば、メモリブロック割り当てルーチン、動的メモリリソースを要求する1つまたは複数のルーチン、プロセスおよび/またはタスクによって開始される(呼び出される)可能性があるメモリブロックフリー(解放)ルーチンおよび/または同様のものを識別するために分析されてもよい。例えば、ソースコードファイルの場合、脆弱なルーチンおよび/またはより多くのメモリ管理ルーチンは、それらのニーモニックおよび/またはシンタックスを用いて事前定義されてもよい。別の実施形態では、中間コードファイルおよび/または実行可能コードファイルの場合、コードファイルは、脆弱なルーチンおよび/またはメモリ管理ルーチンを識別するために、当技術分野で知られている1つまたは複数の方法、ツールおよび/または技術を使用して分析されてもよい。
【0059】
コードファイルは、メモリ管理ルーチンのうちの1つまたは複数の実行時に呼び出すことができる割り当て追跡コードを含み、かつ/または追加するように調整することができる。割り当て追跡コードは、動的メモリ内の割り当てられたブロックのそれぞれ1つを一意のマーカに関連付ける複数のエントリを含む1つまたは複数の割り当てられたブロックリストを保持するように構成されてもよい。各エントリには、それぞれ割り当てられたブロックへのポインタ、それぞれ割り当てられたブロックのサイズ、およびそれぞれ割り当てられたブロックの一意のマーカを含めることができる。割り当て追跡コードは、メモリ位置のそれぞれの割り当てられたブロックに関連する一意のマーカを、それぞれの割り当てられたブロックの一方または両方の境界に挿入するように、さらに構成することができる。
【0060】
調整されたコードファイルを使用して生成された実行可能ファイルを実行するプロセッサの実行間に、新たに割り当てられたブロックを割り当てると、割り当て追跡コードは、新たに割り当てられたブロックをマッピングする新たなエントリを含むように、割り当てられたブロックリストを更新してもよい。割り当て追跡コードは、新たに割り当てられたブロックの境界におけるメモリ位置に、それぞれの一意のマーカをさらに挿入することができる。
【0061】
コードファイルは、脆弱なルーチンの各々の実行の完了後に呼び出されて、実行された脆弱なルーチンが割り当てられたブロックをオーバーランしなかったことを検証することによって、割り当てられたブロックリストに列挙された割り当てられたブロックの整合性を検証するメモリ整合性コードを含むように、さらに調整されてもよい。
【0062】
ランタイム間に、脆弱なルーチンの実行後に実行されるメモリ整合性コードは、一意のマーカが挿入された列挙された各割り当てブロックの境界におけるメモリ位置の値と、割り当てられたブロックリスト内のそれぞれの列挙された割り当てブロックに関連付けられたそれぞれの一意のマーカの値とを比較することができる。割り当てられた1つまたは複数のブロックに一致しない場合、メモリ整合性コードは、書き込み動作が特定の割り当てられたブロックのメモリ空間から超過し、従って一意のマーカメモリ位置でデータ値を変更(オーバーラン)したため、オーバーランが発生したと判断する。割り当てられたすべてのブロックが一致した場合、メモリ整合性コードによってオーバーランが発生していないと判断されることがある。
【0063】
任意選択的に、メモリ整合性コードセグメントは、1つまたは複数の脆弱なルーチンの呼び出しの前に起動し、実行して、直近に割り当てられたブロックのサブセットの1つまたは複数のメモリ空間から超過する、それぞれの脆弱なルーチンによって実行される潜在的な差し迫った書き込み動作を検出するように構成される。メモリ整合性コードセグメントは、処理のためにそれぞれの脆弱なルーチンに転送されたアドレス範囲を分析することによって、超過書き込み動作を検出することができる。分析に基づいて、メモリ整合性コードは、転送されたアドレス範囲が割り当てられたブロックリストに列挙された1つまたは複数のブロックの境界の1つまたは複数を横切るかどうかを決定することができる。
【0064】
任意選択的に、メモリ整合性コードセグメントは、割り当てブロックリストを横断するためにメモリ整合性コードセグメントをトリガし、割り当てブロックリストに列挙された割り当てブロックのいずれかでオーバーランが発生しなかったことを検証する1つまたは複数のルーチンによって、脆弱なルーチンの実行とは無関係に、事前指示されて起動されてもよい。
【0065】
動的メモリは著しく大きくなる可能性があり、従って、プロセッサの実行中の任意の時点で、非常に多数のブロックが動的メモリ内に割り当てられる可能性がある。そのような多数の割り当てられたブロックを追跡することは、かなりの計算リソース、例えば、記憶装置リソース、処理能力、処理時間、および/または同様のものを必要とし得る。これは、特に、限定されたそのようなリソースを有するローエンド装置および/またはシステム、例えば、埋め込み装置、IoT装置、医療装置、および/または同様のものに対して、大きな制限を提示し得る。
【0066】
ローエンド装置をサポートするため、および/または計算リソースを削減するために、この制限を克服するために、割り当て追跡コードは、動的メモリ内に割り当てられたブロックのサブセットのみの割り当てを追跡するように構成されてもよい。特に、サブセットは、動的メモリ内に割り当てられた直近のブロックで最近割り当てられたブロックを含むことができる。複数の利用事象の観察、分析およびシミュレーションに基づいて、動的メモリ利用シナリオの重要な大部分において、マルウェアが最近割り当てられた動的メモリブロックを利用することが決定された。直近に割り当てられた動的メモリブロックは、動的メモリ内のブロックのようなメモリリソースの割り当ては即時使用のためにメモリリソースを必要とするルーチン、プロセスおよび/またはタスクから受信した割り当て要求に応答して行われるため、マルウェアによるエクスプロイトの影響を最も受けやすい。ルーチン、プロセス、および/またはタスクが割り当てられたメモリリソースを実際に使用する前に、メモリ割り当て要求を「long」(実行時間)発行する可能性は低くなる。そのため、1つまたは複数の脆弱なルーチンを侵害するマルウェアは、典型的に直近に割り当てられたメモリブロックで侵害された脆弱なルーチンに割り当てられた動的メモリブロックにアクセスする可能性がある。
【0067】
従って、コードファイルに追加された割り当て追跡コードは、実行時に、最近割り当てられたブロックの大幅に減少したサブセットを保持し、従って、直近に割り当てられたブロックのそれぞれの1つを列挙する、事前に定義された数のエントリを含む、1つまたは複数の最近の割り当てリスト内のエントリの数を大幅に減少させるように構成されてもよい。追跡された最近割り振られたブロックの最大数は、実行可能ファイルを実行するプロセッサの1つまたは複数の動作パラメータおよび/または属性、例えば、動的メモリのサイズ、割り振られたブロックの最大/最小サイズ、プロセッサに利用可能な計算リソース、オペレーティングシステムの特徴、装置および/またはアプリケーションの性質(すなわち、リアルタイム、ライフクリティカルなど)などに従って、事前定義されてもよい。例えば、ローエンド装置の場合、割り当てられたブロックリストに列挙された直近に割り当てられたブロックの数は、比較的制限され得る。ただし、大規模な計算リソースを持つハイエンド装置では、割り当てられたブロックリストに列挙されている直近に割り当てられたブロックの数が大幅に大きくなる可能性があり、任意選択で動的メモリに割り当てられたすべてのブロックを含めることもできる。
【0068】
典型的には、マルウェアは動的メモリに最近割り当てられたメモリブロックをエクスプロイトする可能性があるが、シナリオによっては、事前に割り当てられたブロックが直近に割り当てられたブロックではないことを意味する、動的メモリに事前に割り当てられたメモリブロックをマルウェアが使用しようとすることがある。事前に割り当てられたブロックは必ずしも直近に割り当てられたブロックである必要はないので、これらの事前に割り当てられたブロックは最近の割り当てリストに列挙されなくてもよい。さらに、マルウェアは脆弱なルーチンを侵害しようとする可能性があるため、マルウェアは、典型的には、1つまたは複数の脆弱なルーチンにより使用するために事前に割り当てられた、割り当てられたブロックをエクスプロイトしようとすることがある。従って、そのような事前に割り当てられたブロックは、マルウェアによるエクスプロイトの影響を非常に受けやすいことがある。
【0069】
このようなシナリオを克服するために、コードファイルに追加された割り当て追跡コードは、ランタイムに、それぞれが影響を受けやすい割り当てブロックのそれぞれ1つを列挙する所定の数のエントリを含む追加のリスト指定された影響を受けるブロックリストを保持するように構成されてもよい。
【0070】
補完的に、メモリ整合性コードは、実行時に、最近の割り当てリストに列挙された割り当てブロックのみの整合性と、任意選択で影響を受けるブロックリストに列挙された割り当てブロックの整合性とを検証するように構成される。本明細書で前述したように、メモリ整合性コードは、一意のマーカが挿入された列挙された割り当てられたブロックのそれぞれの境界におけるメモリ位置の値を、最近の割り当てリストおよび任意選択で影響を受けやすいブロックリスト内のそれぞれの列挙された割り当てられたブロックに関連するそれぞれの一意のマーカの値と比較することができる。列挙されている割り当て済みブロックの1つまたは複数に一致しない場合、メモリ整合性コードはオーバーランが発生したと判断することがあり、列挙されているすべての割り当てられたブロックに一致した場合、メモリ整合性コードはオーバーランが発生していないと判断し、列挙されている割り当てられたブロックが有効である。
【0071】
任意選択的に、コードファイルは、コードファイル内で識別される1つまたは複数の重要なルーチンの実行の前に、メモリ整合性コードの呼び出しを含むように調整される。コードファイルの分析に基づいて手動で定義および/または自動的に識別される重要なルーチンである。クリティカルルーチンは、実行されると、危険にさらされた意図された行動は、他の人々に影響および/または危険を与えるように、潜在的に危険な、危険な、および/または有害な結果、および/または結果、特に、1つまたは複数の他の人々、例えば、人々(例えば、ユーザ、患者、オペレータなど)、装置、システム、および/または同様のものとの相互作用に関連する、危険にさらされた意図された行動につながる可能性がある方法で、装置の意図された行動を危険にさらすことがある。
【0072】
追加されたコードセグメントを使用する際にコードファイルを調整することによって動的メモリ保護を適用することは、動的メモリ保護手段をコードに組み込むための既存の方法およびシステムと比較して、著しい利点および利益を提示することができる。
【0073】
第1に、本明細書で説明される動的保護は、脆弱なルーチンの実行の直後に割り当てられたブロックを検証することによって、悪意のある動作を示すオーバーランのリアルタイム検出を可能にする。これは、マルウェアがプロセッサをその実行フローから逸らすことを防止し、従って、損傷および/または損害をもたらす可能性がある望ましくない動作、結果、および/または含意を防止するために、高速で、任意選択で即座の応答を可能にすることができる。これは、例えば、ヒープメモリオーバーランをリアルタイムで検出することができず、従って、マルウェアが悪意のあるコードと被害を開始した後にのみオーバーランを検出することができる、HeapSentryなど、既存の方法よりも大きな利点をもたらすことがある。さらに、例えば、HeapSentryのような既存の方法は、ヒープメモリ内でのみメモリオーバーランを検出することに制限されてもよく、一方、本明細書に記載する動的保護は、ヒープメモリを超える追加の動的メモリ領域、例えば、データセグメントおよび/または同様のものに適用されてもよい。
【0074】
さらに、既存の方法のいくつか、例えば、HeapSentryは、ヒープメモリに割り当てられたすべてのブロックにヒープ保護機能を適用するように指示されてもよい。これは、かなりの計算リソース、例えば、処理能力、処理時間、記憶装置リソースなどを必要とすることがある。これは、動的メモリ保護を適用するために、特に、ローエンドおよび/または限られたリソースの装置のために、大きな制限を提示することがある。対照的に、著しく少数かつ限られた数の最近割り当てられたブロックのみを検証するために最近割り当てられた方法論を適用することは、動的メモリ保護を適用するためにプロセッサが必要とする計算リソースを著しく低減する可能性がある。これは、動的メモリ保護を、ローエンドおよび/または限られたリソースの装置に非常に適したものにすることができる。さらに、影響を受けやすい割り振られたブロックのための動的メモリ保護を拡張することは、有効化される必要がある割り振られたブロックの数をかなり少ない数に保持しながら、動的メモリの利用に対する保護をさらに向上させ、従って、低い計算リソース利用を保持することができる。
【0075】
さらに、動的メモリ保護手段、すなわち追加されたコードセグメントは、非常に単純なロジックと、限定された少数の命令とを含み、従って、それらの実行および/または記憶のために、非常に限定された、典型的には重要でない処理および/または記憶リソースを必要とする。従って、適用される動的メモリ保護手段は、ローエンド装置および/または典型的には限定されたリソース装置に非常に適している。
【0076】
既存の方法のいくつかは、動的メモリ保護、特にヒープメモリ保護、例えば、ヒープ分離、タスク起動、カーネルユーザ分離および/または同種のものを適用するために、特定のプラットフォーム、ハードウェアおよび/またはソフトウェアの能力および機能を必要とし、かつ/または依存することがある。対照的に、追加された動的保護コードセグメントを使用して動的メモリ保護を適用することは、そのような要件および/または前提条件とは無関係であり、従って、オペレーティングシステム、ハードウェア機能、アーキテクチャの詳細、および/または同様のものに対して、不感知であり、依存しない。従って、動的メモリ保護は、実際には任意のプラットフォーム、アーキテクチャ、実行環境、オペレーティングシステムおよび/または同様のものに適用することができる。
【0077】
さらに、例えば、アドレス空間レイアウトランダム化(ASLR)およびHeapSentryのような既存の方法のいくつかは、ヒープメモリを保護するためにオペレーティングシステムリソース、例えば、動的にロード可能なコードモジュール、システムコールおよび/または同様のものを必要とし得る。さらに、既存の方法によって必要とされるオペレーティングシステムリソースのいくつかは、ハードウェアサポートリソース、例えば、メモリ管理ユニットおよび/または同様のものをさらに必要とし得る。そのようなオペレーティングシステムリソースおよび/またはハードウェアサポートリソースは、複数のコンピューティング装置、システム、プラットフォーム、および/または実行環境、特にローエンド装置および/または限定リソース装置、例えば、埋め込み装置、IoT装置、医療装置、および/または同様のものにおいて利用可能ではない場合がある。対照的に、追加された動的保護コードセグメントを含むルーチンの調整を通して動的メモリ保護を適用することは、ソースおよび/または中間コードファイルが単純な単一バイナリファイルファームウェアから複雑なオペレーティングシステムまでの範囲の実行可能ファイルを生成するために使用されるかどうかにかかわらず、実質的に任意のタイプのコードファイルに軽減手段を適用することを可能にし得る。
【0078】
最後に、動的メモリ保護は、コードファイル、特に中間コードファイル、および/またはポストコーディングフェーズにおける実行可能コードファイルに適用されてもよい。すなわち、実行可能コードファイルを生成するためにファイナライズされた後、ソースコードファイルにのみこのような保護を適用することができる既存の方法、特に開発中(コーディング済み)と比較してもよい。従って、現存する方法の大部分とは対照的に、本明細書に記載する動的メモリ保護は、ソースコードが利用できない中間コードファイル、例えば、サードパーティ中間コードファイル、ライブラリファイル、および/または同様のものに適用することができる。
【0079】
さらに、ポストコーディングフェーズにおいて動的メモリ保護手段を適用することは、既存の方法によって必要とされ得るような、開発環境に対する変更、修正、改変、および/または適応を必要としない場合がある。1つまたは複数のツール、例えばツールチェーン、コンパイラ、リンカ、ビルダ、および/または同様のものを含む開発環境は、著しく複雑であり得るので、既存の方法によって行われ得るようにそれらを調整することは、著しいリソースおよび/または時間を必要とし得、従って、既存の方法を高価にし、非効率的にし、および/または制限する。対照的に、ポストコーディングフェーズで適用される動的メモリ保護手段は既存の開発環境に容易に統合することができ、ソフトウェアパッケージは、開発者の環境に影響を及ぼすことなく構築される。例えば、追加されたコードセグメントを生成および追加するために必要なツールおよび/または手順は、1つまたは複数の構築および/またはリンク設定ファイル、例えば、メークファイルおよび/または同様のものに1つまたは複数のエントリ(行)を追加することによって起動することができる。さらに、動的メモリ保護手段はポストコーディングフェーズで適用され、従って開発者のツールチェーンに影響を与えないので、開発者は既存の方法で必要とされるような修正されたツールチェーンを使用するように訓練される必要がない。
【0080】
本発明の少なくとも1つの実施形態を詳細に説明する前に、本発明は、その適用において、以下の説明に記載され、かつ/または図面および/または実施例に示される構成要素および/または方法の構成および配置の詳細に必ずしも限定されないことを理解されたい。本発明は他の実施形態が可能であり、または様々な方法で実施または実行されることが可能である。
【0081】
当業者には理解されるように、本発明の態様は、システム、方法、またはコンピュータプログラム製品として実施することができる。従って、本発明の態様は、完全にハードウェアの実施形態、完全にソフトウェアの実施形態(ファームウェア、常駐ソフトウェア、マイクロコードなどを含む)、または本明細書では一般に「回路」、「モジュール」または「システム」と呼ばれ得るソフトウェアおよびハードウェアの態様を組み合わせた実施形態の形態をとることができる。さらに、本発明の態様は、コンピュータ可読プログラムコードをその上に具現化した1つまたは複数のコンピュータ可読媒体に具現化されたコンピュータプログラム製品の形態をとることができる。
【0082】
1つまたは複数のコンピュータ可読媒体の任意の組合せを利用することができる。コンピュータ可読記憶媒体は、命令実行装置によって使用される命令を保持し記憶することができる有形装置であってもよい。コンピュータ可読媒体は、コンピュータ可読信号媒体またはコンピュータ可読記憶媒体であってもよい。コンピュータ可読記憶媒体は、例えば、電子、磁気、光学、電磁気、赤外線、または半導体のシステム、装置、または装置、あるいは前述のものの任意の適切な組合せとすることができるが、これらに限定されない。コンピュータ可読記憶媒体のより具体的な例(非網羅的なリスト)は、以下を含む:1つまたは複数のワイヤ、携帯用コンピュータディスケット、ハードディスク、ランダムアクセスメモリ(RAM)、読出し専用メモリ(ROM)、消去可能プログラマブル読出し専用メモリ(EPROMまたはFlash memory)、光ファイバ、携帯用コンパクトディスク読出し専用メモリ(CD-ROM)、光記憶装置、磁気記憶装置、または前述の任意の適切な組み合わせを有する電気的接続。本明細書のコンテキストでは、コンピュータ読み取り可能な記憶媒体は、命令実行システム、装置、または装置によって、またはそれに関連して使用するためのプログラムを含む、またはそれを記憶することができる、任意の有形媒体であってもよい。
【0083】
コンピュータ可読信号媒体は、例えば、ベースバンドで、または搬送波の一部として、コンピュータ可読プログラムコードが組み込まれた伝搬データ信号を含むことができる。そのような伝播信号は、電磁、光学、またはそれらの任意の適切な組み合わせを含むが、それらに限定されない、任意の様々な形態をとることができる。コンピュータ読み取り可能な信号媒体は、コンピュータ読み取り可能な記憶媒体ではなく、命令実行システム、アパラタス、または装置によって、またはそれに関連して使用するために、プログラムを通信、伝播、または移送することができる、任意のコンピュータ読み取り可能な媒体であってもよい。
【0084】
コンピュータ可読媒体上に具現化されたコンピュータ可読プログラム命令を含むコンピュータプログラムコードは、無線、有線、光ファイバケーブル、RFなど、または前述の任意の適切な組合せを含むがこれらに限定されない、任意の適切な媒体を使用して送信され得る。
【0085】
本発明の態様のための動作を実行するためのプログラムコードは、Java、Smalltalk、C++などのオブジェクト指向プログラミング言語、および「C」プログラミング言語または同様のプログラミング言語などの従来の手続き型プログラミング言語を含む、1つまたは複数のプログラミング言語の任意の組み合わせで書くことができる。
【0086】
プログラムコードは、全体的にはユーザのコンピュータ上で、部分的にはユーザのコンピュータ上で、スタンドアロン・ソフトウェア・パッケージとして、部分的にはユーザのコンピュータ上で、部分的にはリモートコンピュータ上で、または全体的にはリモートコンピュータまたはサーバ上で、実行されてもよい。後者のシナリオでは、リモートコンピュータは、ローカルエリアネットワーク(LAN)または広域ネットワーク(WAN)を含む任意のタイプのネットワークを介してユーザのコンピュータに接続されてもよく、または(例えば、インターネットサービスプロバイダを使用してインターネットを介して)外部コンピュータに接続されてもよい。プログラムコードは、コンピュータ読み取り可能な記憶媒体から、あるいは、ネットワーク、例えばインターネット、ローカルエリアネットワーク、ワイドエリアネットワークおよび/または無線ネットワークを介して、外部コンピュータまたは外部記憶装置に、それぞれの演算/処理装置にダウンロードすることができる。
【0087】
本発明の態様は、本発明の実施形態による方法、装置(システム)、およびコンピュータプログラム製品のフローチャート図および/またはブロック図を参照して本明細書で説明される。フローチャート図および/またはブロック図の各ブロック、ならびにフローチャート図および/またはブロック図のブロックの組合せは、コンピュータ可読プログラム命令によって実装できることを理解されたい。
【0088】
図中のフローチャートおよびブロック図は、本発明の様々な実施形態による、システム、方法、およびコンピュータプログラム製品の可能な実装のアーキテクチャ、機能、および動作を示す。この点に関して、フローチャートまたはブロック図の各ブロックは、指定された論理機能を実装するための1つまたは複数の実行可能命令を備える、モジュール、セグメント、または命令の一部を表すことができる。一部の代替実装では、ブロックに記載されている機能は、図に記載されている順序外で発生する場合がある。例えば、連続して示される2つのブロックは、実際には、実質的に同時に実行されてもよく、またはブロックが含まれる機能に応じて、時には逆の順序で実行されてもよい。また、ブロック図および/またはフローチャート図の各ブロック、ならびにブロック図および/またはフローチャート図のブロックの組み合わせは、指定された機能または動作を実行するか、または特殊目的ハードウェアおよびコンピュータ命令の組み合わせを実行する特殊目的ハードウェアベースのシステムによって実装され得ることにも留意されたい。
【0089】
ここで図面を参照すると、図1は、本発明のいくつかの実施形態による、動的メモリ保護を適用するためにコードファイルを調整する例示的なプロセスのフローチャートを示す。例示的なプロセス100は、それらの実行のために1つまたは複数のプロセッサによって使用されるメモリに対して動的メモリ保護を適用するように構成されたコードを含むように、1つまたは複数のコードファイルを調整するために実行されてもよい。具体的には、包含されるコードが動的メモリ、例えば、ヒープメモリ、データセグメントおよび/またはランタイムにおけるメモリブロックの動的割り当ておよび解放をサポートする同様のものを保護するように構成される。
【0090】
コードファイルは、例えば、複数のルーチン、サブルーチン、関数、および/または以下にまとめて指定されたルーチンをそれぞれ含むソースコードファイル、中間コードファイル、および/または実行可能コードファイルを含むことができる。動的メモリ保護コード(論理)を含むように調整されたコードファイルは、ポストコード化フェーズにある。それは、それらのプログラマが、コードファイルが1つまたは複数の装置の1つまたは複数のプロセッサによって実行するためのそれぞれの実行可能コードファイルを生成する準備ができているように、コーディングを完了していることを意味する。実行可能ファイルの実行のために、プロセッサは、実行可能ファイルの実行中にランタイム間におけるメモリブロックの動的割り当ておよび解放をサポートするヒープメモリ、データセグメントおよび/または同様のものなどの1つまたは複数の動的メモリ領域(システムメモリ)を使用する。
【0091】
コードファイルは、1つまたは複数のそれぞれの中間コードファイル、例えば、オブジェクトファイル、ライブラリファイル、アーカイブファイル、および/または、1つまたは複数のそれぞれの実行可能ファイルの生成のために使用される同様のものを作成するために適合された1つまたは複数のコンパイラによるコンパイル前に、調整された1つまたは複数のソースコードファイルを含んでもよい。コードファイルは、コンパイラによってソースコードファイルから生成され、それぞれの実行可能ファイルの生成、構築、および/またはリンクのために使用される前に調整された、1つまたは複数の中間コードファイルをさらに含み得る。実行可能コードファイルの場合、動的メモリ保護コードは、動的メモリ保護コードを構成する1つまたは複数の動的に事前ロードされたライブラリを作成することによって追加することができる。実行可能ファイルは、本明細書では以下で装置と総称する1つまたは複数の装置、システム、および/またはプラットフォームの1つまたは複数のプロセッサによって実行することができる。
【0092】
先に説明したように、ランタイム間に、マルウェアは1つまたは複数のセキュリティのエクスプロイト、例えば、バッファオーバーフロー、バッファオーバーランおよび/または同様のものを適用して、プロセッサの動的メモリ(揮発性メモリリソースに実装される)を操作し、プロセッサの制御を得ようとする。動的メモリ保護を適用するために、1つまたは複数のコードファイルを調整して、動的メモリのランタイム間操作で識別し、マルウェアがプロセッサの制御(実行)フローの制御を取れないようにするために適合された動的メモリ保護ロジックを含めることができる。
【0093】
図2は、本発明のいくつかの実施形態による、動的メモリ保護を適用するために、コードファイルを調整するための例示的なシステムの概略図である。例示的な構築システム200、例えば、コンピュータ、サーバ、計算ノード、計算ノードのクラスタ、および/またはこれらに類するものは、入出力(I/O)インターフェース202、プロセス100のようなプロセスを実行するためのプロセッサ204、およびコードおよび/またはデータを記憶するための記憶装置206を含み得る。
【0094】
I/Oインターフェース202は、1つまたは複数の有線および/または無線のネットワーク、例えば、ローカルエリアネットワーク(LAN)、ワイドエリアネットワーク(WAN)、市町村エリアネットワーク(MAN)、セルラネットワーク、インターネットおよび/または同様のものに接続するための1つまたは複数のネットワークインターフェースを含んでもよい。I/Oインターフェース202は、1つまたは複数のインターフェース、例えば、ユニバーサルシリアルバス(USB)、1つまたは複数のローカルリソース、例えば、外部ディスクドライブ、別のコンピューティング装置および/または同様のものに接続するための接続可能な記憶インターフェースおよび/または同様のものをさらに含み得る。
【0095】
同種または異種のプロセッサ204は、並列処理のために、クラスタとして、および/または1つまたは複数のマルチコアプロセッサとして配置された1つまたは複数の処理ノードを含むことができる。データおよび/またはプログラムコードを記憶するために使用される記憶装置206は、1つまたは複数の非一時的メモリ装置、例えばハードドライブ、ソリッドステートドライブ(SSD)、磁気ディスク、フラッシュアレイ、および/または同様のもの、および/または揮発性装置、例えばランダムアクセスメモリ(RAM)装置、キャッシュメモリ、および/または同種のものいずれか、を含み得る。記憶装置206は、さらに、1つまたは複数のローカルおよび/またはリモートネットワーク記憶リソース、例えば、記憶サーバ、ネットワーク接続記憶装置(NAS)、ネットワークドライブ、および/またはI/Oインターフェース202を通じて1つまたは複数のネットワークを介してアクセス可能な同様のものを備えることができる。
【0096】
I/Oインターフェース202を介して、構築システム200は、1つまたは複数のそれぞれの実行可能ファイルの生成のために作成された1つまたは複数のコードファイルを取得、例えば、受信、フェッチおよび/または検索することができる。構築システム200は、1つまたは複数のリモートネットワークリソース、例えば、サーバ、処理ノード、記憶装置サーバ、NAS、クラウドサービス、クラウド記憶装置および/または同様のものからコードファイルを取得することができる。追加的および/または代替的に、I/Oインターフェース202を介して、構築システム200は、ローカルに接続された記憶リソース、例えば、接続可能な記憶媒体、別の計算ノードおよび/または同様のものから、コードファイルを取得することができる。構築システム200は、任意選択で、取得されたコードファイルを記憶装置206にローカルに格納することができる。
【0097】
プロセッサ204は、記憶装置206のような一時的でない媒体に記憶され、プロセッサ204のような1つまたは複数のプロセッサによって実行される複数のプログラム命令を備えている、1つまたは複数のソフトウェアモジュール、例えば、プロセス、スクリプト、アプリケーション、エージェント、ユーティリティ、ツール、および/またはこれらに類するものを、実行することができる。例えば、プロセッサ204は、動的メモリ保護を適用するためにコードファイルを調整するための分析および構築アプリケーション(コンストラクタ)210を実行することができる。任意選択で、コンストラクタ210は、1つまたは複数のツール、例えば、ツールチェーン、コンパイラ、リンカ、ビルダおよび/または同様のものを含む1つまたは複数の開発環境内で統合および/または呼び出されてもよい。しかしながら、統合コンストラクタ210は、開発環境ツールに影響を与えず、および/または影響を与えず、それらが元の機能性、特徴、およびユーザインターフェースを保持するようにしてもよい。例えば、コンストラクタ210は、1つまたは複数の構築および/またはリンク設定ファイル、例えば、メークファイルおよび/または同様のものに1つまたは複数のエントリ(行)を追加することによって起動することができる。
【0098】
任意選択で、構築システム200および/またはコンストラクタ210は、1つまたは複数のクラウドコンピューティングサービス、例えば、サービスとしてのインフラストラクチャ(IaaS)、サービスとしてのプラットフォーム(PaaS)、サービスとしてのソフトウェア(SaaS)、および/または、例えば、Amazon Web Service(AWS)、Google Cloud、Microsoft Azureおよび/または同様のもののような1つまたは複数のクラウドインフラストラクチャおよび/またはサービスによって提供される同様のものによって提供される。
【0099】
102に示すように、プロセス100は、コンストラクタ210によって、1つまたは複数のコードファイル、例えば、ソースコードファイル、中間コードファイル、および/または1つまたは複数の装置、システム、および/またはプラットフォームの1つまたは複数のプロセッサによって実行される1つまたは複数のそれぞれの実行可能ファイルを生成するために作成された実行可能コードファイルを取得することから始まる。コードファイルは、ポストコード化フェーズにあり、それは、それらのプログラマ(開発者)が、コードファイルがそれぞれの実行可能コードファイルを生成するための準備が整うようにそれらのコーディングを完了したことを意味する。コンストラクタ210は、1つまたは複数のソース、例えば、リモートネットワークリソース、接続可能な記憶装置および/または記憶装置206からコードファイルを取得することができる。
【0100】
コードファイルは、例えば、オブジェクトファイル、ライブラリファイル、アーカイブファイル、および/またはこれらと同様のものであって、それぞれの実行可能ファイルの生成のために使用され得る、1つまたは複数のそれぞれの中間コードファイルを作成するために適合された1つまたは複数のコンパイラによってコンパイル前に調整された1つまたは複数のソースコードファイルを含んでもよい。
【0101】
コードファイルは、コンパイラによってソースコードファイルから生成され、それぞれの実行可能ファイルの生成の前に調整された1つまたは複数の中間コードファイルをさらに含んでもよい。中間コードファイルは、1つまたは複数のファイルフォーマット、例えば、実行可能およびリンク可能フォーマット(ELF)および/または同様のもので得ることができる。中間コードファイルは、典型的には、1つまたは複数のプロセッサによって実行され得る1つまたは複数の実行可能ファイルを生成、構築、および/またはリンクするために使用され得る。
【0102】
コードファイルは、それぞれのソースコードファイルから生成された1つまたは複数の中間コードファイルを使用して、マシンコードを含む1つまたは複数の実行可能コードファイルを生成、構築、および/またはリンクすることもできる。
【0103】
104に示すように、コンストラクタ210は、コードファイルのすべてのルーチンを識別するために、コードファイルのそれぞれを分析するために、1つまたは複数のコードファイル分析ツールを適用することができる。
【0104】
例えば、コードファイルがソースコードファイルの1つまたは複数を含むと仮定すると、コンストラクタ210は、プログラム言語、プロセッサアーキテクチャ、および/または、調整されたコードファイルを使用して生成される実行可能ファイルの対象となる実行環境(例えば、オペレーティングシステム)に適用可能なルーチンのニーモニックおよび/またはシンタックスに従って、1つまたは複数のルーチンを識別することができる。このような場合、ルーチンのニーモニックおよび/またはシンタックスは、ソースコードファイルを横断し、事前定義されたルーチンを識別するコンストラクタ210に対して事前定義されてもよい。
【0105】
別の例では、コードファイルが1つまたは複数の中間コードファイルを含むと仮定し、コンストラクタ210は、ELFファイルを分析および分析するためのpythonツール(ライブラリ)である「pyelftools」を利用することができる。「pyelftools」ツールを使用して、コンストラクタ210は、ELFフォーマットの中間ファイルのシンボルテーブルを走査してルーチンのシンボルを識別し、ルーチンのアドレスをそれぞれのコードセクションで検出することができる。コンストラクタ210は、中間コードファイルがターゲットとするプロセッサのアーキテクチャおよび命令セットに従って、中間コードファイルを分析するように適合されてもよく、例えば、ARM、ARM-Thumb、x86、x86-64、PowerISAおよび/または同様のものが適合される。
【0106】
例えば、コンストラクタ210は、中間コードファイルのシンボルテーブルを反復することによってルーチンを識別し、中間コードファイルの各ルーチンに対してコンパイラによって生成されたシンボルを識別し、マッピングすることができる。たとえば、ARM-Thumbアーキテクチャでは、各「.o」オブジェクト(中間)ファイルはELFファイル形式で実装される。コンストラクタ210は、ELF規格における拡張子「.symtab」で割り当てられた「シンボルテーブル」セクション内のエントリを反復することによって、ルーチンシンボルの名前(ニーモニック)を識別することができる。シンボルテーブルは、プログラムのシンボリック定義と参照の位置付けと再配置に必要な情報で構成される。シンボルテーブル内のルーチンの1つに関連する各シンボル・エントリは、ゼロ以外のサイズ・フィールド、タイプ「FUNC」フィールド、および「.o」オブジェクト(中間)ファイル内の「コード」セクションの1つを参照するIndexフィールドを有することを特徴とする。1つまたは複数のシンボルテーブルエントリには、バインド「GLOBAL」フィールドおよび/またはバインド「LOCAL」フィールドをさらに含めることができる。
【0107】
コンストラクタ210は、中間コードファイルの各々をさらに分析して、中間コードファイル内の各ルーチンの開始アドレスを識別することができる。例えば、Thumb関数の開始アドレスが奇数でARM関数の開始アドレスが偶数であるARM-Thumbアーキテクチャでは、シンボルテーブル内の「関数」(ルーチン)シンボルの値は、関数がThumbコードを含むことを指定するために「関数の開始(ルーチン)+1」になる。そのような場合、および任意選択で、他のプロセッサアーキテクチャの同様のケースでは、コンストラクタ210が「.o」オブジェクト(中間)ファイルのシンボルテーブルからルーチン「値」を抽出し、逆の数学演算を実行して、ルーチンの実際の開始アドレス、つまり「値-1」を抽出することができる。
【0108】
別の例では、中間コードファイルを分析するために適用される分析ツールは、マシンコードを、それぞれのアセンブリコードを含むそれぞれの中間コードファイルに変換した後、すなわちマシンコードを逆アセンブルした後に、マシンコードを含む実行可能コードファイルを分析するために適用されてもよい。
【0109】
具体的には、コンストラクタ210がコードファイルを分析して、マルウェアによってエクスプロイトされ、プロセッサの実行(制御)フローの制御を得ることができる1つまたは複数の脆弱なルーチンを(自動的に)識別する。脆弱なルーチンは、典型的にはメモリ操作ルーチン、例えば、メモリコピールーチン、メモリ移動ルーチン、文字列コピールーチン、および/または同様のものであってもよく、これらは、プロセッサをその(通常の)実行パスから流用し、プロセッサの実行フローに対する制御を得るために、マルウェアによって動的メモリをオーバーランするために使用されてもよい。脆弱なルーチンのタイプおよび実装は、プログラム言語、プロセッサアーキテクチャ、および/または調整されたコードファイルを使用して生成される実行可能ファイルの対象となる実行環境に派生、および/または依存してもよい。例えば、実行環境がCまたはC++コーディング言語でコーディングされたオペレーティングシステムを含むと仮定すると、脆弱なルーチンは、例えば、memcpy()、strcpy()および/または同様のものを含むことができる。任意選択で、1つまたは複数の脆弱なルーチンは、例えば、実行環境の開発者、装置のオペレータおよび/またはユーザ、システム、プラットフォーム、および/または、調整されたコードファイルおよび/または同様のものを使用して生成された実行可能ファイルを実行する同様のものなど、1人または複数のエキスパートによって手動で識別される。
【0110】
さらに、コンストラクタ210は、コードファイルを分析して、動的メモリ、特に動的メモリ割り当てに使用されるルーチンを管理するために使用され得る1つまたは複数のメモリ管理ルーチンを(自動的に)識別する。メモリ管理ルーチンは、例えば、メモリブロック割り当てルーチン、メモリブロック割り当て解除ルーチン、メモリブロック再割り当てルーチン、メモリブロック解放ルーチン、メモリブロックフリールーチン、および/または同様のものを含むことができる。脆弱なルーチンの場合と同様に、メモリ管理ルーチンのタイプと実装は、コーディング言語、プロセッサアーキテクチャ、および/または実行可能ファイルが対象とする実行環境からのものであってもよい。例えば、実行環境がオペレーティングシステムを含むと仮定すると、メモリ管理ルーチンは、典型的には、オペレーティングシステムに固有で利用可能なルーチン、関数、呼び出し、および/またはサービス、例えば、malloc()、calloc()、realloc()、free()などであってもよい。メモリ管理ルーチンのタイプと実装は、さらに、選択されたオペレーティングシステムのタイプ、機能等に依存することがある。別の例では、メモリ管理ルーチンの1つまたは複数は、オペレーティングシステムから独立し、および/またはオペレーティングシステムを必要としないスタンドアロンルーチン、プロプライエタリルーチン、および/または同様のものであってもよい。任意選択で、1つまたは複数のメモリ管理ルーチンは、1人または複数のエキスパート、例えば、開発者、オペレータ、ユーザおよび/または同様のものによって、手動で識別される。
【0111】
106に示すように、コンストラクタ210は、メモリ管理ルーチンの1つまたは複数を調整して割り当て追跡コードセグメントを呼び出すことによって、コードファイルを調整することができる。割り当て追跡コードセグメントは、ランタイム間に、調整されたコードファイルを使用して生成された実行可能ファイルを実行するプロセッサによって使用される動的メモリ内のメモリブロックの割り当て(および解放)を追跡するように構成される。実行可能ファイルの実行ランタイムの間に割り当てられるメモリブロックは、典型的に、1つまたは複数のルーチンが使用するために動的メモリ内に割り当てられる。ランタイムに割り当てられたメモリブロックは、マルウェアが悪意のあるコードを実行して、割り当てられたメモリブロックを使用する1つまたは複数の脆弱なルーチンを侵害することによってエクスプロイトされる可能性がある。マルウェアは、1つまたは複数のセキュリティエクスプロイト、例えば、バッファオーバーフロー、バッファオーバーランおよび/または同様のものを適用して、動的メモリを操作し、プロセッサの実行フローに対する制御を得ることがある。
【0112】
従って、動的メモリにおけるメモリブロックの割当のランタイム追跡を適用して、マルウェアによる動的メモリのエクスプロイトを防止するために動的メモリ保護をサポートする手段を容易にする。特に、割り当て追跡は、1つの割り当てられたブロックのメモリ空間から隣接するメモリブロックのメモリ空間まで書き込み動作が超過する可能性があるオーバーランイベントの場合に、境界マーキングの変更(オーバーラン)が検出されるように、動的メモリ内に割り当てられたメモリブロックの境界をマークするように向けられる。隣接するメモリブロックは、1つまたは複数のルーチンによって使用されるために割り当てられたブロック、調整されたコードファイルを使用して生成された実行可能ファイルを実行するプロセッサによって使用されるスタック、データ構造および/または同様のものであってもよい。
【0113】
先に説明したように、動的メモリは大幅に大きくなる可能性があり、従って、プロセッサのランタイム実行中の任意の所与の時点で、極めて多数のブロックを動的メモリ内に割り当てることができる。追跡される割り当てクロックの数を減らすために、例えば、限られた計算リソースを有するローエンド装置のために、動的メモリ内に割り当てられたブロックのサブセットのみの割り当てを追跡するように構成されてもよく、特に、サブセットは、動的メモリ内に割り当てられた最近のブロックの事前定義された数を含む。
【0114】
従って、コンストラクタ210は、例えば、構造、リスト、テーブル、および/または動的メモリ内に直近に割り当てられた定義済みのブロック数をマッピングするような1つまたは複数の最近の割り当てリストを使用して、直近のブロック割り当てを追跡するように割り当て追跡コードセグメントを構成することができる。追跡された最近割り振られたブロックの事前定義された数は、実行可能ファイルを実行するプロセッサの1つまたは複数の動作パラメータおよび/または属性、例えば、動的メモリのサイズ、割り振られたブロックの最大数、割り振られたブロックの最大サイズ、割り振られたブロックの最小サイズ、プロセッサに利用可能なコンピューティングリソース、装置および/またはアプリケーションの性質(すなわち、リアルタイム、ライフクリティカルなど)および/または同様のものに従って設定されてもよい。例えば、限られた計算リソースを有するローエンド装置の場合、割り当てブロックリストに列挙された直近に割り当てられたブロックの数は、比較的制限され得る。別の実施形態では、広範な計算リソースを有するハイエンド装置の場合、割り当てブロックリストに列挙された直近に割り当てられたブロックの数は著しく大きくてもよく、任意選択的に、動的メモリ302に割り当てられたすべてのブロックを含んでもよい。
【0115】
次に、本発明のいくつかの実施形態によれば、動的メモリ保護を適用するために割り当てられた動的メモリブロックをマッピングするために作成および使用される例示的な最近の割り当てリストの概略図である図3を参照する。動的メモリ302は、調整されたコードファイルを使用して生成された実行可能ファイルを実行するプロセッサによってランタイムに使用されてもよい。
【0116】
コンストラクタ210のようなコンストラクタは、割り当て追跡コードセグメントを構成して、1つまたは複数の最近の割り当てリスト304を使用して、動的メモリ302内に割り当てられたメモリブロックの割り当ておよび解放を追跡することができる。割り当て追跡コードセグメントは、プロセッサによる実行可能ファイルのランタイム実行中に発生する任意の割当イベントに応じて、最近の割り当てリスト304を作成、保持、更新するように構成することができる。
【0117】
割り当て追跡コードセグメントによってランタイムに絶えず更新される最近の割り当てリスト304は、動的メモリ302内に特にサブセットが割り当てられたブロックのサブセットをマッピングする複数のエントリを含み、特に、そのサブセットは、直近に割り当てられたブロックの事前定義された数を含む。各エントリは、直近に割り振られたブロックのサブセットのそれぞれ1つに関連付けられ、それぞれの割り当てられたブロックへのポインタ、それぞれの割り振られたブロックのために生成された固有のマーカ、および割り当てられたブロックのサイズを含むことができる。最近の割り当てリスト304は、実行環境に最も適合するように、1つまたは複数の実施形態および/またはモードで構築および/または配備され得る。例えば、複数の最近の割振りリスト304を作成し、マルチスレッディング実行環境で保持することができ、各スレッドは、他のスレッドによって使用される最近の割り当てリスト304とは独立した1つまたは複数の最近の割り当てリスト304を作成し、保持することができる割り当て追跡コードセグメントの独立したインスタンスを実行することができる。別の例では、複数の最近の割り当てリスト304が、例えば、最近の割り当てリスト304の効率的かつ迅速な横断のために、アドレス範囲に基づいて(索引して)、階層構造および/または順次構造に構築されてもよい。
【0118】
割り当て追跡コードセグメント、特にメモリ割り当てルーチンに挿入される割り当て追跡コードセグメントは、新たに割り当てられたブロックをマッピングするために動的メモリ内の別のブロックの割り当てに応じて、最近の割り当てリスト304の1つまたは複数に新しいエントリを作成するように構成されてもよい。割り当て追跡コードセグメントは、新たに割り当てられたブロックに関連する新しいエントリを更新して、新たに割り当てられたブロックへのポインタ、新たに割り当てられたブロックのサイズ、および新たに割り当てられたブロック専用に生成された一意のマーカを含むことができる。割り当て追跡コードセグメントは、1つまたは複数の方法および/または技法を適用して、一意のマーカを生成および/または選択することができ、例えば、乱数発生器を使用し、極めて多数の乱数値、および/または同様のものを含むデータセットから一意のマーカをランダムに選択することなどができる。任意選択的に、割り当て追跡コードセグメントは、最近の割り当てリスト304に列挙された最近に割り当てられたすべてのブロックについて共通マーカを選択する。
【0119】
さらに、新たに割り当てられたブロックの割り当て時に、割り当て追跡コードセグメントは、新たに割り当てられたブロックについて生成された一意のマーカを、新たに割り当てられたブロックの1つまたは複数の境界に、具体的には、新たに割り当てられたブロックの下部境界に、すなわち、新たに割り当てられたブロックの割り当てられた空間の終わりに続くエンドアドレスに挿入することができる。任意選択的に、割り当て追跡コードセグメントは、新たに割り当てられたブロックの上部境界に、すなわち、新たに割り当てられたブロックの割り当てられた空間の開始に先行する開始アドレスに、一意のマーカを挿入する。
【0120】
任意選択で、割り当て追跡コードセグメントは新たに割り当てられたブロックの1つまたは複数の境界、具体的には、新たに割り当てられたブロックの上部境界、すなわち、新たに割り当てられたブロックの割り当てられた空間の開始に先行する開始アドレスに、新たに割り当てられたブロックのサイズを挿入する。従って、サイズは、新たに割り当てられたブロックの上部境界に位置するマーカとして働くことができる。割り当て追跡コードセグメントは、さらに、サイズの暗号化バージョンを開始アドレスに挿入してもよい。
【0121】
コンストラクタ210は、メモリ管理ルーチンを開始した開始(呼び出し)ルーチンによって要求された実際のメモリ空間よりも大きなメモリ空間の割り当て要求を開始するように、割り当て追跡コードセグメントを構成することができる。従って、割り当て追跡コードセグメントは、新たに割り当てられたブロックの終わりに一意のマーカを挿入し、任意選択で、新たに割り当てられたブロックの始めにサイズを挿入するために、追加のメモリ空間を使用することができる。割り当て追跡コードセグメントによって実行されるこのプロセスは、要求されたメモリ空間の正確な量で割り当てられる開始(呼出し)ルーチンに対して完全にトランスペアレントであることが可能である。
【0122】
割り当て追跡コードセグメント、特に、メモリ解放(空き)ルーチンに挿入された割り当て追跡コードセグメントは、解放され、動的メモリ302内の利用可能メモリのプールに戻される、それぞれの解放(空き)ブロックにマッピング(関連付けられた)1つまたは複数のエントリを、最近の割り当てリスト304から削除(除去)するように構成されてもよい。割り当て追跡コードセグメントは、解放されたブロックを解放する要求に応じて、最近の割り当てリスト304からエントリを除去(削除)することができる。
【0123】
割り当て追跡コードセグメント、具体的には、メモリ割り当てルーチンに挿入された割り当て追跡コードセグメントは、最近の割り当てリスト304内の1つまたは複数のエントリを削除(除去)し、従って、動的メモリ302内の別のブロックを割り当てする要求が受信されたときに、最近の割り当てリスト304が満杯になった場合に、関連する割り当てブロックを除去するようにさらに構成されてもよい。割り当て追跡コードセグメントは、除去された、そのエントリが削除されるべき割り当てブロックを選択するための1つまたは複数の方法論および/または実装を適用することができ、例えば、最近の割り当てリスト304内のすべてのエントリによってマッピングされた割り当てブロックの中で少なくとも最近割り当てされたブロックをマッピングするエントリを削除することができる。割り当て追跡コードセグメントは、新たに割り当てられたブロックをマッピングするために、削除されたエントリを使用するように構成されてもよい。削除されたエントリを除去し、その内容をクリアした後、割り当て追跡コードセグメントは、新たに割り当てられたブロックへのポインタ、新たに割り当てられたブロックのサイズ、および新たに割り当てられたブロック専用に生成された新しい一意のマーカを含むように、エントリを更新することができる。
【0124】
割り当て追跡コードセグメントは、さらに、削除されたエントリによってマッピングされた割り当てブロックのメモリ整合性を検証し、マッピングされた割り当てブロックに対してオーバーランが発生していないことを確認するように構成されてもよい。割り当て追跡コードセグメントは、エントリが除去されて新たに割り当てられたブロックのエントリを更新する余地ができた場合、および/またはエントリがそれぞれの割り当てられたブロックの解放(フリー)のために除去された場合に、マッピングされた割り当てられたブロックを検証するように構成されてもよい。
【0125】
割り当て追跡コードセグメントは、削除されたエントリによってマッピングされた割り当てブロックのメモリ空間から動的メモリ302内の隣接ブロックのメモリ空間まで、を超える1つまたは複数の書込動作を検出することによって、削除されたエントリによってマッピングされた割り当てブロック内のオーバーランを検出することができる。割り当てられたブロックのメモリ空間を超える書き込み動作は、削除されたエントリによってマッピングされた割り当てられたブロックの終わりに挿入された一意のマーカを自然に変更(オーバーラン)する。従って、割り当て追跡コードセグメントは、削除されたエントリによってマッピングされた割り当てられたブロックの上部および/または下部境界に挿入された一意のマーカと、それぞれの削除されたエントリに含まれる一意のマーカとを比較することによって、一意のマーカの変更をチェックすることによってオーバーランを検出することができる。割り当て追跡コードセグメントは、削除されたエントリから抽出されたポインタを使用して、それぞれの割り当てられたブロックの最上位境界に位置するマーカのメモリ位置を識別することができる。
【0126】
割り当てられたそれぞれのブロックの下部境界に位置するマーカのメモリ位置を識別するために、割り当て追跡コードセグメントは、サイズ削除されたエントリと連結された削除されたエントリから抽出されたポインタを使用して、下部境界にあるメモリ位置のメモリオフセットを計算することができる。
【0127】
一意のマーカの値が一致する場合、割り当て追跡コードセグメントは、オーバーランが発生しておらず、割り当てられたブロックが有効であると判定することができる。ただし、一致しない場合、割り当て追跡コードセグメントは、オーバーランイベントがマルウェアによって発生した可能性があると判断し、1つまたは複数の事前定義された動作を開始する。事前定義された動作は、例えば、プロセッサの実行をクラッシュさせ、プロセッサの実行を停止させ、プロセッサを事前定義されたアドレスに分岐させ、破損した動的メモリによって標的とされる潜在的に悪意のあるコード命令の少なくとも1つをプロセッサが実行するのを防ぎ、動的メモリ破損(動的メモリオーバーラン)および/または同様のもの1つまたは複数の指標および/または警告を生成することを含み得る。事前定義された動作は、実行フローの1つまたは複数のパラメータ、例えば、プロセッサアーキテクチャ、各ルーチンの重大度および/または重要度、ユーザ定義パラメータおよび/または同様のものに従って選択することができる。
【0128】
さらに、新たに割り当てられたブロックのエントリを更新するための余地を作るために、最近の割り当てリスト304から割り当てられたブロックを除去し、そのエントリを除去(削除)するとき、割り当て追跡コードセグメントは、除去された割り当てられたブロックの終了アドレス(下部境界)に挿入された一意のマーカをグローバルマーカで置き換えることができる。従って、グローバルマーカは、まだ割り当てられている(解放されていない)が最近の割り当てリスト304にもはや列挙されていないすべての割り当てられたブロックに共通である。割り当て追跡コードセグメントは、グローバルマーカを生成および/または選択するために、例えば、乱数発生器を使用して、極めて多数の乱数値を含むデータセットから一意のマーカをランダムに選択するなど、1つまたは複数の方法および/または技法を適用することができる。もはや列挙されていない割り当てられた複数のブロックに共通であるが、グローバルマーカは、例えば、実行可能ファイルを実行するプロセッサのすべての起動シーケンス(ブート)の間に、割り当て追跡コードセグメントの最初の呼び出しの間に、実行可能ファイル等を実行するプロセッサによる1つまたは複数のプロセスの開始および/またはインスタンス化の間に、ランダムに選択される、過渡的かつ頻繁に置換されてもよい。
【0129】
任意選択的に、新たに割り当てられたブロックのための余地を作るために、最近の割り当てリスト304から割り当てられたブロックを除去し、そのエントリを除去(削除)するとき、割り当て追跡コードセグメントは、除去された割り当てられたブロックのサイズを、除去された割り当てられたブロックの開始アドレス(上部境界)にさらに挿入することができる。これは、当然ながら、除去された割り当てブロックが最初に割り当てられたときに、サイズがすでに上部境界に挿入されていない場合に行われる。
【0130】
任意選択的に、メモリ解放(フリー)ルーチンに挿入された割り当て追跡コードセグメントは、そのような非リスト化割り当てブロックを解放する要求に応じて、最近の割当リスト304に列挙されていない1つまたは複数の割り当てブロックを検証するように構成される。割り当て追跡コードセグメントは、グローバルマーカが挿入された位置、すなわち境界、具体的には解放されるべきブロックの終わりと、グローバルマーカとの間の一致を検証することによって、解放されるべき列挙されていない割り当てられた各ブロックにおけるオーバーランを検出することができる。下部境界に位置するグローバルマーカを検索するために、割り当て追跡コードセグメントは、まず、解放されるべきブロックの終了アドレス(下部境界)を計算する必要がある。このために、割り当て追跡コードセグメントは、解放しようとしている割り当てブロックの解放用に受け取ったポインタを用いて、解放しようとしている割り当てられたブロック(ポインタが指す)の先頭境界に位置する解放しようとしているブロックのサイズを取り出してもよい。次に、解放されるべき割り当てられたブロックの下部境界へのオフセットとして働くサイズは、グローバルマーカが挿入された下部境界からデータを取り出すために、割り当て追跡コードセグメントによって使用されてもよい。一致する場合には、割り当て追跡コードセグメントは、オーバーランが発生していない、従って、解放されるべき割り当てブロックは有効である、と判定することができる。しかしながら、一致しない場合には、割当追跡コードセグメントは、オーバーランイベントが発生したと判断し、1つまたは複数の事前定義された動作を開始することができる。
【0131】
再び図1および図2を参照する。
【0132】
コンストラクタ210は、それぞれのメモリ管理ルーチンの通常の機能の実行の前、および/または通常の機能の実行の完了後に、割り当て追跡コードセグメントが呼び出されるように、それぞれの調整されたメモリ管理ルーチンの開始および/または終了時に割り当て追跡コードセグメントを呼び出すように、メモリ管理ルーチンを調整してもよい。コンストラクタ210は、メモリ管理ルーチンを、調整されたメモリ管理ルーチンの開始時に割り当て追跡コードセグメントを起動するように調整し、割当追跡コードセグメントを設定して、メモリ割り当てブロックの増加を要求し、一意のマーカを挿入するための余分な空間と、任意選択で割り当てられたブロック境界におけるサイズを有するようにする。コンストラクタ210は、メモリ管理ルーチンをさらに調整して、調整されたメモリ管理ルーチンの終わりに割り当て追跡コードセグメントを起動し、割り当て追跡コードセグメントを構成して、割当ブロックへのポインタを受信し、そのアドレスを決定した後に、割り当てブロック境界の境界にある余分な空間に一意のマーカと任意選択でサイズを挿入することができる。
【0133】
コンストラクタ210は、コードファイルのタイプに従って選択され得る1つまたは複数のコード挿入(フッキング)方法、技術および/または実装を使用して、割り当て追跡コードセグメントをコードファイルに追加してもよい。
【0134】
例えば、調整されたコードファイルがソースコードファイルである場合、コンストラクタ210は、メモリ管理ルーチンの1つまたは複数を調整して、調整されたメモリ管理ルーチンの最初および/または最後に割り当て追跡コードセグメントを起動することができる。さらに、コンストラクタ210は、実行環境に固有の1つまたは複数のメモリ管理ルーチン、例えば、ターゲットプロセッサによって実行されるオペレーティングシステム、例えば、malloc()、calloc()、free()および/または同様のものを任意選択的で調整することができる。これらの固有のメモリ管理ルーチンがソースコード形式で利用可能であると仮定すると、コンストラクタ210は、これら固有のメモリ管理ルーチンの1つまたは複数を調整して、その開始および/または終了時に割り当て追跡コードセグメントを起動することができる。変更を調整されたソースファイルに適用して、メモリ管理ルーチンの1つまたは複数に割り当て追跡コードセグメントを含めるために、コンストラクタ210は、調整されたソースコードファイルの構築に1つまたは複数のソースコードファイル、共有ライブラリ、静的アーカイブおよび/または同様のものを追加することができる。
【0135】
別の例では、調整されたコードファイルが中間コードファイルである場合、コンストラクタ210は、それぞれのメモリ管理ルーチンの呼び出し(コール)の直後に割り当て追跡コードセグメントを呼び出すように構成されたトランポリン分岐関数を挿入してもよい。コンストラクタ210は、トランポリン分岐機能を追加して、それぞれのメモリ管理ルーチンの呼び出しをトランポリン分岐機能の呼び出しと置き換えることができる。コンストラクタ210は、シンボルテーブル内のそれぞれのメモリ管理ルーチンのアドレスをトランポリン機能のアドレスに置き換えることによってこれを適用することができる。トランポリン分岐機能は、最初に割り当て追跡コードセグメントを呼び出すように構成することができる。割り当て追跡コードセグメントの実行が完了すると、トランポリン分岐機能は、それぞれのメモリ管理ルーチンを呼び出すことができる。さらに、トランポリン分岐機能は、それぞれのメモリ管理ルーチンの実行完了後に、割り当て追跡コードセグメントをもう一度呼び出すことができる。中間コードファイルに適用可能な別の実施形態では、コンストラクタ210は、1つまたは複数の調整されたメモリ管理ルーチンの最初および/または最後に分岐命令(例えばBL)を追加して、それぞれの調整されたメモリ管理ルーチンの実行の前および/または後に、それぞれ調整されたメモリ管理ルーチン内から割り当て追跡コードセグメントを呼び出すことができる。変更を調整された中間ファイルに適用して、メモリ管理ルーチンの1つまたは複数に割り当て追跡コードセグメントを含めるために、コンストラクタ210は、調整された中間コードファイルの構築に1つまたは複数の中間コードファイル、共有ライブラリ、静的アーカイブおよび/または同様のものを追加することができる。
【0136】
別の例では、調整されたコードファイルが実行可能コードファイルである場合、コンストラクタ210は、実行可能コードファイルがターゲットプロセッサによってロードされるときに、メモリ管理ルーチンの1つまたは複数を置き換えるように構成された1つまたは複数の動的に事前ロードされたライブラリを作成することによって、割り当て追跡コードセグメントを追加することができる。コンストラクタ210は、実行環境に固有の1つまたは複数のメモリ管理ルーチン、例えば、ターゲットプロセッサによって実行されるオペレーティングシステム、例えば、malloc()、calloc()、free()および/または同様のものを置換するために、動的に事前ロードされたライブラリを適用することができる。そのような固有のメモリ管理ルーチンは、典型的には固有のメモリ管理ルーチンを置き換えるために、動的に事前ロードされたライブラリによってマッピングされ得る、1つまたは複数の動的にロード可能な共有ライブラリにおいて提供され得る。置換メモリ管理ルーチンの各々は、それぞれの固有のメモリ管理ルーチンの実行に先立って、および/または後に、割当追跡コードセグメントを起動するように構成することができる。例えば、コードファイルがLinux(登録商標)オペレーティングシステム構築の一部であると仮定すると、コンストラクタ210は、例えば.soファイルに提供される1つまたは複数の動的に事前ロードされたライブラリを作成することができ、これは、共有ライブラリ、動的に事前ロードされたライブラリへの1つまたは複数のパスを含む「LD_PRELOAD」環境変数を使用して実行時に事前ロードされる。
【0137】
さらに、コンストラクタ210は、実行環境(例えば、オペレーティングシステム)に固有ではないコードファイルのプログラマ(開発者)によって作成された1つまたは複数のメモリ管理ルーチンのための割り当て追跡コードセグメントを起動するように実行可能コードファイルを調整することができる。プログラマは、固有のメモリ管理ルーチンのために典型的に行われるように、1つまたは複数の動的にロード可能な共有ライブラリ内に、非固有のメモリ管理ルーチンの1つまたは複数を実装することができる。このような場合、コンストラクタ210は、実行可能コードファイルがターゲットプロセッサによってロードされるときに、非固有のメモリ管理ルーチンの1つまたは複数を置き換えるように構成された1つまたは複数の動的に事前ロードされたライブラリを作成することによって、割り当て追跡コードセグメントを追加することができる。しかしながら、プログラマは、例えばメインプログラムの一部として、動的にロード可能な共用ライブラリを介してロードされない1つまたは複数の非固有のメモリ管理ルーチンを実装してもよい。この場合、コンストラクタ210は、適切な位置、すなわち、非固有のメモリ管理ルーチンの開始および/または終了に、分岐命令を非固有のメモリ管理ルーチンに挿入することによって、割り当て追跡コードセグメントを追加し、その起動を構成することができる。このために、コンストラクタ210は、まず、実行可能コードファイルを分析し、マシンコードをそれぞれのアセンブリコードに変換する、すなわち、マシンコードを逆アセンブルすることができる。アセンブリコードに変換された後、コンストラクタ210は、中間コードファイルに対して行われるように割り当て追跡コードセグメントをフックおよび起動するためのメモリ管理ルーチンを調整することができ、具体的には、調整された非固有のメモリ管理ルーチンの最初および/または最後に分岐命令(たとえばBL)を追加して、調整されたそれぞれの非固有のメモリ管理ルーチン内から割り当て追跡コードセグメントを起動することができる。
【0138】
追加されたコードセグメントを調整されたコードファイル、具体的には調整された中間コードファイルに挿入する前に、コンストラクタ210は、追加されたコードセグメントをホストするために十分な利用可能なリソース、例えば、記憶装置空間および/または同様のものがあることを検証することができる。しかしながら、追加されたコードセグメントは典型的には非常に単純な論理を含むので、追加されたコードセグメントのフットプリントは著しく小さく、従って、それらを調整された中間コードファイルに統合する際に制限を提示しない。
【0139】
前述のように、いくつかのエクスプロイトシナリオでは、マルウェアは、1つまたは複数の脆弱なルーチンが使用するために事前に割り当てられたメモリブロックをエクスプロイトし得る。従って、事前に割り当てられたブロックは、マルウェアによるエクスプロイトの影響を非常に受けやすい。しかしながら、これらの事前に割り当てられたブロックは直近に割り当てられたブロックではない場合があるので、事前に割り当てられたブロックは最近の割り当てリスト304に列挙されない場合がある。
【0140】
従って、コンストラクタ210は、割り当て追跡コードセグメントを構成して、ランタイムで、1つまたは複数の脆弱なルーチンによる使用のために事前に割り振られた1つまたは複数の利用の影響を受けやすいブロックの割り当て(および解放)をさらに追跡することができる。利用の影響を受けやすいブロックの割り当ての追跡は、上述したように、直近に割り当てられたブロックの割り当ての追跡と非常に近似して、割り当て追跡コードセグメントによって行われる。1つまたは複数の脆弱なルーチンによる使用のために潜在的に割り当てられる利用の影響を受けやすいブロックは、本明細書で上述したように、コードファイルの分析に基づいて手動で定義および/または自動的に識別することができる。例えば、コンストラクタ210は、コードファイルを分析して、メモリ管理ルーチンによって行われる大きなメモリブロック割り当てを識別することができる。そのような大きな割り振られたブロックは、マルウェアによるエクスプロイトの影響を非常に受けやすい可能性があり、従って、コンストラクタは、そのような大きな割り当てられたブロックをエクスプロイトの影響を受けやすいブロックとして指定することができる。別の実施形態では、エクスプロイトの影響を受けやすいブロックは、プログラマ、開発者および/またはコードファイルのユーザによって手動で識別されてもよい。
【0141】
割り当て追跡コードセグメントは、実行時に、動的メモリ302内に割り当てられたメモリブロックのサブセットを列挙する最近の割り当てリスト304のような、影響を受けやすいブロックリストを作成、保持、および/または更新するように構成されてもよい。特に、割り当て追跡コードセグメントは、1つまたは複数の脆弱なルーチンによる使用のために割り当てられた、識別された利用の影響を受けやすいブロックのうちの少なくともいくつかを列挙するために、影響を受けやすいブロックリストを更新する。影響を受けやすいブロックリストは、最近の割り当てリスト304のエントリに近似する複数のエントリを含むことができ、各エントリは、サブセットのそれぞれの利用の影響を受けやすいブロックに関連付けられ、それぞれのブロックへのポインタ、それぞれのブロックのサイズ、およびそれぞれのブロックについて生成された一意のマーカを備える。割り当て追跡コードセグメントは、最近割り当てられたブロックについて説明したように、動的メモリ302内のそれぞれの利用の影響を受けやすいブロックの境界に、一意のマーカ、および任意選択で各利用の影響を受けやすいブロックのサイズを挿入するようにさらに構成することができる。
【0142】
108に示すように、コンストラクタ210は、1つまたは複数の脆弱なルーチンを調整してメモリ整合性コードセグメントを呼び出すことによって、コードファイルを調整することができる。メモリ整合性コードセグメントは、それぞれの脆弱なルーチンの実行完了後に、動的メモリ302内に割り当てられたメモリブロックのメモリ整合性をランタイムにチェックし、検証するように構成される。特に、メモリ整合性コードセグメントは、直近に割り当てられたブロックのサブセットと、任意選択でエクスプロイトの影響を受けやすいブロックのサブセットのメモリ整合性をチェックし、検証するように構成される。
【0143】
メモリ整合性コードセグメントは、割り当てられたブロックにオーバーランが発生していないことを確認することによって、割り当てられたブロックのメモリ整合性を検証するように構成され得る。メモリ整合性コードセグメントは、割り当てられたブロックのメモリ空間から動的メモリ302内の隣接するブロックのメモリ空間までを超える1つまたは複数の書き込み動作を検出することによって、割り当てられたブロック内のオーバーランを検出することができる。割り当てられたブロックのメモリ空間から超える書き込み動作は、割り当てられたブロックの境界をオーバーランすることがあり、従って、境界メモリ位置に挿入されたマーカをオーバーラン(変更)することがある。
【0144】
コンストラクタ210は、メモリ整合性コードセグメントの実行時動作の中断を防止するために、メモリ整合性コードセグメントの呼び出し時にコンテキストスイッチおよび/または割り込みを無効にするように、メモリ整合性コードセグメントをさらに構成してもよい。このような中断は、メモリ整合性コードセグメントの動作に介入するためにマルウェアによって適用され、メモリ整合性コードセグメントのオーバーラン状態の検出の失敗につながる可能性がある。従って、いったん呼び出されると、ランタイムに、メモリ整合性コードセグメントは、割り当てられたブロックの妥当性検査が完了するまで、コンテキストの切り替えおよび/または割り込みを無効にする。
【0145】
ランタイムに、メモリ整合性コードセグメントは、最近の割り当てリスト304を横断し、最近の割当リスト304に列挙された直近の割り当てブロックの各々のメモリ整合性を検証することによって、直近の割り当てブロックにおけるオーバーランを検出することができる。メモリ整合性コードセグメントは、境界におけるメモリ位置に挿入された一意のマーカの値、具体的には最近割り当てられた各ブロックの末尾に挿入された一意のマーカの値と、最近の割り当てリスト304の各エントリに含まれる一意のマーカの値とを比較することによって、直近に割り当てられたブロックのメモリ整合性を検証することができる。メモリ整合性コードセグメントは、最近の割り当てリスト304に列挙された割り当てられたブロックの上部境界および/または下部境界に挿入されたマーカ(一意のマーカまたはサイズであってもよい)を比較してもよい。上部境界に挿入されたマーカは、メモリ整合性コードセグメントがそれぞれの最近割り当てられたブロックに続く1つまたは複数の割り当てられたブロックへの順方向オーバーランを検出することを可能にし、一方、下部境界に挿入されたマーカは、メモリ整合性コードセグメントがそれぞれの最近割り当てられたブロックに先行する1つまたは複数の割り当てられたブロックへの逆方向オーバーランを検出することを可能にすることができる。前述のように、割り当てられたブロックのうちの1つまたは複数の上部境界において、割り当て追跡コードセグメントによって挿入されたマーカがそのサイズである場合、割り当て追跡コードセグメントは、メモリ整合性コードセグメントは、それを検証する前に、暗号化されたサイズを最初に復号する必要があるように、サイズをさらに暗号化することができる。これにより、マルウェアが開始アドレス(最上位境界)に配置されたサイズを、本物であり、かつ/または有効であるように見える方法で操作することを防ぐことができる。
【0146】
最近の割り当てリスト304の各エントリに対して、メモリ整合性コードセグメントは、それぞれのエントリから抽出されたポインタを使用して、それぞれの割り当てられたブロックの最上位境界に位置するマーカのメモリ位置を識別することができる。それぞれの割り当てられたブロックの下部境界に位置するマーカのメモリ位置を識別するために、メモリ整合性コードセグメントは、それぞれのエントリから抽出され、それぞれのエントリから抽出されたサイズを組み合わされたポインタを使用して、下部境界にあるメモリ位置のメモリオフセットを計算する。
【0147】
メモリ整合性コードセグメントは、影響を受けやすいブロックリストをトラバースし、影響を受けやすいブロックリストに列挙された利用の影響を受けやすい割り当てブロックの各々のメモリ整合性を検証することによって、利用の影響を受けやすい割り当てブロックにおけるオーバーランをさらに検出することができる。メモリ整合性コードセグメントは、利用の影響を受けやすい割り当てブロックの各々の終わりに挿入された一意のマーカと、影響を受けやすいブロックリスト内のそれぞれのエントリに含まれる一意のマーカとを比較することによって、利用の影響を受けやすい割り当てブロックのメモリ整合性を検証することができる。
【0148】
一意のマーカの値が一致した場合、メモリ整合性コードセグメントはオーバーランが発生しておらず、割り当てられたブロックが有効であると判断する。ただし、一致しない場合、メモリ整合性コードセグメントは、オーバーランイベントがマルウェアによって発生した可能性があると判断し、事前定義された動作の1つまたは複数を開始する。
【0149】
コンストラクタ210は、それぞれの脆弱なルーチンの通常の機能の実行の完了後にメモリ整合性コードセグメントが呼び出されるように、それぞれの脆弱なルーチンの終わりにメモリ整合性コードセグメントを呼び出すようにコードファイルを調整してもよい。
【0150】
任意選択的に、コンストラクタ210は、コードファイルを調整して、1つまたは複数の脆弱なルーチンの呼び出しおよび実行前にメモリ整合性コードセグメントを呼び出し、直近の割り当てリスト304に列挙されている1つまたは複数の直近に割り当てられたブロックのメモリ空間から超過する可能性のある、それぞれの脆弱なルーチンによって実行される潜在的な差し迫った書き込み操作を検出する。メモリ整合性コードセグメントは、処理のためにそれぞれの脆弱なルーチンに転送されるアドレス範囲を分析することによって、超過書き込み動作を検出するように構成されてもよい。
【0151】
ランタイムに、分析に基づいて、メモリ整合性コードは、転送されたアドレス範囲が割り当てられたブロックリストに列挙された1つまたは複数のブロックの境界の1つまたは複数を横切るかどうかを決定することができる。メモリ整合性コードセグメントが、書き込みオーバーランが差し迫っていると判断した場合、メモリ整合性コードセグメントは、事前定義された動作の1つまたは複数を開始し得る。
【0152】
任意選択的に、コンストラクタ210は、割り当てられたブロックリストをトラバースし、割り当てられたブロックリストに列挙された割り当てられたブロックのいずれにもオーバーランが発生しなかったことを検証するために、脆弱なルーチンの実行とは無関係に、メモリ整合性コードセグメントを事前編集して呼び出すようにコードファイルを調整する。メモリ整合性コードセグメントを起動することは、一つ以上のモードおよび/または実装の中で適用されてもよい。例えば、コンストラクタ210は、コードファイル内の1つまたは複数のルーチンを調整して、このトリガルーチンの実行時にメモリ整合性コードセグメントの呼び出しをトリガすることができる。別の実施形態では、コンストラクタ210は、1つまたは複数のルーチンをコードファイルに追加して、メモリ整合性コードセグメントの呼び出しを周期的におよび/または要求に応じてトリガすることができる。
【0153】
コンストラクタ210は、コードファイルのタイプに従って選択され得るコード挿入(フッキング)方法、技術および/または実装のうちの1つまたは複数を使用して、メモリ整合性コードセグメントをコードファイルに追加してもよい。
【0154】
例えば、調整されたコードファイルがソースコードファイルである場合、コンストラクタ210は、1つまたは複数の脆弱なルーチンを調整し、調整された脆弱なルーチンの実行後にメモリ整合性コードセグメントを呼び出し得る。変更を調整済みソースファイルに適用して、1つまたは複数の脆弱なルーチンにメモリ整合性コードセグメントを含めるために、コンストラクタ210は、調整済みソースコードファイルの構築に1つまたは複数のソースコードファイル、共有ライブラリ、静的アーカイブおよび/または同様のものを追加することができる。
【0155】
別の実施形態では、調整されたコードファイルが中間コードファイルである場合、コンストラクタ210は、それぞれの脆弱なルーチンの実行完了直後、すなわち、脆弱なルーチンを呼び出した開始(呼び出し)ルーチンに戻る前に、メモリ整合性コードセグメントを呼び出すように構成されたトランポリン分岐関数を挿入してもよい。コンストラクタ210は、それぞれの脆弱なルーチンの代わりに、呼び出されるトランポリン分岐関数を追加することができる。コンストラクタ210は、シンボルテーブル内のそれぞれの脆弱なルーチンのアドレスを、トランポリン機能のアドレスに置き換えることによってこれを適用することができる。トランポリン分岐関数が最初にそれぞれの脆弱なルーチンを起動し、それぞれの脆弱なルーチンがその実行を完了した後、トランポリン分岐関数がメモリ整合性コードセグメントを起動するように構成することができる。中間コードファイルに適用可能な別の実施形態では、コンストラクタ210は、脆弱なルーチンの実行の完了後に、調整された脆弱なルーチン内からメモリ整合性コードセグメントを呼び出すために、調整された脆弱なルーチンの最後に分岐命令(例えばBL)を追加してもよい。変更を調整された中間ファイルに適用して、1つまたは複数の脆弱なルーチンにメモリ整合性コードセグメントを含めるために、コンストラクタ210は、1つまたは複数の中間コードファイル、共有ライブラリ、静的アーカイブおよび/または同様のものを、調整された中間コードファイルの構築に追加することができる。
【0156】
別の実施態様では、調整されたコードファイルが実行可能コードファイルである場合、コンストラクタ210は、実行可能コードファイルがターゲットプロセッサによってロードされるときに、脆弱なルーチンの1つまたは複数を置き換えるように構成された1つまたは複数の動的に事前ロードされたライブラリを作成することによって、メモリ整合性コードセグメントを追加してもよい。特に、コンストラクタ210は、実行環境に固有の1つまたは複数の脆弱なルーチン、例えば、ターゲットプロセッサによって実行されるオペレーティングシステム、例えば、memcpy()、strcpy()を置き換えるために、動的に事前ロードされたライブラリを適用することができる。このような固有の脆弱なルーチンは、典型的には、固有の脆弱なルーチンを置き換えるために、動的に事前ロードされたライブラリによってマッピングされてもよい、1つまたは複数の動的にロード可能な共有ライブラリに提供されてもよい。置換脆弱なルーチンの各々は、それぞれの固有の脆弱なルーチンの実行完了後にメモリ整合性コードセグメントを起動するように構成されてもよい。例えば、コードファイルがLinuxオペレーティングシステム構築の一部であると仮定すると、コンストラクタ210は、例えば.soファイルに提供される1つまたは複数の動的に事前ロードされたライブラリを作成することができ、これは、動的にライブラリを事前ロードされた共有ライブラリへの1つまたは複数のパスを含む「LD_PRELOAD」環境変数を使用して、ランタイムに事前ロードされ得る。
【0157】
さらに、コンストラクタ210は、実行環境(例えば、オペレーティングシステム)に固有ではないコードファイルのプログラマ(開発者)によって作成された1つまたは複数の脆弱なルーチンのために、メモリ整合性コードセグメントを起動するように実行可能コードファイルを調整することができる。プログラマは、固有の脆弱なルーチンに対して通常実行されるように、1つまたは複数の動的にロード可能な共有ライブラリに、非固有の脆弱なルーチンの1つまたは複数を実装することができる。このような場合、コンストラクタ210は、実行可能コードファイルがターゲットプロセッサによってロードされるときに、非固有の脆弱なルーチンの1つまたは複数を置き換えるように構成された1つまたは複数の動的に事前ロードされたライブラリを作成することによって、メモリ整合性コードセグメントを追加することができる。しかしながら、プログラマは、例えばメインプログラムの一部として、動的にロード可能な共用ライブラリを介してロードされない非固有の1つまたは複数の脆弱なルーチンを実装することもできる。この場合、コンストラクタ210は、非固有の脆弱なルーチンの最後に非固有の脆弱なルーチンに分岐命令を挿入することによって、メモリ整合性コードセグメントを追加し、その呼び出しを構成することができる。このために、コンストラクタ210は、まず実行可能コードファイルを分析し、マシンコードをそれぞれのアセンブリコードに変換する、すなわち、マシンコードを逆アセンブルすることができる。アセンブリコードに変換された後、コンストラクタ210は、中間コードファイルに対して行われるようにメモリ整合性コードセグメントをフックして起動するための脆弱なルーチンを調整することができ、具体的には、調整された脆弱性ルーチンの実行完了後に、調整された非固有のそれぞれの脆弱なルーチン内からメモリ整合性コードセグメントを呼び出すために、調整された非固有の1つまたは複数の脆弱なルーチンの最後に分岐命令(例えばBL)を追加することができる。
【0158】
任意選択的に、コンストラクタ210は、中間コードファイル内で識別された1つまたは複数のクリティカルルーチンを調整して、クリティカルルーチンの1つを実行する前に動的メモリ302が侵害されていないことを検証するために、それらの実行の前にメモリ整合性コードセグメントを起動する。各クリティカルルーチンは、実行されると、潜在的に危険な、危険な、および/または有害な結果および/または結果につながる可能性がある方法で、装置の意図された挙動を危うくする可能性がある。特に、ルーチンは、危険にさらされた意図された行動が1つまたは複数の他の人々、例えば、人々(例えば、ユーザ、患者、オペレータなど)、装置、システム、および/または同様のものとのやり取りに関連する場合、危険であると見なされ、および/または定義され得、その結果、危険にさらされた意図された行動は、他の人々に影響を与える。例えば、実行可能ファイルが、インスリンポンプの動作を制御するプロセッサによって実行されると仮定する。このような場合、インスリン注射を制御するルーチンは、クリティカルであると定義され得る。別の実施形態では、実行可能ファイルがハートペースメーカーの動作を制御するプロセッサによって実行されると仮定する。このような場合、電気パルス発生を制御するルーチンは、クリティカルと定義され得る。別の実施形態では、実行可能ファイルが車両ブレーキングシステムの動作を制御するプロセッサによって実行されると仮定する。そのような場合、車両のブレーキに対するブレーキ命令を開始するルーチンは、クリティカルとして定義され得る。
【0159】
クリティカルルーチンの1つまたは複数は、1人以上のユーザ、エキスパート、オペレータおよび/または同様のものによって手動で定義することができる。さらに、追加的、および/または代替的に、クリティカルなルーチンの1つまたは複数は、中間コードファイルの分析に基づいて、そのように自動的に定義されてもよい。
【0160】
コンストラクタ210は、コードファイルを調整して、それぞれのクリティカルルーチンの実行の前にメモリ整合性コードセグメントを呼び出すことができる。コンストラクタ210は、コードファイルのタイプに従って選択され得るコード挿入(フッキング)方法、技術および/または実装のうちの1つまたは複数を使用して、メモリ整合性コードセグメントをコードファイルに追加してもよい。
【0161】
例えば、調整されたコードファイルがソースコーファイルである場合、コンストラクタ210は、調整されたクリティカルルーチンの実行の前に、1つまたは複数のクリティカルルーチンを調整してメモリ整合性コードセグメントを呼び出すことができる。
【0162】
別の実施形態では、調整されたコードファイルがソースコードファイルである場合、コンストラクタ210は、それぞれのクリティカルルーチンの実行の直前に、すなわち、開始(呼び出し)ルーチンからのそれぞれのクリティカルルーチンの呼び出し時に、メモリ整合性コードを呼び出すように構成されたトランポリン分岐関数を挿入してもよい。コンストラクタ210は、シンボルテーブル内のそれぞれのクリティカルルーチンのアドレスをトランポリン機能のアドレスに置き換えることによってこれを適用することができる。メモリ整合性コードが実行されると、トランポリン分岐関数に戻って、それぞれのクリティカルルーチンを呼び出すことができる。中間コードファイルに適用可能な別の実施形態では、コンストラクタ210は、クリティカルルーチンの実行の前に、調整されたクリティカルルーチン内からメモリ整合性コードセグメントを呼び出すために、調整されたクリティカルルーチンの先頭に分岐命令(例えばBL)を追加するために、クリティカルルーチンの1つまたは複数を調整してもよい。
【0163】
別の実施形態では、調整されたコードファイルが実行可能コードファイルである場合、コンストラクタ210は、実行可能コードファイルがターゲットプロセッサによってロードされるときに、1つまたは複数のクリティカルなルーチンを置き換えるように構成された1つまたは複数の動的に事前ロードされたライブラリを作成することによって、メモリ整合性コードセグメントを追加してもよい。特に、コンストラクタ210は、実行環境、例えば、クリティカル装置および/または同様のものに接続されたI/Oインターフェースを制御する装置ドライバなど、ターゲットプロセッサによって実行されるオペレーティングシステムに固有の1つまたは複数のクリティカルなルーチンを置き換えるために、動的に事前ロードされたライブラリを適用することができる。このような固有のクリティカルルーチンは、典型的には、固有の脆弱なルーチンを置き換えるために、動的に事前ロードされたライブラリによってマッピングされてもよい、1つまたは複数の動的にロード可能な共有ライブラリで提供されてもよい。クリティカルルーチンのそれぞれは、それぞれのクリティカルルーチンの実行の前に、メモリ整合性コードセグメントを起動するように構成することができる。例えば、コードファイルがLinuxオペレーティングシステム構築の一部であると仮定すると、コンストラクタ210は、例えば.soファイルに提供される1つまたは複数の動的に事前ロードされたライブラリを作成することができ、これは、動的にライブラリに事前ロードされた共有ライブラリへの1つまたは複数のパスを含む、「LD_PRELOAD」環境変数を使用してランタイムに事前ロードされ得る。
【0164】
追加的に、コンストラクタ210は、実行環境(例えば、オペレーティングシステム)に固有ではないコードファイルのプログラマ(開発者)によって作成された1つまたは複数のクリティカルなルーチンのためにメモリ整合性コードセグメントを起動するように、実行可能コードファイルを調整することができる。プログラマは、固有のクリティカルルーチンに対して典型的に行われるように、1つまたは複数の動的にロード可能な共有ライブラリ内に非固有のクリティカルルーチンの1つまたは複数を実装することができる。このような場合、コンストラクタ210は、実行可能コードファイルがターゲットプロセッサによってロードされるときに、非固有のクリティカルルーチンの1つまたは複数を置き換えるように構成された1つまたは複数の動的に事前ロードされたライブラリを作成することによって、メモリ整合性コードセグメントを追加することができる。しかしながら、プログラマは、例えばメインプログラムの一部として、動的にロード可能な共用ライブラリを介してロードされない、非固有のクリティカルなルーチンの1つまたは複数を実装することもできる。この場合、コンストラクタ210は、非固有のクリティカルルーチンの開始時に、非固有のクリティカルルーチンに分岐命令を挿入することによって、メモリ整合性コードセグメントを追加し、その呼び出しを構成することができる。このために、コンストラクタ210は、まず実行可能コードファイルを分析し、マシンコードをそれぞれのアセンブリコードに変換する、すなわち、マシンコードを逆アセンブルすることができる。アセンブリコードに変換された後、コンストラクタ210は、中間コードファイルに対して行われるようにメモリ整合性コードセグメントをフックして起動するためのクリティカルルーチンを調整することができ、具体的には、調整された1つまたは複数の非固有のクリティカルルーチンの先頭に分岐命令(例えばBL)を追加して、調整されたクリティカルルーチンの実行前に、それぞれの調整された非固有のクリティカルルーチン内からメモリ整合性コードセグメントを呼び出すことができる。
【0165】
110に示されるように、コンストラクタ210は、データ、命令、シンボルテーブル、および/または割り当て追跡コードセグメント、メモリ整合性コードセグメント、最近の割り当てリスト304、影響を受けやすいブロックリスト、および/またはマーカを含むように行われた中間コードファイルの調整によって影響を受ける中間コードファイルの1つまたは複数の属性を修正する。
【0166】
例えば、中間コードファイルのコンパイル中に定義された中間コードファイル内の1つまたは複数の調整されたルーチンのレイアウトは、追加されたコードセグメント、リストおよび/またはマーカの挿入により変化し、それにより、調整されたルーチン内の1つまたは複数の命令および/またはデータ項目の相対的な位置が変化し得る。従って、コンストラクタ210は、ルーチンの逆アセンブルされたコードを分析して、他の命令および/または他のデータ項目への参照および/またはポインタを含む命令および/またはデータ項目を検索することができる。コンストラクタ210は、検出された基準および/またはポインタを調整し、追加されたコードセグメント、リストおよび/またはマーカの挿入後に、ルーチンの新しいレイアウトに従ってそれらを更新することができる。
【0167】
例えば、中間コードファイルがARMアーキテクチャおよび命令セットのためにコンパイルされていると仮定すると、コンストラクタ210は、ルーチンのレイアウトの変更の影響を受ける可能性がある「LDR Rn,[pc #offset]」を検索することができる。次に、アジャスタは、調整されたルーチンの新しいレイアウトに従って「#offset」を修正(更新)して、プログラムカウンタである「pc」に対して正しい位置を指し示すことができる。
【0168】
別の実施形態では、コンストラクタ210は、追加されたコードセグメント、リスト、および/またはマーカの挿入によって、調整されたルーチンに適用される変更を反映するように、調整されたルーチンのシンボルテーブルを修正することができる。例えば、コンストラクタ210は、シンボルテーブルを更新して、追加されたコードセグメントのシンボルを含むことができる。コンストラクタ210は、追加されたコードセグメント、リスト、および/またはマーカの挿入によって変更された可能性がある調整済みルーチンのアドレス位置を反映するように、シンボルテーブルをさらに修正することができる。
【0169】
さらに、追加されたコードセグメントの挿入、ならびにリストおよび/またはマーカの挿入は、それぞれの中間コードファイルのサイズを拡張させることができる。従って、コンストラクタ210は、調整された中間コードファイルの1つまたは複数の属性、たとえば、ファイルサイズおよび/または同様のものを修正するために、調整された中間ファイルを調整することができる。例えば、中間コードファイルがELFフォーマットであると仮定すると、コンストラクタ210は、追加されたコードセグメント、リストおよび/またはマーカの挿入後に、中間コードファイルのルーチン内の新しいオフセットおよびアラインメントを反映するように、ELFファイルのヘッダを調整することができる。
【0170】
コンストラクタ210は、例えば、ソースコードファイルおよび/または中間コードファイルの中で、追加されたコードセグメント、リストおよび/または調整されたコードファイル自体の中のマーカを含むことができる。さらに、追加的、および/または代替的に、コンストラクタ210は、追加されたコードセグメント、リストおよび/またはマーカを1つまたは複数の追加のコードファイル、例えば、1つまたは複数のソースコードファイルおよび/または1つまたは複数の中間コードファイルに含めることができる。追加コードファイルは、実行可能ファイルのコンパイル、生成、構築、および/またはリンケージのために、調整されたコードファイルと共に提供されてもよい。
【0171】
コンストラクタ210は、また、中間コードファイルが、追加されたコードセグメント、リストおよび/またはマーカの挿入によって暗示される変更を反映するように調整された後、実装された追加されたコードセグメントへの分岐が構築および/またはリンケージに対して有効であることを検証してもよい。例えば、コンストラクタ210がトランポリン分岐関数を使用して追加されたコードセグメントを追加したと仮定すると、コンストラクタ210は、再配置エントリは、それぞれの追加されたコードセグメントを起動するように構成されたそれぞれのトランポリン分岐関数を指すように追加されたコードセグメントを起動するように調整された、各脆弱メモリ管理および/またはクリティカルルーチンの再配置エントリを置き換えることができ、再配置エントリは事前定義された名前を含む。リロケーションエントリは、分岐関数を含むコードセクションのリロケーションを記述するリロケーションセクションにおいて置き換えることができる。そのようなコードセクションが存在しない場合、再配置エントリが作成され、中間ファイル内の既存のセクションに追加され得る。追加されたコードセグメントは、追加されたコードセグメントを含むように作成された追加の中間コードファイルの1つまたは複数で、同じ事前定義された名前でコンパイルされ得る。
【0172】
112で示されるように、コンストラクタ210は、1つまたは複数のプロセッサによって実行され得る1つまたは複数の実行可能ファイルを生成、構築、および/またはリンクするために使用され得る、調整された中間コードファイルを出力し得る。例えば、コンストラクタ210は、中間コードファイルを、調整された中間コードファイルから実行可能ファイルを作成するためのリンカ、コードビルダ、および/または同様のものの1つまたは複数のアプリケーション、ツールおよび/または同様のものを使用することができる、1つまたは複数のリモートネットワーク化されたリソースに送信することができる。別の実施形態では、コンストラクタ210は、中間コードファイルを記憶装置206に記憶することができ、そこから、中間コードファイルは、例えば、実行可能ファイルを作成するためのリンカ、コードビルダおよび/または同様のものの1つまたは複数のアプリケーション、ツールおよび/または同様のものによって検索され得る。別の実施形態では、コンストラクタ210は、中間コードファイルを、例えば、実行可能ファイルを作成するためのリンカ、コードビルダ、および/または同様のものなどの1つまたは複数のアプリケーション、ツールおよび/または同様のものによって、中間コードファイルが検索され、別のシステムに接続される、添付可能な1つまたは複数の記憶装置に記憶させてもよい。
【0173】
本出願から発展する特許の存続期間中に、多くの関連するシステム、方法、およびコンピュータプログラムが開発され、用語「中間コードファイルフォーマット」、「中間コードファイル分析ツール」の範囲は、そのような新しい技術のすべてを先験的に含むよう意図されることが予想される。
【0174】
本明細書で使用される「約」という用語は±10%を指す。
【0175】
用語「含む(comprises)」、「含む(comprising)」、「含む(includes)」、「含む(including)」、「有する(having)」、およびそれらの複合体は「含むが、これに限定されない」を意味する。
【0176】
「から成る」という用語は、「含む、およびこれに限定される」を意味する。
【0177】
本明細書で使用されるように、単数形「a」、「an」および「the」は文脈が明確に別段の指示をしない限り、複数の参照を含む。例えば、「化合物」または「少なくとも1つの化合物」という用語は、それらの混合物を含む複数の化合物を含むことができる。
【0178】
本出願を通して、本発明の様々な実施形態は、範囲フォーマットで提示されてもよい。範囲形式での説明は単に便宜および簡潔さのためであり、本発明の範囲に対する柔軟性のない限定として解釈されるべきではないことを理解されたい。従って、範囲の説明は、その範囲内のすべての可能な部分範囲ならびに個々の数値を具体的に開示したものとみなされるべきである。例えば、1~6などの範囲の記載は、1~3、1~4、1~5、2~4、2~6、3~6などの部分的範囲、ならびにその範囲内の個々の数、例えば、1、2、3、4、5、および6などを具体的に開示したと考えるべきである。これは、範囲の幅に関係なく適用される。
【0179】
数値範囲が本明細書で示されるときはいつでも、それは、示された範囲内の任意の引用された数字(分数または整数)を含むことを意味する。語句「範囲(ranging)/範囲(ranges between)」第1に示す数字および第2に示す数字、「範囲(ranging)/範囲(ranges from)」第1に示す数字「to」第2に示す数字は、本明細書では互換的に使用され、第1および第2の示された数、ならびにそれらの間のすべての分数および整数を含むことを意味する。
【0180】
明確にするために、別個の実施形態の文脈で説明される本発明の特定の特徴は、単一の実施形態において組み合わせて提供されてもよいことが理解される。逆に、簡潔にするために、単一の実施形態の文脈で説明されている本発明の様々な特徴は別々に、または任意の適切なサブコンビネーションで、または本発明の任意の他の説明された実施形態で適切なものとして提供されてもよい。様々な実施形態の文脈で説明される特定の特徴は実施形態がそれらの要素なしで動作不能でない限り、それらの実施形態の本質的な特徴と見なされるべきではない。
【0181】
さらに、本出願のいかなるの優先件書類は、その全体が参照により本明細書に組み込まれる。
図1
図2
図3