説明

信頼性の低いアドレス空間への実行コードのコンパイル

管理されたコードを実行する安全でないアプリケーションプログラムが、安全な仕方で実行される。特に、オペレーティングシステムは、アプリケーションプログラムをユーザーモードで実行するが、カーネルモードで動作する型安全なJITコンパイラを介して、管理されたコードのコンパイルを処理するように構成される。オペレーティングシステムは、また、単一のメモリロケーションが、異なる許可セットを使用して、複数のアドレス空間を介してアクセスされることも指定可能である。ユーザーモードで動作するアプリケーションプログラムは、読み取り/実行アドレス空間で実行されうるが、JITコンパイラは、読み取り/書き込みアドレス空間で実行されうる。中間言語コードへの1つまたは複数のポインタに遭遇した場合、アプリケーションランタイムは、1つまたは複数のコンパイル要求を、その要求を検証するカーネルモードのセキュリティ構成要素に送出できる。要求が検証されると、JITコンパイラは、要求された中間言語コードをコンパイルし、アプリケーションプログラムは、共有メモリヒープからコンパイルされたコードにアクセスできる。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、信頼性の低いアドレス空間へ実行コードをコンパイルするための情報処理に関する。
【背景技術】
【0002】
コンピュータシステムは、大衆性が高まり、またコンピュータシステム上で使用される様々なアプリケーションプログラムも同様である。特に、現在では、複雑なオペレーティングシステム、データベースなどとして、または単純な計算器として機能する、多数の目的のために構成された広範なアプリケーションプログラムがある。多くの場合、ソフトウェア開発者は、様々な適切な言語を使用して、特定のオペレーティングシステムを念頭に、新規のアプリケーションプログラムを書くはずである。ソフトウェアが完成すると、開発者は、アプリケーションを、適切なオペレーティングシステムを有するコンピュータシステム上にインストールすることが可能な機械実行コードにコンパイルするはずである。
【0003】
したがって、しばしば、オペレーティングシステムの開発者および個々のアプリケーションプログラムの開発者によって考慮されなければならない多くの考慮事項があることが理解されよう。これらの関心事の多くは、競合することさえある。たとえば、多くのアプリケーションプログラム開発者は、素早く高速な動作に関係することについて関心を持つが、一方で多くのオペレーティングシステム開発者は、セキュリティおよび安定性に関係することについて関心を持つ。ある場合には、セキュリティおよび安定性の要件は、いくつかのアプリケーションプログラムにより遅い実行および/またはより低い性能をもたせうる。
【0004】
たとえば、オペレーティングシステムは、アプリケーションプログラムを信頼性の低い「ユーザー」レベルで実行させるが、他のシステム構成要素を信頼できる「カーネル」レベルで実行させるように構成されている。その結果、ユーザーレベルで実行しているアプリケーションプログラムは、中間の信頼できる構成要素を介して所与の機能を要求することにより、ある種類の機能を実行することのみが可能となる。中間の構成要素は、次いで要求を検証し、機能についての要求を、その要求を実行可能なカーネルレベルの構成要素に渡す。
【0005】
セキュリティ管理の他の方法は、様々なアプリケーションおよび構成要素を制限して特有の読み取り可能、書き込み可能、および/または実行可能とする許可空間を制限する方法である。たとえば、オペレーティングシステムは、あるアプリケーションプログラムを読み取り/実行アドレス空間でのみ実行可能とする。これは、アプリケーションプログラムが任意の既存の命令を実行できるが、アプリケーションが任意の書き込み動作を実行するのを禁止することになる。対照的に、オペレーティングシステムは、他のセンシティブ(sensitive)なシステム構成要素を読み取り/書き込みアドレス空間でのみ動作可能にすることができる。これは、センシティブな構成要素が新規に書き込むことを行うことはできるが、それらの書き込み(書き込まれた情報)を実行することを禁止することになる。
【0006】
さらに他の場合では、オペレーティングシステムは、あるコード標準に準拠するある種類のアプリケーションプログラムのみを、読み取り可能、書き込み可能、および実行可能な空間で実行可能とすることができる。たとえば、オペレーティングシステムは、「型安全(type−safe)」なアプリケーションのみを、読み取り/書き込み/実行アドレス空間で実行可能とすることができる。型安全性(type−safety)規則の一例は、浮動小数点値でなく、他の整数値にのみに加算される整数値を要求することである。型安全なコンパイラは、型安全な、したがってオペレーティングシステムによって信頼される、実行可能なプログラムコードのみをコンパイルするのに使用可能である。
【発明の概要】
【発明が解決しようとする課題】
【0007】
残念ながら、アプリケーションプログラム開発における最近のいくつかの傾向は、前述のセキュリティ管理のアプローチの様々な態様を複雑にしている。たとえば、広範なアプリケーション開発者は、現在、「管理されたコード」を使用してビデオゲームのアプリケーションプログラムを作成している。一般に、管理されたコードは、実行可能なプログラムコード、および必要に応じてコンパイルされる中間言語コードを含む。たとえば、アプリケーションプログラムの開発者は、中間コードへの1つまたは複数の参照を(コンパイルされた、実行コードに)含める。したがって、実行コードが、中間言語コードでのみ利用可能な機能を使用する必要が生じた時点で、JIT(ジャストインタイム)コンパイラがある中間言語コードを実行可能命令にコンパイルするのに使用される。
【0008】
したがって、オペレーティングシステムは、場合によっては、管理されたコードの使用を型安全なアプリケーションに制限することが理解できよう。特に、JITコンパイラは書き込む必要があり、アプリケーションは実行する必要があり、さらにアプリケーションプログラムは、JITコンパイラによって書かれたコンパイルされたコードにアクセスする必要があるので、JITコンパイラおよび実行するアプリケーションプログラムは、通常、読み取り可能、書き込み可能、および実行可能な、同じアドレス空間で動作することになる。したがって、中間言語コードが型安全でない(または、他のあるプログラムコード制約に準拠していない)場合、悪意のある関係者は、JITコンパイラを騙して実行される有害な命令を生成することができる。
【0009】
残念ながら、型安全性などのプログラムコードの制約は、しばしば、速度および性能上の考慮事項と競合すると考えられている。これは、特に、速度および性能上の考慮事項が重要視されるビデオゲームアプリケーションに関して問題となる。したがって、ある場合には、ビデオゲームアプリケーションの開発者は、型安全性などの特有のコード仕様を無視することが、より良いまたはより効率的であると考えることがある。
【課題を解決するための手段】
【0010】
本発明の実施形態は、管理されたコードが必ずしも任意の特定なコード標準に準拠するとは限らないオペレーティングシステムで、管理されたコードを使用できるように構成された、システム、方法、およびコンピュータプログラム製品を提供する。ある実施形態では、たとえば、オペレーティングシステムは、メモリロケーションが、2つの異なるアドレス空間から異なる許可を使用してアクセス可能であるように、2つの異なるアドレス空間にあるメモリロケーションへのアクセスを提供し、アドレス空間に許可を設定する。ある実施形態では、あるアドレス空間で動作するJITコンパイラは、コンパイルされたコードを共有メモリヒープに渡す。実行可能なプログラムコードは、メモリヒープからコンパイルされたコードにアクセスし、そのコードを他のメモリアドレス空間で実行する。
【0011】
たとえば、システムの安全性を脅かさないまたは危うくしないやり方で、信頼できないプログラムコードがコンパイルおよび実行されうるように、管理されたコードを実行する方法は、アプリケーションプログラムをメモリロケーションの第1アドレス空間で実行することを含みうる。その方法は、アプリケーションプログラムから1組または複数組の中間言語命令をコンパイルするための1つまたは複数の要求を受け取ることも含みうる。さらに、その方法は、メモリロケーションの第2アドレス空間で実行するJITコンパイラを使用して、1組または複数組の中間言語命令を新規にコンパイルされたコードにコンパイルすることを含みうる。さらに、その方法は、新規にコンパイルされたコードを共有メモリヒープに渡すことを含みうる。アプリケーションプログラムは、次いで、第1アドレス空間への共有メモリヒープから、新規にコンパイルされたコードを取得しうる。
【0012】
同様に、セキュリティ違反を回避しながらJITコンパイルを使用するやり方で、コンピュータ実行可能なプログラムコードを生成する別の方法は、実行コードおよびコンパイルされるコードを含むアプリケーションプログラムコードを受け取ることを含みうる。その方法は、実行コードをより低い特権モードおよび第1アドレス空間で実行することも含みうる。さらに、その方法は、コンパイルされる少なくともいくつかのコード用の実行コードで1つまたは複数のポインタを識別することを含みうる。さらに、その方法は、より高い特権モードに切り替えることを含みうる。さらに、その方法は、より高い特権モードで動作するコンパイラを使用して、異なるアドレス空間で少なくともいくつかのコードをコンパイルすることを含みうる。
【0013】
この概要は、下記の詳細な説明でさらに説明する、簡略化した形態での概念の選択を紹介するために提供される。この概要は、請求される主題の主要な特徴または本質的な特徴を識別することを意図しておらず、請求される主題の範囲を決定する助けとして使用されることも意図していない。
【0014】
本発明のさらなる特徴および利点は、下記で説明され、その一部は説明から自明であり、また本発明の実施によって明らかになるであろう。本発明の特徴および利点は、特に添付の特許請求の範囲で指摘する機器および組合せによって、実現および獲得されうる。これらおよび他の本発明の特徴は、下記の説明および添付の特許請求の範囲から、より完全に明らかになり、また下記に説明する本発明の実施によって明らかになるであろう。
【0015】
本発明の前述および他の利点および特徴が得られるやり方を説明するために、簡潔に前述した本発明の説明を、添付の図面に示す本発明の特有の実施形態を参照して、より具体的に表す。これらの図面は、本発明の典型的な実施形態を示すのみであり、したがって、その範囲を限定すると見なすべきではないことを理解して、本発明を添付の図面を使用して、さらに具体的および詳細に説明する。
【図面の簡単な説明】
【0016】
【図1A】信頼できるセキュリティモードでJITコンパイラによってコンパイルされる管理されたコードを、信頼性の低いセキュリティモードで実行しているアプリケーションプログラムが呼び出す、本発明による実施形態の全体概略図である。
【図1B】オペレーティングシステムによって管理されるメモリロケーションが、メモリロケーションへの異なるアクセス許可を有する、2つの異なるアドレス空間にある構成要素によってアクセス可能であることを示す概略図である。
【図2】JITコンパイラが、中間言語命令の1つまたは複数の要求を受け取り、処理する、本発明の実施形態による一連の動作のフローチャートである。
【図3】オペレーティングシステムが、管理されたコードへの1つまたは複数の参照を含むアプリケーションプログラムを受け取り、1つまたは複数のセキュリティ機構に従ってアプリケーションプログラムを実行する、一連の動作の概略のフローチャートである。
【発明を実施するための形態】
【0017】
本発明の実施形態は、管理されたコードが必ずしも任意の特定なコード標準に準拠するとは限らないオペレーティングシステムで、管理されたコードを使用できるように構成された、システム、方法、およびコンピュータプログラム製品に及ぶ。ある実施形態では、たとえば、オペレーティングシステムは、メモリロケーションが、2つの異なるアドレス空間から異なる許可を使用してアクセス可能であるように、2つの異なるアドレス空間にあるメモリロケーションへのアクセスを提供し、アドレス空間に許可を設定する。ある実施形態では、あるアドレス空間で動作するJITコンパイラは、コンパイルされたコードを共有メモリヒープに渡す。実行可能なプログラムコードは、メモリヒープからコンパイルされたコードにアクセスし、そのコードを他のメモリアドレス空間で実行する。
【0018】
ここでより完全に理解されるように、本発明の実施形態は、生成されたコードがシステムのセキュリティ制約に違反しないことを必ずしも検証する必要なしに、安全なシステムを提供することができる。これは、コンパイルされたコードおよび実行されている他の任意のコードを、少なくとも部分的に「サンドボックス」することにより実現されうる。特に、本発明の実施形態は、任意の種類のコードが実行されうる、本質的には事前定義された1組の境界である、「サンドボックス」を定義できる。具体的には、本明細書で説明するサンドボックス境界は、オペレーティングシステムによって拒否された(ユーザーモード構成要素から来ているので)、または事前定義された許可内のみの動作または機能に制限された(たとえば、読み取り/実行アドレス空間への書き込みを拒否する)、コードを実行することによって作成される、悪意のある(1つまたは複数の)要求を生じることになる。
【0019】
その結果、JITコンパイラ(たとえば、105)によって、さらには最終的にJITコンパイラを呼び出すアプリケーションプログラム(たとえば、110)によってコンパイルされるコードは、必ずしも「型安全」ではなく、またいくつかの他のセキュリティ上の考慮事項に準拠することなく、サンドボックス内で実行されうる。これは、これまで可能であったよりも潜在的に制約が少なく、潜在的に高速および性能主導型のやり方で、アプリケーションプログラムコードを書く任意の開発者を解放しうることが理解されよう。
【0020】
コードが正しく実行されるようにすることに加えて、本発明の実施形態は、JITコンパイラ自体が、中間言語コードを受け取り、コンパイルする場合などに、「ハイジャック」されないようにする機構も提供する。特に、本発明の実施形態は、入ってくるコードを型安全性について必ずチェックする、または必ず型安全なコードのみをコンパイルするのではなく、型安全な実行のために構成されたJITコンパイラを含む。したがって、本発明の実施形態によるJITコンパイラは、JITコンパイラ自体を安全性定義(たとえば、型安全定義)に違反させることになる要求に対して保護されうる。
【0021】
ある実施形態では、たとえば、JITコンパイラは、それ自体のデータ構造、またはシステム100のランタイムの部分として定義されるデータ構造の外部にJITコンパイラが到達するのを制限する、型安全性定義を使用して構成されうる。たとえば、JITコンパイラは、ある型から別の型へのキャストを実行する場合はいつでも、有効なキャストのみが実行されるようにするために、一連のチェックを実行するように構成されうる。同様に、JITコンパイラは、配列から読み取るように要求された場合はいつでも、JITコンパイラが配列の範囲内にあるようにする1つまたは複数の境界のチェックを実行するように構成されうる。また、Cプログラミング言語内での使用に関して、たとえば、JITコンパイラは、「合併集合(union)」を使用する場合はいつでも、合併集合の適切な部分を読み取り、また適切な部分に書き込むようにも構成されうる。さらに、JITコンパイラは、型スタック(JITコンパイラ内の型スタック)を読み取る、または型スタックに書き込む間、オーバーフローまたはアンダーフローを起こさないように構成されうる。
【0022】
一般に、JITコンパイラの型スタックは、正確さなどを維持するのに全体に重要な、内部データ構造である。たとえば、中間言語コードは、通常、JITコンパイラがスタック内のオブジェクトに対して順番に動作し、結果を順番にスタックに戻して配置する、スタックベースのシステムである。本発明の実施形態によるJITコンパイラは、予想どおりに動作するように、スタックをシミュレートするように構成される。たとえば、JITコンパイラは、中間言語コードをコンパイルしながら、スタックのシミュレーションを実行できる。シミュレートされたスタックが、JITコンパイラが供給されている内容から著しく逸脱する場合、JITコンパイラは、コンパイルを停止でき、またはエラーを生成できる。これは、JITコンパイラが所定の境界内で動作するようにし、したがって1つまたは複数のセキュリティ規則への違反から保護されるようにするのに役立つ。
【0023】
図1Aに、アプリケーションプログラム(すなわち、110)が実行されている、コンピュータシステム100(たとえば、ビデオゲームのオペレーティングシステム)の全体概略図を示す。ある実施形態では、アプリケーションプログラム110は、ビデオゲームアプリケーションであるが、アプリケーションプログラム110は、任意の種類の実行可能なプログラムコードでよいことが理解されよう。図1Aは、どのような場合でも、アプリケーションプログラム110が、中間言語(「IL」)コード120へのポインタ140を含むコンパイルされたコード135などの、1組または複数組の実行可能命令を含むことも示す。同様に、図1Aは、アプリケーションプログラム110が、中間言語コード125へのポインタ150を含むコンパイルされたコード145を含むことを示す。中間言語コード125は、コード120、125、130などの、実行されうる前にさらにコンパイルを必要とする、いくつかの異なる構成要素またはモジュールを含む。
【0024】
アプリケーションプログラム110がコンピュータシステム100で実行されるまたは実行されうる、いくつもの異なる方法がある。たとえば、ユーザーは、記憶装置を、システム100がインストールされた別の装置にロードできる。その記憶装置は、アプリケーションプログラム110用のバイナリ実行コード、および中間言語コード115の形態での管理されたコードを含みうる。アプリケーションプログラム110の実行コードおよび中間言語コードは両方とも、その後、コンピュータシステム100にロードされうる。他の場合では、開発者などのユーザーは、ネットワーク接続を介して、中間言語コード115を含むアプリケーションプログラム110をアップロードできる。そのような場合には、ユーザーは、新規に開発されたアプリケーションプログラム(たとえば、110)をテストするために、アプリケーションプログラム110を実行することができる。
【0025】
どのような場合でも、図1Aは、アプリケーションプログラム110がより低い特権モード(たとえば、「ユーザー」モード)で実行され、一方JITコンパイラ105はより高い特権モード(たとえば、「カーネル」モード)で動作していることも示す。たとえば、図1Aは、アプリケーションプログラム110がユーザー特権を有するユーザーモード113で動作し、一方JITコンパイラ105は対応するカーネル特権を有するカーネルモード103で動作していることを示す。さらに、図1Aは、中間言語コード115が、カーネル103レベルの特権を有する1つまたは複数の構成要素によってアクセスされることを示す。反対に、また本明細書でより完全に理解されるように、実行コードは、ユーザー113レベルの特権で動作する構成要素によってのみ実行されることになる。
【0026】
したがって、アプリケーションプログラム110用のランタイムはコンパイルされた命令135、145のそれぞれをユーザー113モードで実行するので、ランタイムは、中間言語コードへの任意の1つまたは複数のポインタに遭遇することになる。たとえば、実行中に、アプリケーションプログラム110用のランタイムは、中間言語コード120へのポインタ140に遭遇する。ポインタ140は、カーネル103モードでのみアクセスされうるコードを参照するので、ランタイムはユーザーモードから抜け出し、システム100はカーネル103モードに切り替わることになる。
【0027】
要求143は、次いで、カーネル103モードで動作するセキュリティ構成要素155によって処理されることになる。一般に、セキュリティ構成要素155は、ユーザーモード113の構成要素の要求(たとえば、143)を受け取り、その要求が適切かどうかを検証するように構成された、任意の数または種類の構成要素またはモジュールを含みうる。ユーザーモード113は信頼できず、アプリケーションプログラム110は、危険なまたは悪意のあるコードを表す(もしくは含む)、または表さない(もしくは含まない)可能性があるので、検証が行われる。
【0028】
したがって、ユーザーモード113の実行からの要求がシステム100を損なわないようにするために、セキュリティ構成要素155は、任意の数または種類の検証機能を実行できる。たとえば、セキュリティ構成要素155は、任意の数のハンドル、トークンなどについてメッセージ143を確認できる。さらに、セキュリティ構成要素155は、特有のメモリアドレス要求などの、システム100に危害を与えるのに使用されうる、アプリケーション命令についての要求143、またはバッファオーバーランを引き起こしうる要求などを確認できる。要求143の検証時に、セキュリティ構成要素155は、JITコンパイラ105をカーネルモードで開始できる。
【0029】
カーネルモードで動作すると、JITコンパイラは、次いで要求されたコード(すなわち、120)を供給され、コンパイルを開始できる。たとえば、図1Aは、セキュリティ構成要素155が、JITコンパイラ105に中間言語コード120を受け取らせ、コンパイルさせる、1つまたは複数の要求147を実行することを示す。コード120を実行可能バイナリ命令(すなわち、コンパイルされたコード123)にコンパイルした後、図1Aは、JITコンパイラ105が、次いで、メモリヒープ160にコード123を渡し引き渡し可能であることも示す。
【0030】
図1Bに関連してより完全に理解されるように、メモリヒープ160は、ユーザーモード113動作とカーネルモード103動作の境界をまたいでいる。実際には、メモリヒープ160は、カーネルモード103および/またはユーザーモード113で動作する構成要素によってアクセス可能な、許可横断(cross−permission)/境界横断(cross−boundary)の記憶装置として動作する。コンパイルが完了すると、システム100は、ユーザーモードに戻って、アプリケーションプログラム110の実行を継続できる。特に、ユーザーモードで動作しているアプリケーション110は、コンパイルされたコード123を、利用可能になるとすぐにプルすることができ、ユーザーモード113でその実行を開始できる。したがって、メモリヒープ160は、JITコンパイラ105およびユーザー113が、直接通信することなく、異なる特権モードで、独立して機能できるようにすることにより、2つのセキュリティ層間のセキュリティ境界の維持に役立つように使用可能なことが理解されよう。
【0031】
図1Bに、JITコンパイラ105とアプリケーションプログラム110の間のセキュリティ境界が、達成または維持される方法についての、追加の詳細を示す。特に、図1Bは、JITコンパイラ105およびアプリケーションプログラム110が、それぞれ異なる許可セットを使用して、特定の同じメモリロケーションに対して動作する実施形態を示す。特に、図1Bは、同じメモリロケーションが、あるアドレス空間の1組の許可を使用して、あるアドレス空間の構成要素によってアクセス可能であり、異なる1組の許可を使用して、別のアドレス空間の異なる構成要素によってアクセス可能である実施形態を示す。たとえば、図1Bは、読み取り/書き込み許可を使用してアドレス空間170で、および読み取り/実行許可を使用してアドレス空間165で、利用可能なメモリロケーション160を示す。
【0032】
一般に、オペレーティングシステム100の1つまたは複数のカーネル層103の構成要素は、任意の所与のアドレスロケーションおよび対応するアドレス空間用のメモリページテーブル180を保持することになる。たとえば、図1Bは、メモリページテーブル180が、システム100のカーネル103層(すなわち、1つまたは複数のカーネルモードの構成要素)に保持されていることを示す。これがカーネル103モードの構成要素に保持されている理由の1つは、信頼できないアプリケーションプログラム(すなわち、ユーザーモードで動作する)が、ページテーブルにアクセスできないようにする、またはページテーブルを不正に操作できないようにすることである。
【0033】
どのような場合でも、図1Bは、ページテーブル180が、メモリロケーション160および165をアドレス空間170、175、190、および195に相互に関連付けることを示す。たとえば、メモリロケーション160は共有メモリヒープであり、メモリロケーション165は、アプリケーションプログラム110が実行のためにロードされるロケーションである。さらに、ページテーブル180は、アドレス空間170および190がそれぞれロケーション160または165への「読み取り/書き込み」アクセスを有するように、メモリロケーション160および165のアクセス許可をマップする。同様に、ページテーブル180は、アドレス空間175または195についてのメモリロケーション160および165の許可を「読み取り/実行」としてそれぞれマップする。したがって、セキュリティ構成要素155(図1A)がユーザーモード113の構成要素から要求(たとえば、143)を受け取る場合、セキュリティ構成要素155は、要求(たとえば、143)を発生した構成要素のアドレス空間を、JITコンパイラの出力(たとえば、123)のアドレス空間に相互に関連付けることができる。
【0034】
前述のように、システム100が許可およびセキュリティ層の境界を強制する方法の1つは、説明したセキュリティ/許可の境界にまたがるメモリヒープ160を介することである。一般に、「メモリヒープ」は、ランタイムの間にまたはランタイムの直前に、システム100によって取っておかれた1組のメモリアドレスを含む。この特定の例では、システム100は、カーネル層の構成要素(たとえば、JITコンパイラ105)のみがメモリヒープ160に書き込むことができ(たとえば、ページテーブル180を介して)、一方、ユーザー層の構成要素はメモリヒープ160から読み取りのみが可能なように、メモリヒープ160を割り振り、構成することができる。その結果、アプリケーションプログラム110は、メモリヒープ160ではJITコンパイラ105からの任意のコンパイルされたコードを実行できないが、アドレス空間175のみでは実行しなければならない。
【0035】
したがって、「サンドボックス」は、ユーザーモードでのみアプリケーションの動作を要求すること、および異なる許可セットに関連したメモリアドレスから一定の構成要素またはデータ構造にアクセスするように、アプリケーションおよびJITコンパイラに要求することにより、設定可能であることが理解されよう。したがって、図1A〜図1Bおよび対応する文言は、管理されたコードを安全な方法で含む、実質的には任意の種類の実行コードにアクセスおよび/または実行コードを実行するのに使用される、多くの異なるアーキテクチャの構成要素を示す。特に、図1A〜図1Bおよび対応する文言は、アプリケーションが、ユーザー113モードで実行でき、JITでコンパイルされたコードについての読み取り専用許可または読み取り/実行許可を使用して、メモリヒープにアクセスできる方法を示す。さらに、その図および対応する文言は、アプリケーションが、メモリヒープ160についての読み取り/書き込み許可を有する、異なるアドレス空間170にある1つまたは複数のカーネル層の構成要素を呼び出すことができ、したがって、管理されたコードをコンパイルして、メモリヒープ160に渡すことができるが、実行はできない方法を示す。
【0036】
前述のように、この種の分散アドレス空間構成は、プログラムの実行および開発に多くの異なる利点をもたらす。まず、たとえば、アプリケーションプログラムの開発者は、安全上の考慮事項(たとえば、型安全性)について心配することなく、実質的に任意の種類のコードを書くことができる。さらに、オペレーティングシステムの開発者は、すべての実行しているプログラムコードを強制的に安全(たとえば、型安全)にさせる、ランタイム検証コードを開発する速度消耗的なリソース(speed exhaustive resource)を必要としない。
【0037】
上記に加えて、本発明の実施形態はまた、特定の結果を達成する方法における1つまたは複数の動作を有するフローチャートに関連して説明される。特に、図2および図3、および対応する文言は、安全なおよび安全でないアプリケーションプログラムコードがセキュリティを脅かすまたは危うくすることなく実行されるように、管理されたコードを実行する、1つまたは複数の動作のフローチャートを示す。図2および図3に示す方法を、図1A〜図1Bの構成要素および概略図を参照して、以下に説明する。
【0038】
したがって、図2は、第1アドレス空間でのアプリケーションの実行の動作200を含み、クライアントコンピュータシステムから見た方法を示す。動作200は、メモリロケーションの第1アドレス空間でのアプリケーションプログラムの実行を含む。たとえば、図1Bは、アプリケーションプログラム110が、メモリロケーション160にアクセスするための読み取り/実行許可を有する(すなわち、JITでコンパイルされたコードが配置され、したがって読み取り/実行として指定される)、アドレス空間175から実行されていることを示す。
【0039】
図2は、その方法が、中間言語命令についてのアプリケーションからの要求を受け取る動作210を含むことも示す。動作210は、アプリケーションプログラムから、1組または複数組の中間言語命令をコンパイルするための1つまたは複数の要求を受け取ることを含む。たとえば、アプリケーションプログラム110用のランタイムは、カーネル103モードでのみアクセス可能な、中間言語コード120へのポインタ140に遭遇する。したがって、ランタイムは、カーネルモードでの要求を処理するセキュリティ構成要素155に、メッセージ143としてポインタ120を渡す。
【0040】
さらに、図2は、その方法が、第2アドレス空間で中間言語命令をコンパイルする動作220を含むことを示す。動作220は、第2アドレス空間で実行するJITコンパイラを使用して、1組または複数組の中間言語命令を新規にコンパイルされたコードにコンパイルすることを含む。たとえば、要求143の検証時に、セキュリティ構成要素155は、1つまたは複数の要求147を準備および実行して、要求された中間言語コードをJITコンパイラ105に渡す。JITコンパイラ105は、次いで、この図では共有メモリヒープ160への読み取り/書き込み許可を与えられている、第2アドレス空間170で中間言語コード120をコンパイルする。
【0041】
さらに、図2は、その方法が、コンパイルされたコードを共有メモリヒープに渡す動作230を含むことを示す。動作230は、新規にコンパイルされたコードを、アプリケーションプログラムが新規にコンパイルされたコードを第1アドレス空間に取得できる、共有メモリヒープに渡すことを含む。たとえば、図1Aおよび図1Bは、JITコンパイラ105およびアプリケーションプログラム110が、メモリヒープ160へのアクセスを有することを示す。特に、JITコンパイラ105は、メモリヒープ160に書き込める(しかしそこでの実行はできない)が、アプリケーションプログラム110は、メモリヒープ160からの読み取りおよび実行のみ可能である。したがって、JITコンパイラ105がコード123をコンパイルおよび作成する場合、アプリケーションプログラム110用のランタイムは、コンパイルされたコード123をアドレス空間175に取得でき、そのコードをユーザーモードで実行できる。
【0042】
上記に加えて、図3は、セキュリティ違反を回避しながらJITコンパイルを使用するやり方で、コンピュータシステム用のコンピュータ実行可能なプログラムコードを生成する、本発明の実施形態による方法は、実行コードおよびコンパイルされるコードを受け取る動作300を含むことを示す。動作300は、実行コードおよびコンパイルされるコードを含むプログラムコードを受け取ることを含む。たとえば、オペレーティングシステム100は、1つまたは複数の記憶媒体を受け取り、および/またはアプリケーションプログラム110のネットワークベースのアップロードを受け取る。アプリケーションプログラム110は、実行可能なプログラムコード、および1つまたは複数のカーネル層103の構成要素によって個別にアクセスされる中間言語コード115を含む。
【0043】
図3は、その方法が、より低い特権モードで実行コードを実行する動作310を含むことも示す。動作310は、より低い特権モードおよび第1アドレス空間で実行コードを実行することを含む。たとえば、図1Aは、アプリケーションプログラム110の実行可能部分が、ユーザーモード113でのみアクセスまたは実行され、これに対して、中間言語コード115はカーネルモードの構成要素によってのみアクセスされることを示す。
【0044】
さらに、図3は、その方法が、コンパイルされるコードへのポインタを受け取る動作310を含むことを示す。動作310は、実行コードで、コンパイルされる少なくともいくつかのコードへの1つまたは複数のポインタを受け取ることを含む。たとえば、図1A〜図1Bは、ユーザーモード113で、およびアドレス空間175で/から動作するアプリケーションプログラム110が、コンパイルされたコード135、中間言語コード120へのポインタ140、コンパイルされたコード145、および中間言語コード125へのポインタ150を含むことを示す。アプリケーションプログラム110がユーザーモードで実行されている間に、ポインタ140および/または150は識別されることになる。
【0045】
さらに、図3は、その方法が、より高い特権モードに切り替える動作330を含むことを示す。たとえば、アプリケーションプログラム110用のランタイムは、実行中にポインタ140を識別し、JITコンパイラ105の開始が必要であることを識別する。JITコンパイラ105は、カーネルモードで動作する必要があるので、システム100は瞬間的にアプリケーション110の実行を一時停止し、ユーザーモードからカーネルモードへ切り替え、JITコンパイラ105をカーネルモード103構成要素として開始する。ポインタ140を含むメッセージ143は、次いで、カーネルモード103のセキュリティ構成要素155に渡される。カーネルモードで動作するセキュリティ構成要素155は、次いで要求を評価して、要求143が正しく形成され、および/または適切なハンドル、セキュリティ識別子などを含むようにする。
【0046】
さらに、図3は、その方法が、要求されたコードをより高い特権モードでコンパイルする動作340を含むことを示す。動作340は、より高い特権モードで動作するコンパイラを使用して、要求されたコードを異なるアドレス空間でコンパイルすることを含む。たとえば、図1Aおよび図1Bは、より高い特権のカーネル層103で動作するJITコンパイラ105が、あるアドレス空間(アドレス空間170)でコード120をコンパイルでき、コンパイルされたコード123を、JITコンパイラが読み取り/書き込みアクセスを有するメモリヒープ160にさらに渡すことを示す。ユーザーモードに戻ると、アプリケーションプログラム110は、メモリヒープ160についての読み取り/実行許可を有する異なるアドレス空間(アドレス空間175)から、コンパイルされたコード123にアクセスでき、このコードを実行できる。
【0047】
したがって、図1A〜図2および対応する文言は、重要なセキュリティの保証を犠牲にすることなく、管理されたコードを含む信頼できないコードを実行するのに使用可能な、多くの構成要素、モジュール、および機構を示す。前述のとおり、これは、同じプログラムのための別個のアドレス空間で、中間言語コードのコンパイルとバイナリコードの実行を分離することによって、少なくとも一部分において達成される。さらに、これは、中間コードをコンパイルし、コンパイルされたコードを共有メモリヒープに渡す、型安全なJITコンパイラを使用して達成される。型安全なJITコンパイラは、型安全でないコードを受け入れ、コンパイルできる一方、JITコンパイラ自体は、一定の所定の型安全性境界の外部で動作することを制限されるように構成される。さらに、これは、実行コードが、ユーザーモードで動作する構成要素によってのみアクセスされるようにし、中間言語コードが、読み取り/書き込みアドレス空間で、カーネルモードで動作する構成要素によってのみアクセスされるようにすることにより達成される。
【0048】
本発明の実施形態は、下記でより詳細に説明する様々なコンピュータハードウェアを含む、専用または汎用コンピュータを含むことが可能である。本発明の範囲内の実施形態は、その中に格納されたコンピュータ実行可能命令またはデータ構造を搬送し、または有するコンピュータ可読媒体も含む。そのようなコンピュータ可読媒体は、汎用または専用コンピュータによってアクセスされる、任意の入手可能な媒体でよい。
【0049】
例として、限定としてではなく、そのようなコンピュータ可読媒体は、所望のプログラムコード手段をコンピュータ実行可能命令またはデータ構造の形態で搬送または格納するのに使用でき、汎用または専用コンピュータによってアクセスされる、RAM、ROM、EEPROM、CD−ROMもしくは他の光学ディスク記憶装置、磁気ディスク記憶装置もしくは他の磁気記憶装置、または他の任意の媒体を含むことができる。情報が、ネットワークまたは別の通信接続(ハードワイヤード、ワイヤレス、またはハードワイヤードもしくはワイヤレスの組合せ)を介してコンピュータに伝送または供給される場合、コンピュータは、その接続をコンピュータ可読媒体として適切に表示する。したがって、そのような任意の接続は、適切にコンピュータ可読媒体と呼ばれる。上記媒体の組合せも、コンピュータ可読媒体の範囲に含まれるべきである。
【0050】
コンピュータ実行可能命令は、たとえば、汎用コンピュータ、専用コンピュータ、または専用処理装置に一定の機能または1群の機能を実行させる命令およびデータを含む。主題を構造的な特徴および/または方法論的な動作に特有の用語で説明したが、添付の特許請求の範囲に定義された主題は、必ずしも前述の特有の特徴または動作に限定されるとは限らないことが理解されるべきである。むしろ、前述の特有の特徴および動作は、特許請求の範囲を実施する実例の形態として開示される。
【0051】
本発明は、その精神または本質的な特徴から逸脱することなく、他の特有の形態で実施可能である。説明した実施形態は、すべての点において例示のみと見なされるべきであり、制限と見なされるべきではない。したがって、本発明の範囲は、前述の説明によってではなく、添付の特許請求の範囲によって示される。特許請求の等価物の意味および範囲に入るすべての変更は、特許請求の範囲に包含される。

