【解決手段】方法は、コードセグメントをランタイムにおいてコンパイルする要求をJIT実行プロセスから受信する(102)ことと、実行可能なコードセグメントを生成するためにコードセグメントをコンパイルするJITコンパイルプロセスを開始する(106)ことと、共有メモリに実行可能なコードセグメントを格納する(108)ことと、共有メモリ内の実行可能なコードセグメントに対するポインタをJIT実行プロセスに提供する(110)こととのために少なくとも1つのプロセッサを使用することを含む。ここでは、JIT実行プロセスが共有メモリへの読取り実行アクセス権を有し、JIT実行プロセスと前記JITコンパイルプロセスとは異なるプロセスである。
前記JITコンパイルプロセスが、前記少なくとも1つのプロセッサのアーキテクチャに従って前記実行可能なコードセグメントを生成することに適応したJITコンパイラを利用する、
請求項1に記載のコンピュータ実装方法。
前記コードセグメントにより開始された少なくとも1つの潜在的に悪意のある動作を識別するために前記実行可能なコードセグメントを生成する前に前記コードセグメントを解析する、すなわち、前記コードセグメントの有効性を検証するためにコンパイルの前に前記コードセグメントを解析することをさらに含む、
請求項1に記載のコンピュータ実装方法。
前記コードセグメントにより開始された少なくとも1つの潜在的に悪意のある動作を識別するために、生成した後で前記実行可能なコードセグメントを解析することをさらに含む、
請求項1に記載のコンピュータ実装方法。
【発明の概要】
【0005】
本発明の第1の態様によれば、ランタイム環境においてジャストインタイム(JIT)でコンパイルしたコードを安全に実行するコンピュータ実装方法であって、
− コードセグメントをランタイムにおいてコンパイルする要求をJIT実行プロセスから受信することと、
− 実行可能なコードセグメントを生成するためにコードセグメントをコンパイルするJITコンパイルプロセスを開始することと、
− 共有メモリに実行可能なコードセグメントを格納することと、
− 共有メモリ内の実行可能なコードセグメントに対するポインタをJIT実行プロセスに提供することであり、JIT実行プロセスが共有メモリへの読取り実行アクセス権を有する、ポインタをJIT実行プロセスに提供することと
のために少なくとも1つのプロセッサを使用することを含み、JITでコンパイルしたコードを安全に実行するコンピュータ実装方法が提供される。
【0006】
ここでは、JIT実行プロセスとJITコンパイルプロセスとは、異なるプロセスである。
【0007】
JITコンパイルをJIT実行プロセスから分離することは、JITコンパイルおよび新しいコード生成を高められた安全性で行うことができるので、JIT実行プロセスよりも改善された制御を可能にすることができる。JITコンパイラがJIT実行プロセスとは別でありかつ無関係であるJITコンパイルプロセスのコンテキストにおいて開始され実行されるので、コード生成特権が、JIT実行プロセスから与えられないことがある。コード生成特権を持たないと、JIT実行プロセスを使用して、処理環境内で悪意のあるコードを不当に利用し生成する攻撃者の能力が、著しく低下することがある。
【0008】
本発明の第2の態様によれば、コードを実行することに適応した1つまたは複数のプロセッサを備えている、ランタイム環境においてジャストインタイム(JIT)でコンパイルしたコードを安全に実行するためのシステムが提供される。コードは、
− コードセグメントをランタイムにおいてコンパイルする要求をJIT実行プロセスから受信するためのコード命令と、
− 実行可能なコードセグメントを生成するためにコードセグメントをコンパイルするJITコンパイルプロセスを開始するためのコード命令と、
− 共有メモリに実行可能なコードセグメントを格納するためのコード命令と、
− 共有メモリ内の実行可能なコードセグメントに対するポインタをJIT実行プロセスに提供するためのコード命令であって、JIT実行プロセスが共有メモリへの読取り実行アクセス権を有する、コード命令と、
を含む。
【0009】
ここでは、JIT実行プロセスとJITコンパイルプロセスとは、異なるプロセスである。
【0010】
本発明の第3の態様によれば、コードを実行することに適応した1つまたは複数のプロセッサを備えている、ランタイム環境においてジャストインタイム(JIT)でコンパイルしたコードを安全に実行するためのシステムが提供される。コードは、
− 1つまたは複数の未コンパイルのコードセグメント含むJIT実行プロセスを開始するためのコード命令と、
− 1つまたは複数の対応する実行可能なコードセグメントを生成するために1つまたは複数のコードセグメントをコンパイルするJITコンパイルプロセスを実行するためのコード命令と、
を含む。
【0011】
ここでは、1つまたは複数のコードセグメントをコンパイルするためにJIT実行プロセスからの要求に応じて、JITコンパイルプロセスが、対応する実行可能なコードセグメントを生成するために1つまたは複数のコードセグメントをコンパイルし、かつJIT実行プロセスが読取り実行アクセス権を有する共有メモリに対応する実行可能なコードセグメントを格納する。ここでは、JIT実行プロセスとJITコンパイルプロセスとは、異なるプロセスである。
【0012】
発明の第1、第2および/または第3の態様を参照して、第1の実装形態によれば、JITコンパイルプロセスは、1つまたは複数のプロセッサのアーキテクチャに従って実行可能なコードセグメントを生成することに適応したJITコンパイラを利用する。JITコンパイラを使用するランタイムコンパイルは、汎用プラットフォーム(ハードウェア)に依存しないコードが、プラットフォームに依存しないコードをコンパイルし、プラットフォームに特有でありかつ実行可能なコードを生成するために特有なハードウェアプラットフォームに対して好適なJITコンパイラを使用することにより様々なハードウェアプラットフォーム上で実行されることを可能にする。
【0013】
発明の第1、第2および/もしくは第3の態様ならびに/または第1の実装形態を参照して、第2の実装形態によれば、JIT実行プロセスは、コード生成特権を与えられない。これは、プロセッサのメモリ領域内のコードを変える、操作するおよび/または管理する悪意のあるJIT実行プロセスの能力を著しく低下させることができる。
【0014】
発明の第1、第2および/もしくは第3の態様ならびに/または先の実装形態のいずれかを参照して、第3の実装形態によれば、JIT実行プロセスは、共有メモリへの書込みアクセス権を与えられない。特に共有メモリへの、および、一般にプロセッサのメモリ領域への限定的なアクセス権のみを認可することにより、例えば、読取り実行アクセス権を認可し一方で書込みアクセス権を与えないことにより、メモリ領域内のコンテンツを変える、操作する、破壊する、損傷を与える等の悪意のあるJIT実行プロセスの能力を著しく低下させることができる。
【0015】
発明の第1、第2および/もしくは第3の態様ならびに/または先の実装形態のいずれかを参照して、第4の実装形態によれば、JITコンパイルプロセスは、格納することを許可するために共有メモリへの読取り−書込みアクセス権を認可される。これは、JITコンパイルプロセスが共有メモリに実行可能なコードセグメントを格納することを可能にする。
【0016】
発明の第1、第2および/もしくは第3の態様ならびに/または先の実装形態のいずれかを参照して、第5の実装形態によれば、JITコンパイルプロセスは、共有メモリからの実行アクセス権を与えられない。共有メモリへのコード実行アクセス権を持たないと、JITコンパイルプロセスは、生成した実行可能なコードセグメントを実行することができない。これは、悪意のあるコードを含むことがある、生成した実行可能なコードセグメントがJITコンパイルプロセスにより実行されなくてもよいので、JITコンパイルプロセスの潜在的なバグおよび/または脆弱性を利用する潜在的な攻撃者の能力を著しく低下させることができる。
【0017】
任意選択で、発明の第1、第2および/もしくは第3の態様ならびに/または先の実装形態のいずれかを参照して、第6の実装形態によれば、コードセグメントは、コードセグメントにより開始される1つまたは複数の潜在的に悪意のある動作を識別するために、実行可能なコードセグメントを生成する前に解析される。悪意のあるコードセグメントを検出するためにコードセグメントをコンパイルすることに先立ってコードセグメントを解析することは、プロセッサ実行環境の安全性、完全性、堅固さ、等を著しく増加させることができる。高レベルであるコードセグメントを解析することは、高レベルで、すなわち、実行可能なコードに変換することに先立って、検出可能であり得る攻撃ベクトルおよび/または方法を検出することを可能にすることができる。
【0018】
任意選択で、発明の第1、第2および/もしくは第3の態様ならびに/または先の実装形態のいずれかを参照して、第7の実装形態によれば、実行可能なコードセグメントは、コードセグメントにより開始される1つまたは複数の潜在的に悪意のある動作を識別するために、生成された後で解析される。悪意のあるコードセグメントを検出するために実行に先立って実行可能なコードセグメントを解析することは、プロセッサ実行環境の安全性、完全性、堅固さ、等を著しく増加させることができる。1つまたは複数のツール、例えば、ウィルス駆除を使用して実行可能なコードセグメントを解析することは、実行可能なコードを実行することに先立って攻撃パターンベクトルを検出すること、したがって悪意のある実行可能なコードが強要することがある悪意のある行為を防止することを可能にすることができる。
【0019】
特に定義されない限り、本明細書で使用される技術用語および/または科学用語はすべて本発明が属する技術分野の当業者によって一般に理解されるのと同じ意味を有する。本明細書で説明する方法および材料と同様のまたは同等の方法および材料を本発明の実施形態の実施または試験で使用することができるが、例示的な方法および/または材料を以下で説明する。矛盾する場合、定義を含む特許明細書が統制することになる。加えて、材料、方法および例は、例示にすぎず、必ずしも限定することを意図していない。
【0020】
発明の実施形態の方法および/またはシステムの実装形態は、手動で、自動で、またはこれらの組合せで選択したタスクを実行することまたは完了することを包含することができる。その上、発明の方法および/またはシステムの実施形態の実際の器具および機器によれば、いくつかの選択したタスクは、オペレーティングシステムを使用してハードウェアにより、ソフトウェアにより、もしくはファームウェアにより、またはこれらの組合せにより実装されることがある。
【0021】
例えば、発明の実施形態による、選択したタスクを実行するためのハードウェアは、チップまたは回路として実装されることがある。ソフトウェアとして、発明の実施形態に従って選択されたタスクは、任意の適切なオペレーティングシステムを使用してコンピュータにより実行される複数のソフトウェア命令として実装されることがある。発明の例示的な実施形態では、本明細書において説明するような方法および/またはシステムの例示的な実施形態による1つまたは複数のタスクは、複数の命令を実行するためのコンピューティングプラットフォームなどのデータプロセッサにより実行される。任意選択で、データプロセッサは、命令および/もしくはデータを格納するための揮発性メモリ、ならびに/または命令および/もしくはデータを格納するための不揮発性記憶装置、例えば、磁気ハードディスクおよび/もしくはリムーバブルメディアを含む。任意選択で、ネットワーク接続が、同様に提供される。ディスプレイおよび/またはキーボードもしくはマウスなどのユーザ入力デバイスが、同様に任意選択で提供される。
【0022】
本発明のいくつかの実施形態が、添付図面を参照しながら、単なる例として、本明細書で説明される。次に図面を詳細に具体的に参照すると、図示の詳細は、例としてのものであり、本発明の実施形態の例示的な議論のためのものであることが強調される。この点に関して、図面とともに行われる説明は、本発明の実施形態をどのように実践できるかを当業者に明らかにする。
【発明を実施するための形態】
【0024】
本発明は、そのいくつかの実施形態では、ランタイム環境においてジャストインタイム(JIT)でコンパイルしたコードを実行することに関し、とりわけ、しかし排他的ではなく、安全なJITコンパイラを使用してランタイム環境においてJITでコンパイルしたコードを安全に実行することに関する。
【0025】
本発明のいくつかの実施形態によれば、1つまたは複数のプロセッサによってランタイム処理環境において実行されるJIT実行プロセスの実行フローからJITコンパイルを分離することによりJITで生成した実行可能なコードセグメントを安全に実行するための方法、システムおよびコンピュータプログラム製品を提供する。JIT実行プロセス、例えば、アプリケーション、プログラム、ツール、プロセス、スクリプト、等は、複数のコンピュータプログラム命令、例えば、ソースコード、ポータブルコード、バイトコード、等を含む1つまたは複数の未コンパイルの高レベルコードセグメントを含むことができる。これらを実行するために、高レベルコードセグメントは、初めにランタイムにおいてコンパイルされることが必要である。JIT実行プロセスは、それゆえに、高レベルコードセグメントをコンパイルするための要求を発行することができる。
【0026】
要求に応じて、別のJITコンパイルプロセスが、1つまたは複数のJITコンパイラ、例えば、Javaコンパイラ、JavaScriptエンジン、.NETコンパイラ、等を使用してランタイムにおいて高レベルコードセグメントをコンパイルするために、開始される、起動されるおよび/または実行されることがある。JITコンパイラは、JIT実行プロセスを動作しているプロセッサのプロセッサアーキテクチャに対応する1つまたは複数の実行可能なコードセグメントを生成するために、コードセグメントをコンパイルする。JITコンパイルプロセスは、JIT実行プロセスをアクセス可能な共有メモリに実行可能なコードセグメントを格納することができる。JITコンパイルプロセスが共有メモリへの読取り/書込みアクセス権を有することができる一方で、JITコンパイルプロセスは、共有メモリへの実行アクセス権を与えられないことがある。他方でJIT実行プロセスは、共有メモリへの、特にJITコンパイルプロセスが実行可能なコードセグメントを格納した共有メモリ位置(例えば、ページ、セクタ、等)への書込みアクセス権を与えられないとしても、共有メモリへの読取り実行アクセス権だけを持つことがある。
【0027】
任意選択で、JITコンパイルプロセスは、コードセグメントを検証するために、すなわち、悪意のある行為および/または動作がコードセグメントにより開始されないかもしれないことを識別するために、コードセグメントをコンパイルする前にコードセグメントを解析するための1つまたは複数のコード解析ツールを使用する。そのようなコード解析ツールは、典型的にはJITコンパイラに統合されることがある。JITコンパイルプロセスは、生成した実行可能なコードセグメントを検証するための1つまたは複数の実行可能コード解析ツール、例えば、ウィルス駆除ツールをさらに使用することができる。
【0028】
実行可能なコードセグメントが生成され、共有メモリに格納された後で、JITコンパイルプロセスは、共有メモリ内の実行可能なコードセグメントに対するポインタをJIT実行プロセスに提供することができる。JIT実行プロセスは、次いで、共有メモリからの実行可能なコードセグメントを実行することができる。
【0029】
JIT実行プロセスとは別であるおよび/または無関係であるJITコンパイルプロセスにおける高レベルコードセグメントのJITコンパイルは、既存のJITコンパイル法と比較して有意な利点を提示することができる。既存のJITコンパイル法では、典型的にはJIT実行プロセスは、高レベルコードセグメントをコンパイルしかつ実行可能なコードセグメントを生成するためのJITコンパイラを開始することができる。JITコンパイラがJIT実行プロセスのコンテキスト(範囲)において開始されるので、JIT実行プロセスは、典型的にはコード生成特権を認可されることがある。そのようなコード生成特権は、潜在的に悪意のあるJIT実行プロセス、潜在的な攻撃者、等によって容易に不当に利用されることがあり、これらは処理環境において1つまたは複数の悪意のある行為および/または動作を開始することができる悪意のあるコードを生成する、書き込むおよび/または開始するためにバグおよび/またはシステム脆弱性を活用することがある。その上、実行可能なコードセグメントを生成するために、JITコンパイラは、プロセッサの1つまたは複数のメモリ領域、例えば、システムメモリ、格納スペース、ネットワークリソース、等をアクセスする必要があり得る。それゆえ、既存のJITコンパイル法において行われたようにJIT実行プロセスのコンテキスト(範囲)内でJITコンパイラをサポートするために、JIT実行プロセスは、メモリ領域への修正(書込み)アクセス権を認可されることがある。JIT実行プロセスがメモリ領域を変更すること、操作することおよび/または管理することを認めることは、処理環境においてメモリリソースに格納したコンテンツに損傷を与えることがある潜在的に悪意のある実行プロセス、潜在的な攻撃者、等に処理環境をさらに曝すことがある。
【0030】
他方でJITコンパイルをJIT実行プロセスから分離することは、JITコンパイルおよび新しいコード生成が著しくより安全に行われることがあるので、JIT実行プロセスに対して著しくより優れた制御を可能にすることができる。JITコンパイラがJIT実行プロセスとは別でありかつ無関係であるJITコンパイルプロセスのコンテキストにおいて開始され、実行されるので、コード生成特権は、JIT実行プロセスから与えられないことがある。コード生成特権を持たないと、処理環境内で悪意のあるコードを不当に利用しかつ生成する攻撃者の能力は、著しく低下することがある。その上、JITコンパイルがJITコンパイルプロセスにより行われ、共有メモリに格納されているので、JIT実行プロセスは、読取り実行アクセス権を認可されることがある一方で、共有メモリへの、特に一般にプロセッサのメモリ領域への書込みアクセス権を与えられないことがある。これは、JIT実行プロセスのメモリ領域のコードを変更する、操作するおよび/または管理する能力を著しく低下させることがある。これは、JIT実行プロセスのメモリ領域に格納されたコンテンツを変更する、破壊する、損傷を与える、等の能力をさらに著しく低下させることができる。
【0031】
その上、共有メモリへのコード実行アクセス権を持たないと、JITコンパイルプロセスは、生成した実行可能なコードセグメントを実行することができない、すなわち、新しく生成した実行可能なコードセグメントは、JITコンパイルプロセスのコンテキスト(範囲)においては実行されないことがある。これは、悪意のあるコードを含むことができる生成した実行可能なコードセグメントがJITコンパイルプロセスによって実行されないことがあるので、JITコンパイルプロセスにおける潜在的なバグおよび/または脆弱性を利用する潜在的な攻撃者の能力を著しく低下させることができる。
【0032】
共有メモリアーキテクチャのために、非常にわずかな通信しかJIT実行プロセスとJITコンパイルプロセスとの間で交換されないので、JITコンパイルプロセスを使用してコードセグメントをコンパイルする性能影響は、取るに足りないことがある。主な時間コンシューマであり得るJITコンパイラ自体は、既存の方法で行われ、それゆえ性能ペナルティがJITコンパイラ動作に含まれていないので、JITコンパイラがJIT実行プロセスにより典型的に使用されるようにJITコンパイルプロセスにより使用される。
【0033】
さらにその上、コードセグメントおよび/または生成した実行可能なコードセグメントを解析することおよび検証することにより、1つまたは複数の悪意のあるコードセグメントが、識別されることがあり、コードセグメントは、実行することを妨げられることがある。これは、処理環境における脆弱性を不当に利用する悪意のあるプロセスからの潜在的な脅威を著しく減少させることができる。
【0034】
本発明の少なくとも1つの実施形態を詳細に説明する前に、本発明は、その適用において、以下の説明に記載され、および/または図面および/または実施例に示される構成要素および/または方法の構築および配列の詳細に必ずしも限定されないことを理解されたい。本発明は、他の実施形態が可能であり、または様々な方法で実践もしくは実行することが可能である。
【0035】
本発明は、システム、方法、および/またはコンピュータプログラム製品とすることができる。コンピュータプログラム製品は、プロセッサに本発明の態様を実行させるためのコンピュータ可読プログラム命令を有する1つのコンピュータ可読記憶媒体(または複数の媒体)を含むことができる。
【0036】
コンピュータ可読記憶媒体は、命令実行デバイスによる使用のための命令を保持し格納することができる有形デバイスとすることができる。コンピュータ可読記憶媒体は、例えば、限定はしないが、電子記憶デバイス、磁気記憶デバイス、光学記憶デバイス、磁気記憶デバイス、半導体記憶デバイス、または前述のものの任意の好適な組合せとすることができる。コンピュータ可読記憶媒体のより具体的な例の包括的でないリストは、以下のものを含む:ポータブルコンピュータディスケット、ハードディスク、ランダムアクセスメモリ(RAM)、読取り専用メモリ(ROM)、消去可能プログラマブル読取り専用メモリ(EPROMまたはフラッシュメモリ)、スタティックランダムアクセスメモリ(SRAM)、ポータブルコンパクトディスク読取り専用メモリ(CD−ROM)、デジタル多用途ディスク(DVD)、メモリスティック、フロッピーディスク、パンチカードまたは命令を記録した溝の凹凸構造などの機械的にエンコードしたデバイス、および前述のものの任意の好適な組合せ。本明細書で使用するコンピュータ可読記憶媒体は、電波または他の自由に伝播する電磁波、導波路または他の伝送媒体を通って伝搬する電磁波(例えば、光ファイバケーブルを通過する光パルス)、またはワイヤを通して伝送される電気信号などの一時的な信号自体であると解釈されるべきでない。
【0037】
本明細書で説明するコンピュータ可読プログラム命令は、コンピュータ可読記憶媒体からそれぞれのコンピューティング/処理デバイスに、またはネットワーク、例えば、インターネット、ローカルエリアネットワーク、ワイドエリアネットワーク、および/またはワイヤレスネットワークを介して外部コンピュータもしくは外部記憶デバイスにダウンロードすることができる。ネットワークは、銅伝送ケーブル、光伝送ファイバ、ワイヤレス伝送、ルータ、ファイアウォール、スイッチ、ゲートウェイコンピュータ、および/またはエッジサーバを含むことができる。各コンピューティング/処理デバイスのネットワークアダプタカードまたはネットワークインターフェースは、ネットワークからコンピュータ可読プログラム命令を受け取り、それぞれのコンピューティング/処理デバイス内のコンピュータ可読記憶媒体に格納するためにコンピュータ可読プログラム命令を転送する。
【0038】
本発明の動作を実行するためのコンピュータ可読プログラム命令は、アセンブラ命令、命令セットアーキテクチャ(ISA)命令、機械語命令、機械依存命令、マイクロコード、ファームウェア命令、状態設定データ、またはSmalltalk、C++などのようなオブジェクト指向プログラミング言語および「C」プログラミング言語もしくは類似したプログラミング言語などの従来の手続き型プログラミング言語を含む1つまたは複数のプログラミング言語の任意の組合せで書かれたソースコードもしくはオブジェクトコードのいずれかとすることができる。
【0039】
コンピュータ可読プログラム命令は、ユーザコンピュータで全面的に、ユーザコンピュータで部分的に、スタンドアロンソフトウェアパッケージとして、ユーザコンピュータで部分的におよびリモートコンピュータで部分的に、またはリモートコンピュータもしくはサーバで全面的に実行することができる。後者のシナリオでは、リモートコンピュータは、ローカルエリアネットワーク(LAN)またはワイドエリアネットワーク(WAN)を含む任意のタイプのネットワークによってユーザコンピュータに接続されてもよく、または外部コンピュータへの接続がなされてもよい(例えばインターネットサービスプロバイダーを使用するインターネットを通して)。いくつかの実施形態では、例えば、プログラマブル論理回路、フィールドプログラマブルゲートアレイ(FPGA)、またはプログラマブル論理アレイ(PLA)を含む電子回路は、本発明の態様を実行するために、コンピュータ可読プログラム命令の状態情報を利用することによってコンピュータ可読プログラム命令を実行して、電子回路を個人専用にすることができる。
【0040】
本発明の態様は、本発明の実施形態による方法、装置(システム)、およびコンピュータプログラム製品のフローチャート図および/またはブロック図を参照して本明細書で説明される。フローチャート図および/またはブロック図の各ブロック、およびフローチャート図および/またはブロック図のブロックの組合せは、コンピュータ可読プログラム命令によって実装できることを理解されよう。
【0041】
図のフローチャートおよびブロック図は、本発明の様々な実施形態によるシステム、方法、およびコンピュータプログラム製品のあり得る実施態様のアーキテクチャ、機能、および動作を示す。この点に関して、フローチャートまたはブロック図の各ブロックは、特定の論理機能を実装するための1つまたは複数の実行可能命令を含む命令のモジュール、セグメント、または一部分を表すことができる。いくつかの代替実施態様では、ブロックに記された機能は、図に記された順序から外れて行われることがある。例えば、連続して示された2つのブロックは、関係する機能に応じて、実際には実質的に同時に実行されることがあり、またはブロックは時には逆の順序で実行されることがある。ブロック図および/またはフローチャート図の各ブロック、およびブロック図および/またはフローチャート図のブロックの組合せは、特定の機能もしくは動作を実行するかまたは専用ハードウェアとコンピュータ命令との組合せを実行する専用ハードウェアベースシステムによって実装されてもよいことにも留意されたい。
【0042】
ここで図面を参照して、
図1は、本発明のいくつかの実施形態による、ランタイム環境においてJITでコンパイルしたコードを安全に実行する例示的なプロセスのフローチャートを図示する。プロセス100は、1つまたは複数のプロセッサによりランタイム処理環境において実行されるJIT実行プロセスの実行フローからJITコンパイルを分離するために実行されることがある。JIT実行プロセスは、1つまたは複数の未コンパイルの高レベルコードセグメントを含むことができ、これらのコードセグメントは、実行される前にランタイムにおいてコンパイルされることが必要である。JIT実行プロセスは、高レベルコードセグメントをコンパイルするための要求を発行することができる。高レベルコードセグメントをコンパイルするために、別のJITコンパイルプロセスが、1つまたは複数のJITコンパイラを使用してランタイムにおいて高レベルコードセグメントをコンパイルし、かつJIT実行プロセスを実行しているプロセッサのプロセッサアーキテクチャに対応している1つまたは複数の実行可能なコードセグメントを生成するために開始される、起動されるおよび/または実行されることがある。JITコンパイルプロセスは、読取り実行(書込みがない)アクセス権を有するJIT実行プロセスをアクセス可能な共有メモリに実行可能なコードセグメントを格納することができる。JIT実行プロセスは、次いで、JITコンパイルプロセスにより提供されるポインタを使用して共有メモリからの実行可能なコードセグメントを実行することができる。
【0043】
本発明のいくつかの実施形態による、ランタイム環境においてJITでコンパイルしたコードを安全に実行するための例示的なシステムの概略図である
図2をやはり参照する。プロセス100などのプロセスを実行するためのシステム200は、コンピューティングデバイス201、例えば、コンピュータ、処理ノード、サーバ、モバイルデバイス、スマートフォン、タブレット、等を含む。実際のところ、コンピューティングデバイス201は、ソフトウェアコード命令を実行することができる1つまたは複数のプロセッサを備える任意のデバイスであってもよい。コンピューティングデバイス201は、プロセッサ202および記憶装置204を備える。プロセッサ202は、1つまたは複数の(同種または異種の)プロセッサを含み、クラスタとしておよび/または1つもしくは複数の分散型コア処理ユニットとして並列処理のために配置されてもよい。プロセッサ202は、1つまたは複数のソフトウェアモジュールを実行することができ、ここではソフトウェアモジュールは、記憶装置204などの記憶媒体に格納されかつプロセッサ202により実行される複数のプログラム命令を呼ぶ。記憶装置204は、1つまたは複数の非一時的な記憶デバイス、例えば、ハードドライブ、フラッシュアレイ、付加された記憶媒体、等を含むことができる。記憶装置204は、1つまたは複数の揮発性記憶デバイス、例えば、1つまたは複数のソフトウェアモジュールが非一時的な記憶デバイスのうちの1つもしくは複数からおよび/または1つもしくは複数のネットワークを通して1つもしくは複数の遠隔地からロードされることがあるランダムアクセスメモリ(RAM)をさらに含むことができる。
【0044】
典型的には、コンピューティングデバイス201は、1つまたは複数のネットワーク、例えば、ローカルエリアネットワーク(LAN)、ワイドエリアネットワーク(WAN)、セルラネットワーク、インターネット、等に接続するための1つまたは複数のネットワークインターフェースをさらに含むことができる。
【0045】
プロセッサ202は、1つまたは複数のソフトウェアモジュールを実行することができ、ここではソフトウェアモジュールは、例えば、プログラム記憶装置204などの非一時的な媒体に格納され、かつプロセッサ202などの1つまたは複数のプロセッサにより実行される複数のプログラム命令を各々が含んでいるプロセス、アプリケーション、エージェント、ユーティリティ、サービス、プラグイン、スクリプト、アドオンソフトウェア、等であってもよい。典型的には、コンピューティングデバイス201は、プロセッサ202により実行されるソフトウェアモジュールのために、ランタイム処理環境、サービス、インフラストラクチャ、等を提供するOS、例えば、Windows、Linux、UNIX、iOS、Android、等をホストする。
【0046】
プロセッサ202は、例えば、実行プロセス210、特に、複数のコンピュータプログラム命令、例えば、ソースコード、ポータブルコード、バイトコード、等を含んでいる1つまたは複数の未コンパイルの高レベルコードセグメント220を含むJIT実行プロセスを実行することができる。コードセグメント220は、ハードウェアプラットフォームに依存しないコードセグメント、例えば、Java、.NET、JavaScript、等であってもよい。JIT実行プロセス210がコードセグメント220を実行するために、コードセグメント220は、最初にコンパイルされる必要があり、1つまたは複数の対応する実行可能なコードセグメント220が生成される必要がある。しかしながら、JIT実行プロセス210は、例えば、特に、JIT実行プロセス210がランタイムにおいて実行可能なコードを生成することを防止するためのOSによって構成されてもよい。例えば、Windowsでは、設定プロセスダイナミックコードポリシ(ProcessDynamicCodePolicy)設定が、JIT実行プロセス210およびコンパイルプロセスに対して有効にされることがあり、このようにJIT実行プロセス210が実行可能なコードを生成することを禁止している。
【0047】
プロセッサ202は、実行可能なコードセグメント222を生成するためにコードセグメント220のうちの1つまたは複数をコンパイルするJITコンパイルプロセス212をさらに実行することができる。JITコンパイルプロセス212がJIT実行プロセス210とは別のプロセスであることが強調される。
【0048】
いくつかの実施形態では、JITコンパイルプロセス212は、プロセッサ202により実行されるOSのOSレベルで実行されることがある。OSがコードセグメント220をコンパイルするためにJIT実行プロセス210からの要求を検出すると、OSは、実行可能なコードセグメント222を生成するためにコードセグメント220をコンパイルするJITコンパイルプロセス212を開始することができる。
【0049】
いくつかの実施形態では、JITコンパイルプロセス212は、プロセッサ202により実行されたもののうちアプリケーションレベルで実行されることがある。例えば、JIT実行プロセス210が、例えば、Chrome、Firefox、Internet Explorer、Edge、Operaなどのウェブブラウザアプリケーションのコンテキスト(範囲)において実行される場合には、ウェブブラウザアプリケーションは、コードセグメント220をコンパイルするためにJIT実行プロセス210からの要求を検出することができる。要求に応じて、ウェブブラウザアプリケーションは、実行可能なコードセグメント222を生成するためにコードセグメント220をコンパイルするJITコンパイルプロセス212を開始することができる。別の例では、アプリケーションは、例えば、リモートウェブサーバ、リモートコンピューティングノード、リモートコンピューティングクラスタ、クラウドサービス、等により提供されるリモートサービス、例えば、YouTube、Facebook、等を提供するためにプロセッサ202により実行されるもののローカルエージェントである。JIT実行プロセス210とは別のプロセスとしてのJITコンパイルプロセス212の管理は、例えば、プラグイン、スクリプト、等としてアプリケーションに追加されることがある。任意選択で、JITコンパイルプロセス212の管理は、アプリケーションに組み込まれることがある。
【0050】
共有メモリ204−1などの1つまたは複数の共有メモリ領域が、記憶装置204内に画定される、構築される、初期化される、等があり得る。例えば、共有メモリ204−1は、記憶装置204内の1つまたは複数のメモリページ、セクタ、等を利用することができる。共有メモリ204−1は、実行可能なコードセグメント222を格納するために使用されることがある。共有メモリ204−1は、異なるアクセス権を用いてプロセス210および212の各々にマッピングされることがある。例えば、JIT実行プロセス210は、共有メモリ204−1への読取り実行アクセス権を認可されることがあり、一方で書込みアクセス権を与えられないことがある。JITコンパイルプロセス212はしかしながら、共有メモリ204−1に対する読取り/書込みアクセス権を認可されることがあり、一方で共有メモリからの実行アクセス権を与えられないことがある。典型的には、共有メモリ204−1ならびにアクセス権認可の管理は、プロセッサ202により実行されるOSにより行われる。共有メモリの初期化は、実行プロセスおよびコンパイルプロセスの両方の初期化において行われることがある。
【0051】
当然に、システム200は、複数のJITコンパイルプロセスを使用して複数の実行プロセス210に対する複数のコードセグメント220をコンパイルしかつ実行するためにプロセス100を適用することができる、しかしながら、簡潔のために、システム200ならびにプロセス100は、1つのJITコンパイルプロセス212によりコンパイルされた1つのコードセグメント220を含んでいる1つのJIT実行プロセス210について説明される。
【0052】
102に示したように、要求が、コードセグメント220をコンパイルするために、実行プロセス210、特にJIT実行プロセス210から、例えば、OSにより受信される。JIT実行プロセス210は、OSにより提供される1つまたは複数のサービス、例えば、システムコール、機能コール、イベントハンドラ、メッセージ、パイプ、等を使用して要求を発行することができる。
【0053】
104に示したように、コードセグメント220をコンパイルするための要求に応じて、JITコンパイルプロセス212が開始される。JITコンパイルプロセス212は、JIT実行プロセス210とは別でありかつ無関係であるプロセスである。JITコンパイルプロセス212の開始は、例えば、コンパイル要求に応じてJITコンパイルプロセス212を起動することを含むことができる。任意選択で、JITコンパイルプロセス212は、前もって、例えば、コンピューティングデバイス201の電源投入時に起動されてもよく、その結果、JITコンパイルプロセス212が、既に実行されている(動作されている)ことがあり、コンパイル要求を待機することができる。例えば、JITコンパイルプロセス212は、アイドルモードで、スリープモードで、等で実行されることがある。コンパイル要求に応じて、JITコンパイルプロセス212が、開始される、例えば、動作モードへと移行されることがある。
【0054】
JITコンパイルプロセス212は、OSにより提供される複数のサービスのうちの1つまたは複数、例えば、メッセージ、パイプ、等を使用してJIT実行プロセス210からコードセグメント220を取得する、例えば、受信する、抽出する、および/または収集することができる。追加でおよび/または代替で、JITコンパイルプロセス212は、JIT実行プロセス210がコードセグメント220を格納した記憶装置204内の共有メモリ位置からコードセグメント220を取り出すことができる。
【0055】
106に示したように、JITコンパイルプロセス212は、プロセッサ202のアーキテクチャに対応するコードを生成することに適応した1つまたは複数のJITコンパイラ、例えば、Javaコンパイラ、JavaScriptエンジン、.NETコンパイラ、等を使用してコードセグメント220をコンパイルすることができる。
【0056】
任意選択で、JITコンパイルプロセス212は、コードセグメント220をコンパイルする前にコードセグメント220を解析するために1つまたは複数のコード解析ツールおよび/または検証ツール、例えば、静的コード解析、等を適用する。コード解析ツールを使用して、JITコンパイルプロセス212は、コードセグメント220が計算デバイス201の処理環境を危うくすることがある悪意のある/変形した/権限を与えられていない行為および/または動作を含むかを識別することによりコードセグメント220を検証する。コード解析ツールを使用して、JITコンパイルプロセス212は、コードセグメント220が許可されたコード構築協定に従って造られ、構築され、および/または配置されていることを検証するために、コードセグメント220内の禁止コード構築実装形態をさらに検出することができる。コードセグメント220が潜在的に悪意があると疑われ得るとJITコンパイルプロセス212が決定する場合には、JITコンパイルプロセス212は、1つまたは複数の措置、例えば、通知の発行、コードセグメント220の隔離、等を行うことができる。
【0057】
任意選択で、JITコンパイルプロセス212は、生成した実行可能なコードセグメント222を検証するために1つまたは複数の解析ツール、例えば、ウィルス駆除ツールを適用することができる。実行可能なコードセグメント222が潜在的に悪意があると疑われ得るとJITコンパイルプロセス212が決定する場合には、JITコンパイルプロセス212は、1つまたは複数の措置、例えば、通知の発行、実行可能なコードセグメント222の隔離、等を行うことができる。
【0058】
108に示したように、JITコンパイルプロセス212は、共有メモリ204−1に実行可能なコードセグメント222を格納する。JITコンパイルプロセス212が共有メモリ204−1への読取り/書込みアクセス権を認可されているので、これは可能である。共有メモリ204−1に実行可能なコードセグメント222を格納できる一方で、共有メモリ204−1に対する実行権を持たないJITコンパイルプロセス212は、実行可能なコードセグメント222を実行しないことがある。
【0059】
しかしながら、コードセグメント220および/または実行可能なコードセグメント222を有効にしている間の場合には、JITコンパイルプロセス212は、コードセグメント220および/または実行可能なコードセグメント222が計算デバイス201の処理環境へのある脅威を表すことができることを決定し、JITコンパイルプロセス212は、JIT実行プロセス210が疑わしい実行可能なコードセグメント222を実行することを防止するために共有メモリ204−1に実行可能なコードセグメント222を格納することを回避することができる。
【0060】
110に示したように、JITコンパイルプロセス212は、共有メモリ204−1内の実行可能なコードセグメント222の位置に対するポインタをJIT実行プロセス210に提供する。JITコンパイルプロセス212は、JIT実行プロセス210へポインタを転送するためにOSにより提供される1つまたは複数のサービス、例えば、システムコール、機能コール、イベントハンドラ、メッセージ、パイプ、等を使用することができる。
【0061】
112に示したように、提供されたポインタを使用して、JIT実行プロセス210は、共有メモリ204−1からの実行可能なコードセグメント222を実行することができる。JIT実行プロセス210が共有メモリ204−1への読取り実行アクセス権を認可されているので、JIT実行プロセス210は、共有メモリ204−1からの実行可能なコードセグメント222を実行することができる。しかしながら、JIT実行プロセス210が共有メモリ204−1への書込みアクセス権を認可されないので、JIT実行プロセス210は、特に新しい実行可能なコードセグメントを生成するために共有メモリ204−1を操作しないことがある。
【0062】
次に、本発明のいくつかの実施形態による、ランタイム環境においてJITでコンパイルしたコードを安全に実行する例示的なシーケンスの概略図である
図3を参照する。シーケンス300は、システム200などのシステム内のコンピューティングデバイス201などのコンピューティングデバイスにより実行されるプロセス100などのプロセスによって行われることがある。JIT実行プロセス210などの実行プロセスは、プロセッサ202などのプロセッサのランタイム処理環境において実行される。JIT実行プロセス210は、コードプログラム命令およびコードセグメント220などの1つまたは複数の未コンパイルのコードセグメントを実行するための実行モジュール302を含む。(1)に示したように、コード生成特権を認可されていなくてもよいJIT実行プロセス210は、コードセグメント220をコンパイルする要求を発行する。要求に応じて、JITコンパイルプロセス212などのJITコンパイルプロセスが起動される。JITコンパイルプロセス212は、1つまたは複数のJITコンパイラモジュール304、例えば、Javaコンパイラ、JavaScriptエンジン、.NETコンパイラ、等を含むことができる。
【0063】
JIT実行プロセス210は、OSサービスのうちの1つまたは複数、例えば、メッセージ、パイプライン、共有メモリ、等を使用してJITコンパイルプロセス212にコードセグメント220を提供することができる。(2)に示したように、JITコンパイルプロセス212がコードセグメント220を取得した後で、JITコンパイルプロセス212は、実行可能なコードセグメント222などの実行可能なコードセグメントを生成するために、コードセグメント220をコンパイルするJITコンパイラモジュール304を開始する。JITコンパイルプロセス212は、次いで、JITコンパイルプロセス212のために読取り/書込みメモリとしてマッピングされる共有メモリ204−1などの共有メモリに実行可能なコードセグメント222を格納することができる。(3)に示したように、OSサービスのうちの1つまたは複数を使用するJITコンパイルプロセス212は、共有メモリ204−1内の実行可能なコードセグメント222の位置を指し示すポインタを提供する。(4)に示したように、読取り実行アクセスのためにマッピングされた共有メモリ204−1を有する実行モジュール302は、共有メモリ204−1から実行可能なコードセグメント222を実行することができる。
【0064】
本出願から成熟する特許権の存続期間中に、多くの関連技術および/または方法が開発されることが予想され、計算デバイスおよびJITコンパイラという用語の範囲は、そのような新技術をすべて先験的に含むように意図される。
【0065】
本明細書で使用する「約」という用語は±10%を指す。
【0066】
「備える」、「備えている」、「含む」、「含んでいる」、「有している」、という用語およびそれらの活用形は、「限定はしないが、含む」を意味する。
【0067】
「からなる」という用語は、「含みかつ限定すること」を意味する。
【0068】
本明細書で使用する単数形「a」、「an」、および「the」は、文脈上別段明確に示されない限り複数の指示内容を含む。例えば、「化合物」または「少なくとも1つの化合物」という用語は、それらの混合物を含む複数の化合物を含むことができる。
【0069】
本出願の全体を通して、本発明の様々な実施形態は、範囲の形式で提示されることがある。範囲の形式での説明は、単に便宜および簡潔のためであり、本発明の範囲に対する柔軟性がない限定と解釈されるべきでないことを理解されたい。したがって、範囲の説明は、すべての可能な部分範囲ならびにその範囲内の個々の数値を具体的に開示したものと考えるべきである。例えば、1から6までなどの範囲の説明は、1から3まで、1から4まで、1から5まで、2から4まで、2から6まで、3から6まで等のような部分範囲、ならびにその範囲内の個々の数、例えば、1、2、3、4、5、および6を具体的に開示したものと考えるべきである。これは、範囲の広さに関係なく適用される。
【0070】
数の範囲が本明細書で示されるときは常に、数の範囲は、示された範囲内の任意の引用される数字(小数または整数)を含むように意図される。第1の表示数と第2の表示数との「間に及んでいる/及ぶ」、ならびに第1の表示数「から」第2の表示数「まで」「及んでいる/及ぶ」という語句は、本明細書では交換可能に使用され、第1および第2の表示された数、ならびにそれらの数の間のすべての小数および整数を含むことを意味する。
【0071】
明確にするために別々の実施形態の文脈で説明されている本発明の特定の特徴は、単一の実施形態において組み合わせて提供されることも可能であることが理解される。逆に、簡潔にするために単一の実施形態の文脈で説明されている本発明の様々な特徴は、本発明の任意の他の説明されている実施形態において、別々に、または任意の適切な部分的組合せで、または好適であるように提供されることも可能である。様々な実施形態の文脈で説明したいくつかの特徴は、それらの要素なしでは実施形態が動作不能である場合を除いて、それらの実施形態の必須の特徴と考えるべきではない。