(57)【要約】  管理されたコードを実行する安全でないアプリケーションプログラムが、安全な仕方で実行される。特に、オペレーティングシステムは、アプリケーションプログラムをユーザーモードで実行するが、カーネルモードで動作する型安全なＪＩＴコンパイラを介して、管理されたコードのコンパイルを処理するように構成される。オペレーティングシステムは、また、単一のメモリロケーションが、異なる許可セットを使用して、複数のアドレス空間を介してアクセスされることも指定可能である。ユーザーモードで動作するアプリケーションプログラムは、読み取り／実行アドレス空間で実行されうるが、ＪＩＴコンパイラは、読み取り／書き込みアドレス空間で実行されうる。中間言語コードへの１つまたは複数のポインタに遭遇した場合、アプリケーションランタイムは、１つまたは複数のコンパイル要求を、その要求を検証するカーネルモードのセキュリティ構成要素に送出できる。要求が検証されると、ＪＩＴコンパイラは、要求された中間言語コードをコンパイルし、アプリケーションプログラムは、共有メモリヒープからコンパイルされたコードにアクセスできる。
2010511227.tif 000002
【特許請求の範囲】
【請求項１】
メモリ、および前記メモリにロードされたＪＩＴコンパイラおよび１つまたは複数のアプリケーションプログラムを含むコンピュータ化された環境において、システムの安全性を脅かさないまたは危うくしないやり方で、信頼できないプログラムコードがコンパイルおよび実行されるように、管理されたコードを実行する方法であって、
共有メモリヒープにアクセスするための第１の１組の許可が設定された第１アドレス空間からアプリケーションプログラムを実行するステップと、
前記アプリケーションプログラムから、１組または複数組の中間言語命令をコンパイルするための１つまたは複数の要求を受け取るステップと、
前記共有メモリヒープにアクセスするための第２の１組の許可を有する第２アドレス空間で実行するＪＩＴコンパイラを使用して、前記１組または複数組の中間言語命令を新規にコンパイルされたコードにコンパイルするステップと、
前記アプリケーションプログラムは、前記第１アドレス空間から前記新規にコンパイルされたコードを取得および実行できる、前記新規にコンパイルされたコードを前記共有メモリヒープに渡すステップと
を含むことを特徴とする方法。
【請求項２】
前記新規にコンパイルされたコードが前記共有メモリヒープに渡されたことが示されると、カーネルモードからユーザーモード動作レベルに切り替える動作をさらに含むことを特徴とする請求項１に記載の方法。
【請求項３】
前記アプリケーションプログラムが前記コンパイルされたコードを受け取り、前記第１アドレス空間から前記コンパイルされたコードを実行する動作をさらに含むことを特徴とする請求項２に記載の方法。
【請求項４】
前記第１アドレス空間で動作する構成要素が前記共有メモリヒープに書き込めないように、前記第１アドレス空間が、前記共有メモリヒープへのアクセスに対する読み取り／実行許可を伴って構成されることを特徴とする請求項１に記載の方法。
【請求項５】
前記第２アドレス空間で動作する構成要素が前記メモリヒープでコードを実行できないように、前記第２アドレス空間が、読み取り／書き込み許可を使用して前記メモリヒープにアクセスするように構成されることを特徴とする請求項１に記載の方法。
【請求項６】
前記ＪＩＴコンパイラは、より高い特権モードで実行し、前記アプリケーションプログラムは、より低い特権モードで実行することを特徴とする請求項１に記載の方法。
【請求項７】
前記ＪＩＴコンパイラは、１つまたは複数の型安全性制約内で実行するように制限されるが、型安全でない中間言語コードを受け入れ、コンパイルするように構成されることを特徴とする請求項１に記載の方法。
【請求項８】
前記ＪＩＴコンパイラは、
前記ＪＩＴコンパイラ用のセキュリティ制約に違反する機能を実行するための１つまたは複数の要求を受け取り、
前記機能を実行するための前記１つまたは複数の要求を拒否し、または前記１組または複数組の中間言語命令のコンパイルを中止する、動作を実行することを特徴とする請求項７に記載の方法。
【請求項９】
前記アプリケーションプログラムから前記１つまたは複数の要求を受け取ると、カーネルモード動作レベルを活性化する動作をさらに含むことを特徴とする請求項１に記載の方法。
【請求項１０】
カーネルモード動作レベルを活性化する前記動作は、カーネルモードのセキュリティ構成要素を開始する動作を含むことを特徴とする請求項９に記載の方法。
【請求項１１】
前記アプリケーションプログラムからの前記１つまたは複数の要求は、カーネルモードのセキュリティ構成要素によって受け取られることを特徴とする請求項１０に記載の方法。
【請求項１２】
前記カーネルモードのセキュリティ構成要素が前記アプリケーションプログラムからの前記１つまたは複数の要求を検証する動作をさらに含むことを特徴とする請求項１１に記載の方法。
【請求項１３】
前記１つまたは複数の要求を検証する前記動作は、前記１つまたは複数の要求に含まれたハンドルが有効かどうかを判定する動作を含むことを特徴とする請求項１２に記載の方法。
【請求項１４】
記憶装置、ＪＩＴコンパイラ、およびメモリにロードされた１つまたは複数のアプリケーションプログラムを含むコンピュータ化された環境において、セキュリティ違反を回避しながらＪＩＴコンパイルを使用するやり方で、コンピュータ実行可能なプログラムコードを生成する方法であって、
実行コードおよびコンパイルされるコードを含むアプリケーションプログラムコードを受け取るステップと、
より低い特権モードおよび第１アドレス空間で前記実行コードを実行するステップと、
コンパイルされる少なくともいくつかのコード用の前記実行コードで１つまたは複数のポインタを識別するステップと、
より高い特権モードに切り替えるステップと、
前記より高い特権モードで動作するコンパイラを使用して、異なるアドレス空間で前記少なくともいくつかのコードをコンパイルするステップと
を含むことを特徴とする方法。
【請求項１５】
前記アプリケーションプログラムコードは、ビデオゲームのオペレーティングシステムの前記記憶装置から受け取ったビデオゲームアプリケーションの部分を含むことを特徴とする請求項１４に記載の方法。
【請求項１６】
前記コンパイラは、型安全な要求のみを処理するように構成されるが、そうでなければ型安全または型安全でない中間言語コードをコンパイルするように構成される、型安全なＪＩＴコンパイラであることを特徴とする請求項１４に記載の方法。
【請求項１７】
前記より高い特権モードはカーネルモード動作レベルであり、前記より低い特権モードはユーザー動作レベルであることを特徴とする請求項１４に記載の方法。
【請求項１８】
前記第１アドレス空間は、読み取り／実行許可を使用して、メモリヒープにアクセスするように構成され、第２アドレス空間は、読み取り／書き込み許可を使用して、前記メモリヒープにアクセスするように構成されることを特徴とする請求項１４に記載の方法。
【請求項１９】
前記少なくともいくつかのコードがコンパイルされたことを識別すると、前記より低い特権モードに切り替え、
前記第１アドレス空間で、前記コンパイルされた少なくともいくつかのコードを実行する、動作をさらに含むことを特徴とする請求項１４に記載の方法。
【請求項２０】
メモリ、ＪＩＴコンパイラ、および前記メモリにロードされた１つまたは複数のアプリケーションプログラムを含むコンピュータ化された環境において、実行時に１つまたは複数のプロセッサに方法を実行させる、その中に格納されたコンピュータ実行可能命令を有するコンピュータプログラム記憶装置製品であって、前記方法は、
共有メモリヒープにアクセスするための第１の１組の許可が設定された第１アドレス空間からアプリケーションプログラムを実行するステップと、
前記アプリケーションプログラムから、１組または複数組の中間言語命令をコンパイルするための１つまたは複数の要求を受け取るステップと、
前記共有メモリヒープにアクセスするための第２の１組の許可を有する第２アドレス空間で実行するＪＩＴコンパイラを使用して、前記１組または複数組の中間言語命令を新規にコンパイルされたコードにコンパイルするステップと、
前記アプリケーションプログラムは、前記第１アドレス空間から前記新規にコンパイルされたコードを取得および実行できる、前記新規にコンパイルされたコードを前記共有メモリヒープに渡すステップと
を含むことを特徴とする方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、信頼性の低いアドレス空間へ実行コードをコンパイルするための情報処理に関する。
【背景技術】
【０００２】
コンピュータシステムは、大衆性が高まり、またコンピュータシステム上で使用される様々なアプリケーションプログラムも同様である。特に、現在では、複雑なオペレーティングシステム、データベースなどとして、または単純な計算器として機能する、多数の目的のために構成された広範なアプリケーションプログラムがある。多くの場合、ソフトウェア開発者は、様々な適切な言語を使用して、特定のオペレーティングシステムを念頭に、新規のアプリケーションプログラムを書くはずである。ソフトウェアが完成すると、開発者は、アプリケーションを、適切なオペレーティングシステムを有するコンピュータシステム上にインストールすることが可能な機械実行コードにコンパイルするはずである。
【０００３】
したがって、しばしば、オペレーティングシステムの開発者および個々のアプリケーションプログラムの開発者によって考慮されなければならない多くの考慮事項があることが理解されよう。これらの関心事の多くは、競合することさえある。たとえば、多くのアプリケーションプログラム開発者は、素早く高速な動作に関係することについて関心を持つが、一方で多くのオペレーティングシステム開発者は、セキュリティおよび安定性に関係することについて関心を持つ。ある場合には、セキュリティおよび安定性の要件は、いくつかのアプリケーションプログラムにより遅い実行および／またはより低い性能をもたせうる。
【０００４】
たとえば、オペレーティングシステムは、アプリケーションプログラムを信頼性の低い「ユーザー」レベルで実行させるが、他のシステム構成要素を信頼できる「カーネル」レベルで実行させるように構成されている。その結果、ユーザーレベルで実行しているアプリケーションプログラムは、中間の信頼できる構成要素を介して所与の機能を要求することにより、ある種類の機能を実行することのみが可能となる。中間の構成要素は、次いで要求を検証し、機能についての要求を、その要求を実行可能なカーネルレベルの構成要素に渡す。
【０００５】
セキュリティ管理の他の方法は、様々なアプリケーションおよび構成要素を制限して特有の読み取り可能、書き込み可能、および／または実行可能とする許可空間を制限する方法である。たとえば、オペレーティングシステムは、あるアプリケーションプログラムを読み取り／実行アドレス空間でのみ実行可能とする。これは、アプリケーションプログラムが任意の既存の命令を実行できるが、アプリケーションが任意の書き込み動作を実行するのを禁止することになる。対照的に、オペレーティングシステムは、他のセンシティブ（ｓｅｎｓｉｔｉｖｅ）なシステム構成要素を読み取り／書き込みアドレス空間でのみ動作可能にすることができる。これは、センシティブな構成要素が新規に書き込むことを行うことはできるが、それらの書き込み（書き込まれた情報）を実行することを禁止することになる。
【０００６】
さらに他の場合では、オペレーティングシステムは、あるコード標準に準拠するある種類のアプリケーションプログラムのみを、読み取り可能、書き込み可能、および実行可能な空間で実行可能とすることができる。たとえば、オペレーティングシステムは、「型安全（ｔｙｐｅ−ｓａｆｅ）」なアプリケーションのみを、読み取り／書き込み／実行アドレス空間で実行可能とすることができる。型安全性（ｔｙｐｅ−ｓａｆｅｔｙ）規則の一例は、浮動小数点値でなく、他の整数値にのみに加算される整数値を要求することである。型安全なコンパイラは、型安全な、したがってオペレーティングシステムによって信頼される、実行可能なプログラムコードのみをコンパイルするのに使用可能である。
【発明の概要】
【発明が解決しようとする課題】
【０００７】
残念ながら、アプリケーションプログラム開発における最近のいくつかの傾向は、前述のセキュリティ管理のアプローチの様々な態様を複雑にしている。たとえば、広範なアプリケーション開発者は、現在、「管理されたコード」を使用してビデオゲームのアプリケーションプログラムを作成している。一般に、管理されたコードは、実行可能なプログラムコード、および必要に応じてコンパイルされる中間言語コードを含む。たとえば、アプリケーションプログラムの開発者は、中間コードへの１つまたは複数の参照を（コンパイルされた、実行コードに）含める。したがって、実行コードが、中間言語コードでのみ利用可能な機能を使用する必要が生じた時点で、ＪＩＴ（ジャストインタイム）コンパイラがある中間言語コードを実行可能命令にコンパイルするのに使用される。
【０００８】
したがって、オペレーティングシステムは、場合によっては、管理されたコードの使用を型安全なアプリケーションに制限することが理解できよう。特に、ＪＩＴコンパイラは書き込む必要があり、アプリケーションは実行する必要があり、さらにアプリケーションプログラムは、ＪＩＴコンパイラによって書かれたコンパイルされたコードにアクセスする必要があるので、ＪＩＴコンパイラおよび実行するアプリケーションプログラムは、通常、読み取り可能、書き込み可能、および実行可能な、同じアドレス空間で動作することになる。したがって、中間言語コードが型安全でない（または、他のあるプログラムコード制約に準拠していない）場合、悪意のある関係者は、ＪＩＴコンパイラを騙して実行される有害な命令を生成することができる。
【０００９】
残念ながら、型安全性などのプログラムコードの制約は、しばしば、速度および性能上の考慮事項と競合すると考えられている。これは、特に、速度および性能上の考慮事項が重要視されるビデオゲームアプリケーションに関して問題となる。したがって、ある場合には、ビデオゲームアプリケーションの開発者は、型安全性などの特有のコード仕様を無視することが、より良いまたはより効率的であると考えることがある。
【課題を解決するための手段】
【００１０】
本発明の実施形態は、管理されたコードが必ずしも任意の特定なコード標準に準拠するとは限らないオペレーティングシステムで、管理されたコードを使用できるように構成された、システム、方法、およびコンピュータプログラム製品を提供する。ある実施形態では、たとえば、オペレーティングシステムは、メモリロケーションが、２つの異なるアドレス空間から異なる許可を使用してアクセス可能であるように、２つの異なるアドレス空間にあるメモリロケーションへのアクセスを提供し、アドレス空間に許可を設定する。ある実施形態では、あるアドレス空間で動作するＪＩＴコンパイラは、コンパイルされたコードを共有メモリヒープに渡す。実行可能なプログラムコードは、メモリヒープからコンパイルされたコードにアクセスし、そのコードを他のメモリアドレス空間で実行する。
【００１１】
たとえば、システムの安全性を脅かさないまたは危うくしないやり方で、信頼できないプログラムコードがコンパイルおよび実行されうるように、管理されたコードを実行する方法は、アプリケーションプログラムをメモリロケーションの第１アドレス空間で実行することを含みうる。その方法は、アプリケーションプログラムから１組または複数組の中間言語命令をコンパイルするための１つまたは複数の要求を受け取ることも含みうる。さらに、その方法は、メモリロケーションの第２アドレス空間で実行するＪＩＴコンパイラを使用して、１組または複数組の中間言語命令を新規にコンパイルされたコードにコンパイルすることを含みうる。さらに、その方法は、新規にコンパイルされたコードを共有メモリヒープに渡すことを含みうる。アプリケーションプログラムは、次いで、第１アドレス空間への共有メモリヒープから、新規にコンパイルされたコードを取得しうる。
【００１２】
同様に、セキュリティ違反を回避しながらＪＩＴコンパイルを使用するやり方で、コンピュータ実行可能なプログラムコードを生成する別の方法は、実行コードおよびコンパイルされるコードを含むアプリケーションプログラムコードを受け取ることを含みうる。その方法は、実行コードをより低い特権モードおよび第１アドレス空間で実行することも含みうる。さらに、その方法は、コンパイルされる少なくともいくつかのコード用の実行コードで１つまたは複数のポインタを識別することを含みうる。さらに、その方法は、より高い特権モードに切り替えることを含みうる。さらに、その方法は、より高い特権モードで動作するコンパイラを使用して、異なるアドレス空間で少なくともいくつかのコードをコンパイルすることを含みうる。
【００１３】
この概要は、下記の詳細な説明でさらに説明する、簡略化した形態での概念の選択を紹介するために提供される。この概要は、請求される主題の主要な特徴または本質的な特徴を識別することを意図しておらず、請求される主題の範囲を決定する助けとして使用されることも意図していない。
【００１４】
本発明のさらなる特徴および利点は、下記で説明され、その一部は説明から自明であり、また本発明の実施によって明らかになるであろう。本発明の特徴および利点は、特に添付の特許請求の範囲で指摘する機器および組合せによって、実現および獲得されうる。これらおよび他の本発明の特徴は、下記の説明および添付の特許請求の範囲から、より完全に明らかになり、また下記に説明する本発明の実施によって明らかになるであろう。
【００１５】
本発明の前述および他の利点および特徴が得られるやり方を説明するために、簡潔に前述した本発明の説明を、添付の図面に示す本発明の特有の実施形態を参照して、より具体的に表す。これらの図面は、本発明の典型的な実施形態を示すのみであり、したがって、その範囲を限定すると見なすべきではないことを理解して、本発明を添付の図面を使用して、さらに具体的および詳細に説明する。
【図面の簡単な説明】
【００１６】
【図１Ａ】信頼できるセキュリティモードでＪＩＴコンパイラによってコンパイルされる管理されたコードを、信頼性の低いセキュリティモードで実行しているアプリケーションプログラムが呼び出す、本発明による実施形態の全体概略図である。
【図１Ｂ】オペレーティングシステムによって管理されるメモリロケーションが、メモリロケーションへの異なるアクセス許可を有する、２つの異なるアドレス空間にある構成要素によってアクセス可能であることを示す概略図である。
【図２】ＪＩＴコンパイラが、中間言語命令の１つまたは複数の要求を受け取り、処理する、本発明の実施形態による一連の動作のフローチャートである。
【図３】オペレーティングシステムが、管理されたコードへの１つまたは複数の参照を含むアプリケーションプログラムを受け取り、１つまたは複数のセキュリティ機構に従ってアプリケーションプログラムを実行する、一連の動作の概略のフローチャートである。
【発明を実施するための形態】
【００１７】
本発明の実施形態は、管理されたコードが必ずしも任意の特定なコード標準に準拠するとは限らないオペレーティングシステムで、管理されたコードを使用できるように構成された、システム、方法、およびコンピュータプログラム製品に及ぶ。ある実施形態では、たとえば、オペレーティングシステムは、メモリロケーションが、２つの異なるアドレス空間から異なる許可を使用してアクセス可能であるように、２つの異なるアドレス空間にあるメモリロケーションへのアクセスを提供し、アドレス空間に許可を設定する。ある実施形態では、あるアドレス空間で動作するＪＩＴコンパイラは、コンパイルされたコードを共有メモリヒープに渡す。実行可能なプログラムコードは、メモリヒープからコンパイルされたコードにアクセスし、そのコードを他のメモリアドレス空間で実行する。
【００１８】
ここでより完全に理解されるように、本発明の実施形態は、生成されたコードがシステムのセキュリティ制約に違反しないことを必ずしも検証する必要なしに、安全なシステムを提供することができる。これは、コンパイルされたコードおよび実行されている他の任意のコードを、少なくとも部分的に「サンドボックス」することにより実現されうる。特に、本発明の実施形態は、任意の種類のコードが実行されうる、本質的には事前定義された１組の境界である、「サンドボックス」を定義できる。具体的には、本明細書で説明するサンドボックス境界は、オペレーティングシステムによって拒否された（ユーザーモード構成要素から来ているので）、または事前定義された許可内のみの動作または機能に制限された（たとえば、読み取り／実行アドレス空間への書き込みを拒否する）、コードを実行することによって作成される、悪意のある（１つまたは複数の）要求を生じることになる。
【００１９】
その結果、ＪＩＴコンパイラ（たとえば、１０５）によって、さらには最終的にＪＩＴコンパイラを呼び出すアプリケーションプログラム（たとえば、１１０）によってコンパイルされるコードは、必ずしも「型安全」ではなく、またいくつかの他のセキュリティ上の考慮事項に準拠することなく、サンドボックス内で実行されうる。これは、これまで可能であったよりも潜在的に制約が少なく、潜在的に高速および性能主導型のやり方で、アプリケーションプログラムコードを書く任意の開発者を解放しうることが理解されよう。
【００２０】
コードが正しく実行されるようにすることに加えて、本発明の実施形態は、ＪＩＴコンパイラ自体が、中間言語コードを受け取り、コンパイルする場合などに、「ハイジャック」されないようにする機構も提供する。特に、本発明の実施形態は、入ってくるコードを型安全性について必ずチェックする、または必ず型安全なコードのみをコンパイルするのではなく、型安全な実行のために構成されたＪＩＴコンパイラを含む。したがって、本発明の実施形態によるＪＩＴコンパイラは、ＪＩＴコンパイラ自体を安全性定義（たとえば、型安全定義）に違反させることになる要求に対して保護されうる。
【００２１】
ある実施形態では、たとえば、ＪＩＴコンパイラは、それ自体のデータ構造、またはシステム１００のランタイムの部分として定義されるデータ構造の外部にＪＩＴコンパイラが到達するのを制限する、型安全性定義を使用して構成されうる。たとえば、ＪＩＴコンパイラは、ある型から別の型へのキャストを実行する場合はいつでも、有効なキャストのみが実行されるようにするために、一連のチェックを実行するように構成されうる。同様に、ＪＩＴコンパイラは、配列から読み取るように要求された場合はいつでも、ＪＩＴコンパイラが配列の範囲内にあるようにする１つまたは複数の境界のチェックを実行するように構成されうる。また、Ｃプログラミング言語内での使用に関して、たとえば、ＪＩＴコンパイラは、「合併集合（ｕｎｉｏｎ）」を使用する場合はいつでも、合併集合の適切な部分を読み取り、また適切な部分に書き込むようにも構成されうる。さらに、ＪＩＴコンパイラは、型スタック（ＪＩＴコンパイラ内の型スタック）を読み取る、または型スタックに書き込む間、オーバーフローまたはアンダーフローを起こさないように構成されうる。
【００２２】
一般に、ＪＩＴコンパイラの型スタックは、正確さなどを維持するのに全体に重要な、内部データ構造である。たとえば、中間言語コードは、通常、ＪＩＴコンパイラがスタック内のオブジェクトに対して順番に動作し、結果を順番にスタックに戻して配置する、スタックベースのシステムである。本発明の実施形態によるＪＩＴコンパイラは、予想どおりに動作するように、スタックをシミュレートするように構成される。たとえば、ＪＩＴコンパイラは、中間言語コードをコンパイルしながら、スタックのシミュレーションを実行できる。シミュレートされたスタックが、ＪＩＴコンパイラが供給されている内容から著しく逸脱する場合、ＪＩＴコンパイラは、コンパイルを停止でき、またはエラーを生成できる。これは、ＪＩＴコンパイラが所定の境界内で動作するようにし、したがって１つまたは複数のセキュリティ規則への違反から保護されるようにするのに役立つ。
【００２３】
図１Ａに、アプリケーションプログラム（すなわち、１１０）が実行されている、コンピュータシステム１００（たとえば、ビデオゲームのオペレーティングシステム）の全体概略図を示す。ある実施形態では、アプリケーションプログラム１１０は、ビデオゲームアプリケーションであるが、アプリケーションプログラム１１０は、任意の種類の実行可能なプログラムコードでよいことが理解されよう。図１Ａは、どのような場合でも、アプリケーションプログラム１１０が、中間言語（「ＩＬ」）コード１２０へのポインタ１４０を含むコンパイルされたコード１３５などの、１組または複数組の実行可能命令を含むことも示す。同様に、図１Ａは、アプリケーションプログラム１１０が、中間言語コード１２５へのポインタ１５０を含むコンパイルされたコード１４５を含むことを示す。中間言語コード１２５は、コード１２０、１２５、１３０などの、実行されうる前にさらにコンパイルを必要とする、いくつかの異なる構成要素またはモジュールを含む。
【００２４】
アプリケーションプログラム１１０がコンピュータシステム１００で実行されるまたは実行されうる、いくつもの異なる方法がある。たとえば、ユーザーは、記憶装置を、システム１００がインストールされた別の装置にロードできる。その記憶装置は、アプリケーションプログラム１１０用のバイナリ実行コード、および中間言語コード１１５の形態での管理されたコードを含みうる。アプリケーションプログラム１１０の実行コードおよび中間言語コードは両方とも、その後、コンピュータシステム１００にロードされうる。他の場合では、開発者などのユーザーは、ネットワーク接続を介して、中間言語コード１１５を含むアプリケーションプログラム１１０をアップロードできる。そのような場合には、ユーザーは、新規に開発されたアプリケーションプログラム（たとえば、１１０）をテストするために、アプリケーションプログラム１１０を実行することができる。
【００２５】
どのような場合でも、図１Ａは、アプリケーションプログラム１１０がより低い特権モード（たとえば、「ユーザー」モード）で実行され、一方ＪＩＴコンパイラ１０５はより高い特権モード（たとえば、「カーネル」モード）で動作していることも示す。たとえば、図１Ａは、アプリケーションプログラム１１０がユーザー特権を有するユーザーモード１１３で動作し、一方ＪＩＴコンパイラ１０５は対応するカーネル特権を有するカーネルモード１０３で動作していることを示す。さらに、図１Ａは、中間言語コード１１５が、カーネル１０３レベルの特権を有する１つまたは複数の構成要素によってアクセスされることを示す。反対に、また本明細書でより完全に理解されるように、実行コードは、ユーザー１１３レベルの特権で動作する構成要素によってのみ実行されることになる。
【００２６】
したがって、アプリケーションプログラム１１０用のランタイムはコンパイルされた命令１３５、１４５のそれぞれをユーザー１１３モードで実行するので、ランタイムは、中間言語コードへの任意の１つまたは複数のポインタに遭遇することになる。たとえば、実行中に、アプリケーションプログラム１１０用のランタイムは、中間言語コード１２０へのポインタ１４０に遭遇する。ポインタ１４０は、カーネル１０３モードでのみアクセスされうるコードを参照するので、ランタイムはユーザーモードから抜け出し、システム１００はカーネル１０３モードに切り替わることになる。
【００２７】
要求１４３は、次いで、カーネル１０３モードで動作するセキュリティ構成要素１５５によって処理されることになる。一般に、セキュリティ構成要素１５５は、ユーザーモード１１３の構成要素の要求（たとえば、１４３）を受け取り、その要求が適切かどうかを検証するように構成された、任意の数または種類の構成要素またはモジュールを含みうる。ユーザーモード１１３は信頼できず、アプリケーションプログラム１１０は、危険なまたは悪意のあるコードを表す（もしくは含む）、または表さない（もしくは含まない）可能性があるので、検証が行われる。
【００２８】
したがって、ユーザーモード１１３の実行からの要求がシステム１００を損なわないようにするために、セキュリティ構成要素１５５は、任意の数または種類の検証機能を実行できる。たとえば、セキュリティ構成要素１５５は、任意の数のハンドル、トークンなどについてメッセージ１４３を確認できる。さらに、セキュリティ構成要素１５５は、特有のメモリアドレス要求などの、システム１００に危害を与えるのに使用されうる、アプリケーション命令についての要求１４３、またはバッファオーバーランを引き起こしうる要求などを確認できる。要求１４３の検証時に、セキュリティ構成要素１５５は、ＪＩＴコンパイラ１０５をカーネルモードで開始できる。
【００２９】
カーネルモードで動作すると、ＪＩＴコンパイラは、次いで要求されたコード（すなわち、１２０）を供給され、コンパイルを開始できる。たとえば、図１Ａは、セキュリティ構成要素１５５が、ＪＩＴコンパイラ１０５に中間言語コード１２０を受け取らせ、コンパイルさせる、１つまたは複数の要求１４７を実行することを示す。コード１２０を実行可能バイナリ命令（すなわち、コンパイルされたコード１２３）にコンパイルした後、図１Ａは、ＪＩＴコンパイラ１０５が、次いで、メモリヒープ１６０にコード１２３を渡し引き渡し可能であることも示す。
【００３０】
図１Ｂに関連してより完全に理解されるように、メモリヒープ１６０は、ユーザーモード１１３動作とカーネルモード１０３動作の境界をまたいでいる。実際には、メモリヒープ１６０は、カーネルモード１０３および／またはユーザーモード１１３で動作する構成要素によってアクセス可能な、許可横断（ｃｒｏｓｓ−ｐｅｒｍｉｓｓｉｏｎ）／境界横断（ｃｒｏｓｓ−ｂｏｕｎｄａｒｙ）の記憶装置として動作する。コンパイルが完了すると、システム１００は、ユーザーモードに戻って、アプリケーションプログラム１１０の実行を継続できる。特に、ユーザーモードで動作しているアプリケーション１１０は、コンパイルされたコード１２３を、利用可能になるとすぐにプルすることができ、ユーザーモード１１３でその実行を開始できる。したがって、メモリヒープ１６０は、ＪＩＴコンパイラ１０５およびユーザー１１３が、直接通信することなく、異なる特権モードで、独立して機能できるようにすることにより、２つのセキュリティ層間のセキュリティ境界の維持に役立つように使用可能なことが理解されよう。
【００３１】
図１Ｂに、ＪＩＴコンパイラ１０５とアプリケーションプログラム１１０の間のセキュリティ境界が、達成または維持される方法についての、追加の詳細を示す。特に、図１Ｂは、ＪＩＴコンパイラ１０５およびアプリケーションプログラム１１０が、それぞれ異なる許可セットを使用して、特定の同じメモリロケーションに対して動作する実施形態を示す。特に、図１Ｂは、同じメモリロケーションが、あるアドレス空間の１組の許可を使用して、あるアドレス空間の構成要素によってアクセス可能であり、異なる１組の許可を使用して、別のアドレス空間の異なる構成要素によってアクセス可能である実施形態を示す。たとえば、図１Ｂは、読み取り／書き込み許可を使用してアドレス空間１７０で、および読み取り／実行許可を使用してアドレス空間１６５で、利用可能なメモリロケーション１６０を示す。
【００３２】
一般に、オペレーティングシステム１００の１つまたは複数のカーネル層１０３の構成要素は、任意の所与のアドレスロケーションおよび対応するアドレス空間用のメモリページテーブル１８０を保持することになる。たとえば、図１Ｂは、メモリページテーブル１８０が、システム１００のカーネル１０３層（すなわち、１つまたは複数のカーネルモードの構成要素）に保持されていることを示す。これがカーネル１０３モードの構成要素に保持されている理由の１つは、信頼できないアプリケーションプログラム（すなわち、ユーザーモードで動作する）が、ページテーブルにアクセスできないようにする、またはページテーブルを不正に操作できないようにすることである。
【００３３】
どのような場合でも、図１Ｂは、ページテーブル１８０が、メモリロケーション１６０および１６５をアドレス空間１７０、１７５、１９０、および１９５に相互に関連付けることを示す。たとえば、メモリロケーション１６０は共有メモリヒープであり、メモリロケーション１６５は、アプリケーションプログラム１１０が実行のためにロードされるロケーションである。さらに、ページテーブル１８０は、アドレス空間１７０および１９０がそれぞれロケーション１６０または１６５への「読み取り／書き込み」アクセスを有するように、メモリロケーション１６０および１６５のアクセス許可をマップする。同様に、ページテーブル１８０は、アドレス空間１７５または１９５についてのメモリロケーション１６０および１６５の許可を「読み取り／実行」としてそれぞれマップする。したがって、セキュリティ構成要素１５５（図１Ａ）がユーザーモード１１３の構成要素から要求（たとえば、１４３）を受け取る場合、セキュリティ構成要素１５５は、要求（たとえば、１４３）を発生した構成要素のアドレス空間を、ＪＩＴコンパイラの出力（たとえば、１２３）のアドレス空間に相互に関連付けることができる。
【００３４】
前述のように、システム１００が許可およびセキュリティ層の境界を強制する方法の１つは、説明したセキュリティ／許可の境界にまたがるメモリヒープ１６０を介することである。一般に、「メモリヒープ」は、ランタイムの間にまたはランタイムの直前に、システム１００によって取っておかれた１組のメモリアドレスを含む。この特定の例では、システム１００は、カーネル層の構成要素（たとえば、ＪＩＴコンパイラ１０５）のみがメモリヒープ１６０に書き込むことができ（たとえば、ページテーブル１８０を介して）、一方、ユーザー層の構成要素はメモリヒープ１６０から読み取りのみが可能なように、メモリヒープ１６０を割り振り、構成することができる。その結果、アプリケーションプログラム１１０は、メモリヒープ１６０ではＪＩＴコンパイラ１０５からの任意のコンパイルされたコードを実行できないが、アドレス空間１７５のみでは実行しなければならない。
【００３５】
したがって、「サンドボックス」は、ユーザーモードでのみアプリケーションの動作を要求すること、および異なる許可セットに関連したメモリアドレスから一定の構成要素またはデータ構造にアクセスするように、アプリケーションおよびＪＩＴコンパイラに要求することにより、設定可能であることが理解されよう。したがって、図１Ａ〜図１Ｂおよび対応する文言は、管理されたコードを安全な方法で含む、実質的には任意の種類の実行コードにアクセスおよび／または実行コードを実行するのに使用される、多くの異なるアーキテクチャの構成要素を示す。特に、図１Ａ〜図１Ｂおよび対応する文言は、アプリケーションが、ユーザー１１３モードで実行でき、ＪＩＴでコンパイルされたコードについての読み取り専用許可または読み取り／実行許可を使用して、メモリヒープにアクセスできる方法を示す。さらに、その図および対応する文言は、アプリケーションが、メモリヒープ１６０についての読み取り／書き込み許可を有する、異なるアドレス空間１７０にある１つまたは複数のカーネル層の構成要素を呼び出すことができ、したがって、管理されたコードをコンパイルして、メモリヒープ１６０に渡すことができるが、実行はできない方法を示す。
【００３６】
前述のように、この種の分散アドレス空間構成は、プログラムの実行および開発に多くの異なる利点をもたらす。まず、たとえば、アプリケーションプログラムの開発者は、安全上の考慮事項（たとえば、型安全性）について心配することなく、実質的に任意の種類のコードを書くことができる。さらに、オペレーティングシステムの開発者は、すべての実行しているプログラムコードを強制的に安全（たとえば、型安全）にさせる、ランタイム検証コードを開発する速度消耗的なリソース（ｓｐｅｅｄ  ｅｘｈａｕｓｔｉｖｅ  ｒｅｓｏｕｒｃｅ）を必要としない。
【００３７】
上記に加えて、本発明の実施形態はまた、特定の結果を達成する方法における１つまたは複数の動作を有するフローチャートに関連して説明される。特に、図２および図３、および対応する文言は、安全なおよび安全でないアプリケーションプログラムコードがセキュリティを脅かすまたは危うくすることなく実行されるように、管理されたコードを実行する、１つまたは複数の動作のフローチャートを示す。図２および図３に示す方法を、図１Ａ〜図１Ｂの構成要素および概略図を参照して、以下に説明する。
【００３８】
したがって、図２は、第１アドレス空間でのアプリケーションの実行の動作２００を含み、クライアントコンピュータシステムから見た方法を示す。動作２００は、メモリロケーションの第１アドレス空間でのアプリケーションプログラムの実行を含む。たとえば、図１Ｂは、アプリケーションプログラム１１０が、メモリロケーション１６０にアクセスするための読み取り／実行許可を有する（すなわち、ＪＩＴでコンパイルされたコードが配置され、したがって読み取り／実行として指定される）、アドレス空間１７５から実行されていることを示す。
【００３９】
図２は、その方法が、中間言語命令についてのアプリケーションからの要求を受け取る動作２１０を含むことも示す。動作２１０は、アプリケーションプログラムから、１組または複数組の中間言語命令をコンパイルするための１つまたは複数の要求を受け取ることを含む。たとえば、アプリケーションプログラム１１０用のランタイムは、カーネル１０３モードでのみアクセス可能な、中間言語コード１２０へのポインタ１４０に遭遇する。したがって、ランタイムは、カーネルモードでの要求を処理するセキュリティ構成要素１５５に、メッセージ１４３としてポインタ１２０を渡す。
【００４０】
さらに、図２は、その方法が、第２アドレス空間で中間言語命令をコンパイルする動作２２０を含むことを示す。動作２２０は、第２アドレス空間で実行するＪＩＴコンパイラを使用して、１組または複数組の中間言語命令を新規にコンパイルされたコードにコンパイルすることを含む。たとえば、要求１４３の検証時に、セキュリティ構成要素１５５は、１つまたは複数の要求１４７を準備および実行して、要求された中間言語コードをＪＩＴコンパイラ１０５に渡す。ＪＩＴコンパイラ１０５は、次いで、この図では共有メモリヒープ１６０への読み取り／書き込み許可を与えられている、第２アドレス空間１７０で中間言語コード１２０をコンパイルする。
【００４１】
さらに、図２は、その方法が、コンパイルされたコードを共有メモリヒープに渡す動作２３０を含むことを示す。動作２３０は、新規にコンパイルされたコードを、アプリケーションプログラムが新規にコンパイルされたコードを第１アドレス空間に取得できる、共有メモリヒープに渡すことを含む。たとえば、図１Ａおよび図１Ｂは、ＪＩＴコンパイラ１０５およびアプリケーションプログラム１１０が、メモリヒープ１６０へのアクセスを有することを示す。特に、ＪＩＴコンパイラ１０５は、メモリヒープ１６０に書き込める（しかしそこでの実行はできない）が、アプリケーションプログラム１１０は、メモリヒープ１６０からの読み取りおよび実行のみ可能である。したがって、ＪＩＴコンパイラ１０５がコード１２３をコンパイルおよび作成する場合、アプリケーションプログラム１１０用のランタイムは、コンパイルされたコード１２３をアドレス空間１７５に取得でき、そのコードをユーザーモードで実行できる。
【００４２】
上記に加えて、図３は、セキュリティ違反を回避しながらＪＩＴコンパイルを使用するやり方で、コンピュータシステム用のコンピュータ実行可能なプログラムコードを生成する、本発明の実施形態による方法は、実行コードおよびコンパイルされるコードを受け取る動作３００を含むことを示す。動作３００は、実行コードおよびコンパイルされるコードを含むプログラムコードを受け取ることを含む。たとえば、オペレーティングシステム１００は、１つまたは複数の記憶媒体を受け取り、および／またはアプリケーションプログラム１１０のネットワークベースのアップロードを受け取る。アプリケーションプログラム１１０は、実行可能なプログラムコード、および１つまたは複数のカーネル層１０３の構成要素によって個別にアクセスされる中間言語コード１１５を含む。
【００４３】
図３は、その方法が、より低い特権モードで実行コードを実行する動作３１０を含むことも示す。動作３１０は、より低い特権モードおよび第１アドレス空間で実行コードを実行することを含む。たとえば、図１Ａは、アプリケーションプログラム１１０の実行可能部分が、ユーザーモード１１３でのみアクセスまたは実行され、これに対して、中間言語コード１１５はカーネルモードの構成要素によってのみアクセスされることを示す。
【００４４】
さらに、図３は、その方法が、コンパイルされるコードへのポインタを受け取る動作３１０を含むことを示す。動作３１０は、実行コードで、コンパイルされる少なくともいくつかのコードへの１つまたは複数のポインタを受け取ることを含む。たとえば、図１Ａ〜図１Ｂは、ユーザーモード１１３で、およびアドレス空間１７５で／から動作するアプリケーションプログラム１１０が、コンパイルされたコード１３５、中間言語コード１２０へのポインタ１４０、コンパイルされたコード１４５、および中間言語コード１２５へのポインタ１５０を含むことを示す。アプリケーションプログラム１１０がユーザーモードで実行されている間に、ポインタ１４０および／または１５０は識別されることになる。
【００４５】
さらに、図３は、その方法が、より高い特権モードに切り替える動作３３０を含むことを示す。たとえば、アプリケーションプログラム１１０用のランタイムは、実行中にポインタ１４０を識別し、ＪＩＴコンパイラ１０５の開始が必要であることを識別する。ＪＩＴコンパイラ１０５は、カーネルモードで動作する必要があるので、システム１００は瞬間的にアプリケーション１１０の実行を一時停止し、ユーザーモードからカーネルモードへ切り替え、ＪＩＴコンパイラ１０５をカーネルモード１０３構成要素として開始する。ポインタ１４０を含むメッセージ１４３は、次いで、カーネルモード１０３のセキュリティ構成要素１５５に渡される。カーネルモードで動作するセキュリティ構成要素１５５は、次いで要求を評価して、要求１４３が正しく形成され、および／または適切なハンドル、セキュリティ識別子などを含むようにする。
【００４６】
さらに、図３は、その方法が、要求されたコードをより高い特権モードでコンパイルする動作３４０を含むことを示す。動作３４０は、より高い特権モードで動作するコンパイラを使用して、要求されたコードを異なるアドレス空間でコンパイルすることを含む。たとえば、図１Ａおよび図１Ｂは、より高い特権のカーネル層１０３で動作するＪＩＴコンパイラ１０５が、あるアドレス空間（アドレス空間１７０）でコード１２０をコンパイルでき、コンパイルされたコード１２３を、ＪＩＴコンパイラが読み取り／書き込みアクセスを有するメモリヒープ１６０にさらに渡すことを示す。ユーザーモードに戻ると、アプリケーションプログラム１１０は、メモリヒープ１６０についての読み取り／実行許可を有する異なるアドレス空間（アドレス空間１７５）から、コンパイルされたコード１２３にアクセスでき、このコードを実行できる。
【００４７】
したがって、図１Ａ〜図２および対応する文言は、重要なセキュリティの保証を犠牲にすることなく、管理されたコードを含む信頼できないコードを実行するのに使用可能な、多くの構成要素、モジュール、および機構を示す。前述のとおり、これは、同じプログラムのための別個のアドレス空間で、中間言語コードのコンパイルとバイナリコードの実行を分離することによって、少なくとも一部分において達成される。さらに、これは、中間コードをコンパイルし、コンパイルされたコードを共有メモリヒープに渡す、型安全なＪＩＴコンパイラを使用して達成される。型安全なＪＩＴコンパイラは、型安全でないコードを受け入れ、コンパイルできる一方、ＪＩＴコンパイラ自体は、一定の所定の型安全性境界の外部で動作することを制限されるように構成される。さらに、これは、実行コードが、ユーザーモードで動作する構成要素によってのみアクセスされるようにし、中間言語コードが、読み取り／書き込みアドレス空間で、カーネルモードで動作する構成要素によってのみアクセスされるようにすることにより達成される。
【００４８】
本発明の実施形態は、下記でより詳細に説明する様々なコンピュータハードウェアを含む、専用または汎用コンピュータを含むことが可能である。本発明の範囲内の実施形態は、その中に格納されたコンピュータ実行可能命令またはデータ構造を搬送し、または有するコンピュータ可読媒体も含む。そのようなコンピュータ可読媒体は、汎用または専用コンピュータによってアクセスされる、任意の入手可能な媒体でよい。
【００４９】
例として、限定としてではなく、そのようなコンピュータ可読媒体は、所望のプログラムコード手段をコンピュータ実行可能命令またはデータ構造の形態で搬送または格納するのに使用でき、汎用または専用コンピュータによってアクセスされる、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、ＣＤ−ＲＯＭもしくは他の光学ディスク記憶装置、磁気ディスク記憶装置もしくは他の磁気記憶装置、または他の任意の媒体を含むことができる。情報が、ネットワークまたは別の通信接続（ハードワイヤード、ワイヤレス、またはハードワイヤードもしくはワイヤレスの組合せ）を介してコンピュータに伝送または供給される場合、コンピュータは、その接続をコンピュータ可読媒体として適切に表示する。したがって、そのような任意の接続は、適切にコンピュータ可読媒体と呼ばれる。上記媒体の組合せも、コンピュータ可読媒体の範囲に含まれるべきである。
【００５０】
コンピュータ実行可能命令は、たとえば、汎用コンピュータ、専用コンピュータ、または専用処理装置に一定の機能または１群の機能を実行させる命令およびデータを含む。主題を構造的な特徴および／または方法論的な動作に特有の用語で説明したが、添付の特許請求の範囲に定義された主題は、必ずしも前述の特有の特徴または動作に限定されるとは限らないことが理解されるべきである。むしろ、前述の特有の特徴および動作は、特許請求の範囲を実施する実例の形態として開示される。
【００５１】
本発明は、その精神または本質的な特徴から逸脱することなく、他の特有の形態で実施可能である。説明した実施形態は、すべての点において例示のみと見なされるべきであり、制限と見なされるべきではない。したがって、本発明の範囲は、前述の説明によってではなく、添付の特許請求の範囲によって示される。特許請求の等価物の意味および範囲に入るすべての変更は、特許請求の範囲に包含される。
【図１Ａ】
2010511227.tif 000003
【図１Ｂ】
2010511227.tif 000004
【図２】
2010511227.tif 000005
【図３】
2010511227.tif 000006
【国際調査報告】
2010511227.tif 000007
2010511227.tif 000008