【特許請求の範囲】
【請求項1】
メモリ、および前記メモリにロードされたJITコンパイラおよび1つまたは複数のアプリケーションプログラムを含むコンピュータ化された環境において、システムの安全性を脅かさないまたは危うくしないやり方で、信頼できないプログラムコードがコンパイルおよび実行されるように、管理されたコードを実行する方法であって、
共有メモリヒープにアクセスするための第1の1組の許可が設定された第1アドレス空間からアプリケーションプログラムを実行するステップと、
前記アプリケーションプログラムから、1組または複数組の中間言語命令をコンパイルするための1つまたは複数の要求を受け取るステップと、
前記共有メモリヒープにアクセスするための第2の1組の許可を有する第2アドレス空間で実行するJITコンパイラを使用して、前記1組または複数組の中間言語命令を新規にコンパイルされたコードにコンパイルするステップと、
前記アプリケーションプログラムは、前記第1アドレス空間から前記新規にコンパイルされたコードを取得および実行できる、前記新規にコンパイルされたコードを前記共有メモリヒープに渡すステップと
を含むことを特徴とする方法。
【請求項2】
前記新規にコンパイルされたコードが前記共有メモリヒープに渡されたことが示されると、カーネルモードからユーザーモード動作レベルに切り替える動作をさらに含むことを特徴とする請求項1に記載の方法。
【請求項3】
前記アプリケーションプログラムが前記コンパイルされたコードを受け取り、前記第1アドレス空間から前記コンパイルされたコードを実行する動作をさらに含むことを特徴とする請求項2に記載の方法。
【請求項4】
前記第1アドレス空間で動作する構成要素が前記共有メモリヒープに書き込めないように、前記第1アドレス空間が、前記共有メモリヒープへのアクセスに対する読み取り/実行許可を伴って構成されることを特徴とする請求項1に記載の方法。
【請求項5】
前記第2アドレス空間で動作する構成要素が前記メモリヒープでコードを実行できないように、前記第2アドレス空間が、読み取り/書き込み許可を使用して前記メモリヒープにアクセスするように構成されることを特徴とする請求項1に記載の方法。
【請求項6】
前記JITコンパイラは、より高い特権モードで実行し、前記アプリケーションプログラムは、より低い特権モードで実行することを特徴とする請求項1に記載の方法。
【請求項7】
前記JITコンパイラは、1つまたは複数の型安全性制約内で実行するように制限されるが、型安全でない中間言語コードを受け入れ、コンパイルするように構成されることを特徴とする請求項1に記載の方法。
【請求項8】
前記JITコンパイラは、
前記JITコンパイラ用のセキュリティ制約に違反する機能を実行するための1つまたは複数の要求を受け取り、
前記機能を実行するための前記1つまたは複数の要求を拒否し、または前記1組または複数組の中間言語命令のコンパイルを中止する、動作を実行することを特徴とする請求項7に記載の方法。
【請求項9】
前記アプリケーションプログラムから前記1つまたは複数の要求を受け取ると、カーネルモード動作レベルを活性化する動作をさらに含むことを特徴とする請求項1に記載の方法。
【請求項10】
カーネルモード動作レベルを活性化する前記動作は、カーネルモードのセキュリティ構成要素を開始する動作を含むことを特徴とする請求項9に記載の方法。
【請求項11】
前記アプリケーションプログラムからの前記1つまたは複数の要求は、カーネルモードのセキュリティ構成要素によって受け取られることを特徴とする請求項10に記載の方法。
【請求項12】
前記カーネルモードのセキュリティ構成要素が前記アプリケーションプログラムからの前記1つまたは複数の要求を検証する動作をさらに含むことを特徴とする請求項11に記載の方法。
【請求項13】
前記1つまたは複数の要求を検証する前記動作は、前記1つまたは複数の要求に含まれたハンドルが有効かどうかを判定する動作を含むことを特徴とする請求項12に記載の方法。
【請求項14】
記憶装置、JITコンパイラ、およびメモリにロードされた1つまたは複数のアプリケーションプログラムを含むコンピュータ化された環境において、セキュリティ違反を回避しながらJITコンパイルを使用するやり方で、コンピュータ実行可能なプログラムコードを生成する方法であって、
実行コードおよびコンパイルされるコードを含むアプリケーションプログラムコードを受け取るステップと、
より低い特権モードおよび第1アドレス空間で前記実行コードを実行するステップと、
コンパイルされる少なくともいくつかのコード用の前記実行コードで1つまたは複数のポインタを識別するステップと、
より高い特権モードに切り替えるステップと、
前記より高い特権モードで動作するコンパイラを使用して、異なるアドレス空間で前記少なくともいくつかのコードをコンパイルするステップと
を含むことを特徴とする方法。
【請求項15】
前記アプリケーションプログラムコードは、ビデオゲームのオペレーティングシステムの前記記憶装置から受け取ったビデオゲームアプリケーションの部分を含むことを特徴とする請求項14に記載の方法。
【請求項16】
前記コンパイラは、型安全な要求のみを処理するように構成されるが、そうでなければ型安全または型安全でない中間言語コードをコンパイルするように構成される、型安全なJITコンパイラであることを特徴とする請求項14に記載の方法。
【請求項17】
前記より高い特権モードはカーネルモード動作レベルであり、前記より低い特権モードはユーザー動作レベルであることを特徴とする請求項14に記載の方法。
【請求項18】
前記第1アドレス空間は、読み取り/実行許可を使用して、メモリヒープにアクセスするように構成され、第2アドレス空間は、読み取り/書き込み許可を使用して、前記メモリヒープにアクセスするように構成されることを特徴とする請求項14に記載の方法。
【請求項19】
前記少なくともいくつかのコードがコンパイルされたことを識別すると、前記より低い特権モードに切り替え、
前記第1アドレス空間で、前記コンパイルされた少なくともいくつかのコードを実行する、動作をさらに含むことを特徴とする請求項14に記載の方法。
【請求項20】
メモリ、JITコンパイラ、および前記メモリにロードされた1つまたは複数のアプリケーションプログラムを含むコンピュータ化された環境において、実行時に1つまたは複数のプロセッサに方法を実行させる、その中に格納されたコンピュータ実行可能命令を有するコンピュータプログラム記憶装置製品であって、前記方法は、
共有メモリヒープにアクセスするための第1の1組の許可が設定された第1アドレス空間からアプリケーションプログラムを実行するステップと、
前記アプリケーションプログラムから、1組または複数組の中間言語命令をコンパイルするための1つまたは複数の要求を受け取るステップと、
前記共有メモリヒープにアクセスするための第2の1組の許可を有する第2アドレス空間で実行するJITコンパイラを使用して、前記1組または複数組の中間言語命令を新規にコンパイルされたコードにコンパイルするステップと、
前記アプリケーションプログラムは、前記第1アドレス空間から前記新規にコンパイルされたコードを取得および実行できる、前記新規にコンパイルされたコードを前記共有メモリヒープに渡すステップと
を含むことを特徴とする方法。

【図1A】
image rotate

【図1B】
image rotate

【図2】
image rotate

【図3】
image rotate


【公表番号】特表2010−511227(P2010−511227A)
【公表日】平成22年4月8日(2010.4.8)
【国際特許分類】
【出願番号】特願2009−538535(P2009−538535)
【出願日】平成19年11月27日(2007.11.27)
【国際出願番号】PCT/US2007/085664
【国際公開番号】WO2008/067329
【国際公開日】平成20年6月5日(2008.6.5)
【出願人】(500046438)マイクロソフト コーポレーション (3,165)
【Fターム(参考)】