本発明の実施形態は、セキュアなアプリケーションおよびデータを柔軟に且つ信頼性高く提供する技術に係る。本発明には複数の態様の複数の実施形態があるが、「セキュアなエンクレーブアーキテクチャ」なる添付書類を、少なくとも1つの実施形態としてここに参照として組み込む。しかし、組み込まれた文献は、本発明の実施形態の範囲を制限するものではなく、本発明の精神および範囲内で他の実施形態も利用可能である。
図1は、本発明の少なくとも1つの実施形態を利用することができるマイクロプロセッサのブロック図である。特に図1は、それぞれがローカルキャッシュ107と113とに関連付けられた1以上のプロセッサコア105および110を有するマイクロプロセッサ100を示す。さらに図1には、ローカルキャッシュ107および113のそれぞれに格納されている情報の少なくとも一部のバージョンを格納する共有キャッシュメモリ115が示されている。一部の実施形態では、マイクロプロセッサ110はまた、図1に示されていない他の論理(例えば、集積メモリコントローラ、集積グラフィックコントローラ、および、コンピュータシステム内の、例えばI/O制御等の他の機能を実行する論理)を含むこともできる。一実施形態では、マルチプロセッサシステム内の各マイクロプロセッサまたはマルチコアプロセッサ内の各プロセッサコアは、少なくとも1つの実施形態では、セキュアなエンクレーブ技術を実行するための論理119を含む、または論理119と関連付けられている。論理には回路、ソフトウェア(有形媒体に具現化されている)、またはこれら両方を含むことで、一部の先行技術の実装例よりも効率的に複数のコアまたはプロセッサ間のリソース割り当てを行うことができる。
例えば図2は、本発明の一実施形態を利用することができるフロントサイドバス(FSB)コンピュータシステムを示す。プロセッサ201、205,210、または215いずれもが、プロセッサコア223、227、233、237、243、247、253、257を含む、またはこれらと関連付けられているローカルレベル1(L1)キャッシュメモリ220、225、230、235、240、245、250、255のうちいずれかの情報にアクセスすることができる。さらには、プロセッサ201、205、210、または215いずれもが、チップセット265を介して、システムメモリ260から、または、共有レベル2(L2)キャッシュ203、207、213、217のいずれかからの情報にアクセスすることができる。図2に示すプロセッサのうち1以上は、少なくとも一実施形態におけるセキュアなエンクレーブ技術を実行する論理219を含む、または論理219と関連付けられてよい。
図2に示すFSBコンピュータシステムに加えて、ポイントツーポイント(P2P)インターコネクトシステムおよびリングインターコネクトシステム等の他のシステム構成を、本発明の様々な実施形態と協働して利用することもできる。例えば図3のP2Pシステムは、幾つかプロセッサを含むことができ、このうち2つのプロセッサ370、380が例示されている。プロセッサ370、380はそれぞれ、メモリ32、34と接続するためにローカルメモリコントローラハブ(MCH)372、382を含んでよい。プロセッサ370、380は、PtPインタフェース回路378、388を利用してポイントツーポイント(PtP)インタフェース350を介してデータを交換することができる。プロセッサ370、380はそれぞれ、ポイントツーポイントインタフェース回路376、394、386、398を利用して個々のPtPインタフェース352、354を介してチップセット390とデータを交換することができる。チップセット390はさらに、高性能グラフィックインタフェース339を介して高性能グラフィック回路338とデータを交換することができる。本発明の実施形態は、任意の数のプロセッサコアを有する任意のプロセッサ内に配置されてもよいし、または、図3のPtPバスエージェントそれぞれの内部に配置されてもよい。一実施形態では、任意のプロセッサコアが、ローカルキャッシュメモリ(不図示)を含む、またはこれと関連付けられていてよい。さらに、共有キャッシュ(不図示)が、両プロセッサ外のプロセッサに含まれていながらも、p2pインターコネクトを介して両プロセッサに接続されており、プロセッサを低電力モードにする場合、これらプロセッサの両方または片方のローカルキャッシュ情報を共有キャッシュに格納できる、という構成も可能である。図3に示す1以上のプロセッサまたはコアは、少なくとも1つの実施形態においては、セキュアなエンクレーブ技術を実行する論理319を含む、または論理319と関連付けられていてよい。
少なくとも1つの実施形態の1以上の態様は、プロセッサ内の様々な論理を表す機械可読媒体に格納される代表的なデータにより実装することができ、データが機械により読み出されることで、機械は、ここに記載する技術を実行する論理を製造する。「IPコア」として知られているような表現は、有形の機械可読媒体(「テープ」)に格納されて、論理またはプロセッサを実際に製造する製造機械に装填するために様々な顧客または製造用設備に供給されてよい。
従って、マイクロアーキテクチャメモリ領域アクセスを方向付ける方法および装置が記載された。上述した記載は、例示を意図しており限定は意図していない。数多くの他の実施形態も、上述した記載を読み理解した当業者には明らかであろう。従って本発明の範囲は、添付請求項および請求項が含みうる均等物の全範囲を参照して決定される。
セキュアなエンクレーブは、アプリケーションにOSプロセスのコンテキスト内でコードを実行してデータを格納させるための安全な場所を提供する命令セットである。この環境下で実行されるアプリケーションはエンクレーブと称される。エンクレーブは、エンクレーブページキャッシュ(EPC)から実行される。エンクレーブページは、OSによりEPCに装填される。エンクレーブのページがEPCから取り出されるたびに、暗号保護を利用して、エンクレーブの機密性を保護して、エンクレーブをEPCに戻すときの改ざんを検知することができる。EPC内で、エンクレーブデータは、プロセッサが提供するアクセス制御メカニズムを利用して保護される。以下の表2−1は、特権のないエンクレーブ命令の完全リストを提供している。
これらの命令はリング3でのみ実行される。全ての他の時点においては、これらは#UD不良を生成する。表2−2は、特権を有する命令のリストを提供する。
エンクレーブページキャッシュ(EPC)は、エンクレーブコードを実行して、保護されたエンクレーブデータにアクセスする場所である。EPCは、プラットフォームの物理アドレス空間内に配置されるが、アクセスはSE命令を利用してのみ可能となる。EPCは、多くの異なるエンクレーブからのページを含んでよく、ページの整合性および機密性を保護するアクセス制御メカニズムを提供する。ページキャッシュは、プラットフォームのコヒーレントな物理メモリに利用されるものに類似したコヒーレンスプロトコルを維持している。
EPCは幾つかの方法でインスタンス化することができる。例えば、プロセッサパッケージ上の専用SRAMから構築することができる。クリプト・メモリ・アパーチャ(Crypto Memory Aperture)が好適な実装メカニズムとして知られている。このメカニズムにより、EPCを大きくすることができる。CMAについては以下で詳述する。
エンクレーブページキャッシュマップ(EPCM)は、EPC内の各ページに関連付けられた状態情報を含む。この状態は、ページが属すエンクレーブ、装填されるページの状態等の情報を提供する。EPCからページが取り出されると、状態情報もエクスポートされて、暗号手段を利用して保護される。エンクレーブページをEPCに再装填するときには、状態情報を検証する。
図4は、本発明の少なくとも1つの実施形態を利用することができるマルチコアマイクロプロセッサ499のブロック図である。マイクロプロセッサ499は、複数のコア400、420を含むことができる。コア400は、CR3 402、SMBR404、ページミスハンドラ408、PMHE410、および変換ルックアサイドバッファ412を含むことができる。コア420は、CR3 422、SMBR424、ページミスハンドラ428、PMHE430、および変換ルックアサイドバッファ432を含むことができる。本発明の一部の実施形態では、マイクロプロセッサ499は、コア400とコア420との間で共有されるレベル1キャッシュ440を含む。レベル1キャッシュ440は、最終レベルのキャッシュ445との間でデータをやりとりすることができる。ホームエージェント450は、最終レベルのキャッシュ445に接続して、暗号エンジン452に接続(attach to)することができる。ホームエージェント450は、クリプト・メモリ・アパーチャ480の物理アドレス空間488を、メモリコントローラ454を介して評価(assess)することができる。クリプト・メモリ・アパーチャ480は、エンクレーブページキャッシュ482、エンクレーブページキャッシュマップ484、補助格納部486、物理アドレス空間の一部488を含む。
CMAは、EPC、EPCM、その他SE関連の構造をインスタンス化する助けを行うメカニズムである。アパーチャとは、この目的の利用に備えさせられる物理アドレス空間の一領域のことである。
EPCおよびEPCM(およびその他の実装データ構造)は、アパーチャ内のある位置にマッピングされる。補助格納部は、これらリソースのための実際のデータのことである。EPCのメモリ要求が生成されると、CMAは、暗号化されたEPCデータが含まれている補助格納部の位置に再マッピングを行い、そのデータを取得する。
一般的には、殆どのSEは、マイクロコードに実装される。CMA、パッケージ外およびコア内のデータ移動制御する論理を含む複数の位置にハードウェアによるサポートが必要である。
図5は、本発明の一実施形態のセキュアなエンクレーブ(SE)の可能性のある実装例である。オペレーティングシステムおよびVMM542は、ELPG命令540を利用して、エンクレーブ532のエンクレーブページを、エンクレーブページキャッシュ544に装填することができる。マイクロプロセッサがエンクレーブ532内で実行していないときには、エンクレーブページキャッシュ544はSERRレジスタ532によるソフトウェアアクセスから保護される。エンクレーブ内で実行する場合には、マイクロコードページテーブルが保護548を提供する。各VMにはVMCSが関連付けられている。VM510はVMCS515に接続されている。VM520はVMCS525に接続されている。VM530はVMCS535に接続されている。SMM500は、別個のコンテナにあってよく、プロセッサ状態は別個のコンテナにあってよい。
図5は、セキュアなエンクレーブ実装の一実施形態の高レベル概略図である。この実装例では、EPCは、マイクロコードが管理する別個のコンテナに維持されている。コンテナは、エンクレーブ内で実行されていない場合にはアクセス不可能である。エンクレーブに入った場合には、制御は、別個のコンテナに含まれているEPC内のエンクレーブコードに移される。
エンクレーブ内で実行されている間に起こったページ不良または例外は全て、マイクロコードにより関連OSまたはVMMに反映される。機械がエンクレーブ内で実行していない場合には、EPCへのアクセス制御はSEレンジレジスタ(SERR)により提供される。機械が内部で実行されている場合には、マイクロコードはページテーブルレベルの保護を提供して、実行されているエンクレーブに属さない他のEPCエントリへのアクセスを禁止する。
セキュアなエンクレーブを実装する一方法に、一部のプロセッサ内のマイクロコード機能を利用して命令および保護を行う、というものがある。この機能は、エンクレーブの目的達成をセキュアに行うというセキュリティ要件に適合しているだろう。
図2−2に示すSERRレジスタは、ページミスハンドラPMHに実装される。レジスタは、各論理プロセッサについて独立してイネーブルおよびディセーブルされてよい。
性能を向上させる実装におけるオプションとして、変換ルックアサイドバッファ(TLB)のエントリがエンクレーブまたは特定のエンクレーブ用であることを示すために、1ビットまたは幾つかのビットを提供する、というものがある。これらのビットが提供されていない場合には、エンクレーブを退出するときに、他のコードがこのエンクレーブにアクセスしないようにするためにTLBフラッシュが必要となる。
エンクレーブビットをエンクレーブモードビットと比較する。余剰ビットは、エンクレーブ空間idの機能を提供する。特定のエンクレーブはidを割り当てられてよい。idは、アドレスチェックの一環として、実行中のエンクレーブのidと比較される。TLBサポートは、性能向上策の1つのオプションである。EPCデータの除去によってあるエントリがTLBで無効化された場合、特定のマイクロコード化された撃墜メカニズム(special microcoded shootdown mechanism)が必要となる。一実施形態では、マイクロコードがエンクレーブ信頼境界(enclave trust boundary)内の全ての他のコアと接触をとり、このエントリがどのTLB内にもないことを確かめる。他の実施形態では、他のプロセッサがTLBエントリを無効化したことを確かめる手段をマイクロコードに提供するようにしてもよい。
DMAスヌープを回避してEPCに対して無効化するためには、特別なSADおよび/またはTADエントリが提供される。これら専用のレジスタがEPCを保護する。これは、SERRと同じ値に設定される。
一実施形態では、各エンクレーブのセキュアなエンクレーブに対してセキュアな鍵を保証するために、マイクロコードは乱数へのセキュアなアクセスを利用することができる。
エンクレーブは改ざんされないように保護されてよい。改ざん保護に利用されるメカニズムの詳細は、実装例に応じて変わる。これにより、エンクレーブが改ざんされると、改ざんを検知したスレッド上でのさらなる実行が防止される。ユーザにエンクレーブの状態を理解させるために、構築されているエンクレーブを証明するための立証メカニズムを設ける。これには、エンクレーブコンテンツの情報を提示するEREPORT命令が含まれる。
エンクレーブ設計で必要となるマイクロコード符号を簡略化するために、アーキテクチャエンクレーブというコンセプトが開発された。この種類のエンクレーブには、エンクレーブのためのコードの原本に基づいて特別なアクセス特権が与えられる。
電力サイクルにおけるエンクレーブ状態は、ソフトウェアポリシーに依存している。CMA内のデータは、電力停止時に失われる。エンクレーブを保存することが望ましい場合には、ソフトウェアによって電力サイクルにおいてエンクレーブデータが失われないように保証することができる。EPCに常駐するデータは、ソフトウェアがエンクレーブをS3電力状態中に生かしておきたい場合には、メモリにフラッシュすることができる。ソフトウェアは、電力喪失時にアプリケーションに全てのエンクレーブの除去を義務付ける選択を行うこともできる。
エンクレーブはその位置に応じて保護される。CPUパッケージ外のデータは、暗号化および整合性チェックを利用して保護される。エンクレーブページキャッシュ内のコードおよびデータについては、ページがアクセス制御メカニズムを利用して保護される。
図6は、本発明の少なくとも1つの実施形態を利用することができるマイクロプロセッサのブロック図である。図6は、複数のプロセッサコア600、605、610、615、およびキャッシュ620を有するマイクロプロセッサ600を示す。エンクレーブデータ635は暗号化することができる。クリプト・メモリ・アパーチャデータ630は、エンクレーブデータ635の保護に利用される。
システムメモリに常駐しているエンクレーブページは、暗号化および整合性を利用して保護される。ページのEPCへの装填においては、ページはEPCにコピーされ、復号化されて、そのページの整合性をチェックする。図6は、データのこの部分を示している。
EPC内に常駐しているエンクレーブページは、システムメモリに格納されてから、エンクレーブキーを利用して暗号化される。認証情報もページ格納時に格納される。EPC内のエンクレーブデータは、復号(unencrypt)されてアクセス制御メカニズムにより保護される。プロセッサは、データの所有権を持つエンクレーブしかアクセスできないように、このデータを保護する。
EPCに常駐しているエンクレーブページが、キャッシュから、CPUパッケージ外のメインメモリに強制的に移動させられると、CMA暗号化により保護される。CMAは、このデータを暗号化してデータの機密性を実現する。EPCの整合性は、EPCに対する読み書きを防止するレンジレジスタにより提供される。
図7は、本発明の一実施形態に実装可能なエンクレーブページキャッシュの一部分にアクセスする制御構造の一例を示す。エンクレーブページキャッシュ720の各ページは、エンクレーブページキャッシュマップ710内に対応するメタデータを有していてよい。図7に示すメタデータにおいて、リニアアドレス700のセットを含むセキュアなエンクレーブが、リニアアドレスがエンクレーブページキャッシュマップ710に格納されているリニアアドレスに合致する場合、エンクレーブページキャッシュ720に格納されているデータにアクセスすることができる。
図7は、EPCおよびEPCMの配置および利用法を示す。EPCは4kページに分割される。各エンクレーブは、EPCに常駐している幾つかの数のページを有してよい。EPCの各ページのEPCMのエントリには、セキュリティを確保するために必要なメタ情報を提供するものもある。EPCMの詳細は実施例に固有である。
アプリケーションがエンクレーブの装填を所望する場合には、OSのシステムルーチンを呼び出す。OSはEPC内に数ページを割り当てようとする。空いている場所がない場合には、OSはビクティム・エンクレーブを選択して除去する。OSは、ビクティム・エンクレーブのページを、各ページについてEWBINVPG命令を利用して強制的に除去(evict)する。OSが強制除去を完了すると、ECREATEコマンドを利用してエンクレーブにセキュアなエンクレーブ制御構造(SECS)を追加する。SECSを生成した後で、OSは、EADDPRE命令の利用によりアプリケーションにより要求されたようにページをエンクレーブに追加する。
データページをエンクレーブに追加するには、OSは先ず、EADDSMAP命令を利用してSMAPページをエンクレーブに追加する。エンクレーブのサイズおよび配置に応じて、OSは複数のSMAPページを割り当てる場合がある。エンクレーブページ全てがエンクレーブに追加されると、OSはEINIT命令を実行して、エンクレーブを実行する。EINIT命令に対するパラメータは、エンクレーブがその機械上での実行を許可されていることを示す認可状である。アプリケーションの装填時には許可状を生成する必要がある。EINITが無事に完了すると、アプリケーションはEENTER命令を実行してエンクレーブに入ることができる。
エンクレーブが構築され、実行準備が整った旨の表示がなされると、アプリケーションは、エンクレーブに物理的メモリを追加したり取り除いたりする必要がある場合がある。エンクレーブにはこれを助けるために、さらなるメモリを追加させる命令が存在する。メモリをエンクレーブに追加する際、メモリはエンクレーブ内の正確なリニアアドレスに割り当てられる。OSはこのメモリページを、リニアアドレスを示すEPCにコピーする。EADDPOST命令を実行して、このメモリをエンクレーブ(enclave enclave)に追加する。SMAPノードがEPC内に常駐していない場合には、先ずこれを装填する。
メモリをエンクレーブにコピーした後は、ソフトウェアは、ページを受諾してから、内部的にアクセスできるようになっていてよい。エンクレーブは、EACCEPT命令を実行することによりデータを受諾する。この命令は、エンクレーブ内のソフトウェアによってのみ実行可能である。
一部の場合には、ソフトウェアは、エンクレーブメモリの特性の修正を望む場合がる。そのためには、SMAPを更新する必要がある。例えばソフトウェアが、別のスレッドエントリポイントであるTCSをエンクレーブ内に生成しようとする場合を考える。この場合、エンクレーブは、EMODIFY命令を利用してページのSMAP特性を変更するようOSに要求する。特性が変更された後で、エンクレーブソフトウェアは、EACCEPT命令を実行して、ページの利用を許可する。
メモリページはエンクレーブから除去することもできる。エンクレーブがページの除去の準備ができている場合には、OSに要求を送る。OSは、EREMOVE命令を実行して、SMAPからページを除去させる。EREMOVE命令はさらに、EPCエントリの無効化も行う。
エンクレーブ環境の整合性を確保する方法としては、アクセスチェックを数回行う、というものがある。実施される様々なセキュリティ特性のなかには、データをEPCに正確に位置させて、データがエンクレーブの間でリークしないようにして、参照アドレスが破損しないようにすることで、コードがエンクレーブの異なるリニアアドレスに移動させられないようにする、というものがある。
アクセス保護要件は、レンジャレジスタおよびマイクロコード管理されたシャドーページテーブルを利用して実装することができる。別の実施形態では、シャドーページテーブルのオーバヘッドを回避するために、ページミスハンドラハードウェアを修正して、同じアクセス制御要件を実行することができる。
EPCは、LPがマイクロコードモードで実行中、または、LPがエンクレーブ内で実行中であり、アクセスされているリニアアドレスがそのエンクレーブがカバーするリニアアドレスレンジに属している場合にのみ、論理プロセッサ(LP)によりアクセス可能である。言い換えると、EPCレンジに行くことが許されるのはマイクロコードアクセスまたはエンクレーブアクセスのみである。EPCレンジに対する他のアクセスはすべて、不法とみなされる。
エンクレーブアクセスは、EPCに属す物理アドレスに対して解決(resolve)されてよい。アクセスがEPC外であるが、リニアアドレスが、アドレスがエンクレーブ内にあると示している場合には、アクセスは停止されてよい。OSに対する不良または命令は、報告を行う。
エンクレーブ内のアドレスに対するアクセスは、アクセスを成功させるためにEPC内に位置させることができる。エントリがEPCに存在するかのチェックは、通常、EPCMをチェックして、有効なビットを検証することにより行われる。各EPCページは特定のエンクレーブ専用である。そのEPCエントリに対する参照は、EPCページを所有するエンクレーブによってのみ可能である。これは、実行中のエンクレーブのSECSに、参照しているページが合致するかを検証することでチェックすることができる。
各EPCページは、エンクレーブ用の特定のリニアアドレスページを表す。要求されているリニアアドレスは、EPC内のページのリニアアドレスに整合する場合がある。例えばEPCMエントリは、エンクレーブページがEPCに導入されるリニアアドレスを格納する。エンクレーブアクセスがEPCページに対して解決される場合には、ページを導入するリニアアドレスは、現在の要求のリニアアドレスと合致する。
エンクレーブのリニアアドレスマッピングは破損していてはいけない。リニアアドレスのページテーブルが破損している場合には、アクセスが不法なものとされる。これにより、攻撃者がコードおよびデータをエンクレーブの付近またはその中に運び入れることを防止する。
OS/VMMが初期化の後にエンクレーブにページを追加すると、EADDPOST命令が、そのページのEPCMに「係属中」ビットを設定する。係属中を示すビットは、後続するEPC書き戻しおよび強制除去(SEC_INFOを利用する)を経ても生存し続ける。エンクレーブは、EACCEPTを発行して、係属中のビットをクリアすることができる。エンクレーブアクセスが、係属中のビットが設定されたEPCページに対して解決された場合には、LPは、OS/VMMにEF_PENDING不良を発行する。
OS/VMMが中継保護されたエンクレーブページをEPCに装填すると、FCR(フレッシュチェック要求された)ビットが、そのページのEPCMエントリに設定される。OS/VMMは、そのEPCページに対してEUPSMAP命令を実行してこのビットをクリアすることで、このビットをクリアすることができる。エンクレーブアクセスの継続は、このページのFCRビットが設定されていない場合に限って許可される。さもなくば、LPはEF_FRESH_CHK不良をOS/VMMに送信する。
各EPCMエントリは、エンクレーブがそのページに対する書き込みを許可されているかを示す「ダーティ」なビットを含む。エンクレーブのエンクレーブページに対する書き込みは、EPCMのそのページのダーティビットが設定されているときに限って許可される。さもなくば、LPはEF_EWRITEをOS/VMMに発行する。OS/VMMは、そのページに対してEUPSMAP命令を実行することで、ダーティビットを設定することができる。
論理プロセッサがエンクレーブ内で実行しているときはいつでも、そのエンクレーブのSECSページがEPC内に存在しうる。しかし、SEセキュリティモデルでは、エンクレーブは、自身のSECSに直接メモリアクセスを行うことは許可されていない(ただしエンクレーブは、完全にセキュリティを脅かすという前提で、自身のエンクレーブキーを読み出すことはできる)。エンクレーブアクセスが、そのエンクレーブに対してSECSを保持するEPCページに対して解決される場合には、OS/VMMは、EF_ATTRIB_SECS不良を介して通知を受ける。エンクレーブは、TSC属性セットを有するページの修正は許可されていない。エンクレーブがEPCに装填されたTCSの修正を試みると、OS/VMMは、EF_ATTRIB_TCS不良を介して通知を受ける。以下の表のサイズフィールドにおいては、4:32および64ビットモード両方の4バイトフィールド、8:32および64ビットモード両方の8バイトフィールド、および、8(4):両方のモードにおける8バイトフィールド(上位4バイトは32ビットモードでは無視される)という値および指標を利用することができる。
注:一部のフィールドは、小文字の「o」から始まる名称を有する(例えばoLSP)。これらフィールドはポインタであるが、エンクレーブでは、エンクレーブのベースに対するオフセットとして表される。この表記法により、エンクレーブページの計測値を、エンクレーブを生成した位置から独立させることができる。
注:フィールドは(未だ)特に決まった順序で記載されていない。一部のフィールドは、銘々のデータ構造内の異なるメモリページに移動させられてよく、これにより例えば異なる保護手段が可能となる。
各スレッドには、スレッド制御構造(TCS)が関連付けられている。TCSは以下を含む。
スレッド状態は5つの値のうちいずれかをとることができる。
<状態セーブ領域オフセット(oSSA)>
状態セーブ領域オフセット(oSSA)は、エンクレーブで実行中に生じる割り込みまたは例外にプロセッサ状態をセーブするのに利用される状態セーブフレームのスタックを指し示している。次の状態セーブ領域(NSSA)が割り込みマイクロコードにより利用されて、エンクレーブでの実行中に生じる割り込みまたは例外のどこにプロセッサ状態をセーブするかが判断される。これは、oSSAがアドレス指定するフレームアレイへのインデックスである。セーブ領域(CSSA)のカウントは、このTCSに利用可能なSSAフレームの数を特定する。割り込みまたは例外が生じ、且つ、これ以上利用可能なSSAフレームがない場合には(NSSA>=CSSA)、割り込みまたは例外がまだ起こりえて、プロセッサ状態がクリアされるが、TCSは無効(INVALID)であるとして表示される。
エンクレーブでの実行中に割り込みが起こった場合には、機械の状態がTCS::SSA(状態セーブ領域)にセーブされる。この領域には以下が含まれる。
TCS::SSAは、割り込みが生じたときにもページアウトされない。EENTERは、SSAがEPC内にあることをチェックして、物理アドレスをキャッシュする。ページが強制移動させられている場合には、EWBINVPGを実行中のプロセッサが、SSAを利用してスレッドを現在実行中のプロセッサでエンクレーブを退出させて、ページ不良を報告する。
図8は、データ構造全ての縫合方法を示す。煩雑にならないように、全てのスレッドのそれぞれの構造は示していない。アントラステッドスタック(Untrusted Stacks)およびそれに関連するポインタも省かれている。図8は、本発明の一実施形態におけるスレッド制御構造の一例を示しており、セーブ状態領域同士の縫合を示す。状態セーブ領域ポインタ800は、セーブ領域0 820を指し示している。現在の状態セーブ領域805は、セーブ領域1 824を指し示している。次の状態セーブ領域810は、次のセーブ領域828を指し示している。セーブ状態領域の数は、利用可能なセーブ状態領域の数への参照を提供している。
ページ情報(PAGE_INFO)は、EPC−管理命令へのパラメータとして利用されるアーキテクチャデータ構造である。
SEC_INFOフラグおよびEPCフラグは、ページの種類を示すビットを含んでいる。
SEC_INFOフラグは、エンクレーブページの状態を記述・説明するビットセットである。
セキュリティ情報(SEC_INFO)データ構造は、偽造保護に必要な暗号メタデータを保持する。
証明書(CERT)とは、アーキテクチャエンクレーブを提供される証明書構造であり、EMKPERMITに渡される。この構造は4096バイトであり、ページを整列されてよい(page-aligned)。
ERPORT構造は、EREPORT命令の出力である。
計測値(MEASUREMENTS)は、ERDMR命令の出力パラメータであり、指定されたSECSからとられたエンクレーブの計測値レジスタ値(Measurement Register values)が含まれている。
キー要求(KEY_REQUEST)は、EGETKEY命令への入力パラメータであり、適切なキー、および、そのキーを導出するために必要なさらなるパラメータを選択するのに利用される。
この構造を、キー導出で利用することで、エンクレーブのセキュリティバージョンおよびエンクレーブのSE TCBに基づいてキーが生成される。TCBセキュリティバージョン構造の詳細については、プラットフォームTCB復帰仕様を参照のこと。
EPCMフラグとは、エンクレーブページの状態を記述するビットのセットである。
エンクレーブページキャッシュ・マップ(EPCM)は、プロセッサがページキャッシュの内容を追跡するために利用するセキュアな構造である。EPCMは、EPCに現在装填されている各ページのきっちり1つのエントリを保持する。
証明(認証)(attestation)は、特に遠隔の実体に対して、ソフトウェア1つがプラットフォーム上に構築されている、と示すプロセスである。セキュアなエンクレーブの場合には、遠隔のプラットフォームが、ソフトウェアが、そのソフトウェアが秘匿性およびデータ保護の観点で信頼性を確認される前に、エンクレーブ内で保護されている正規のプラットフォーム上で動作するように遠隔プラットフォームにより構築するメカニズムである。証明処理は、計測、格納、およびレポート(報告)という3段階からなる。
エンクレーブの計測期間には、事前エンクレーブ構築と事後エンクレーブ構築という2つの期間が存在する。エンクレーブ命令は、構築されたエンクレーブを計測させる役割を果たす。ひとたびエンクレーブが構築されると、エンクレーブ内のソフトウェアが計測をする責任を負う。
図9は、本発明の一実施形態にみることができる、クオーティングと称されるソフトウェア認証プロセスの一ステップを示す。一実施形態では、署名処理910により、計測値レジスタ901、902、903、904から、連結されたデータに、署名キー915を適用する。署名処理910の結果がクオート920である。
暗号結合計測(cryptographically binds measurements)を報告する処理は、プラットフォームにエンクレーブを生成するときになされる。このメカニズムは、この種類の機能が時にTPMコマンドとしてプラットフォームで利用可能になっていることから、しばしば「クオーティング」と称される。計測値レジスタ(MR)の値は、連結されてから、非対称鍵を用いて署名される。これに対向する者は単に、クオート構造で署名を検証して、このクオートの正当性を立証する必要がある。
図10は、本発明の一実施形態における、計測値レジスタセット1000からクオートを生成するための各ステップを示す。ローカルレポート1005は、計測値レジスタ1000に対称認証キーでアクセスすることで生成することができる。クオーティング・エンクレーブ1025は、ローカルレポート1005を匿名のクオート1010または通常のクオート1020に変換するソフトウェアを含んでよい。
非対称鍵に関する計算の性質上、および、エンクレーブリーフの命令数を低減させたいという要望から、非対称署名を行わせる命令は含めないこととする。以下の図に示す我々の採る方法では、対称鍵認証キーに基づいて「レポート」を生成して、これらの対称鍵に基づく「レポート」を、エンクレーブを利用してそれ自身が保護されているソフトウェアを利用して、非対称署名の「クオート」に変換させる。クオーティング・エンクレーブ(Quoting Enclave)は、プラットフォーム証明キーにアクセスを有するまでに先ず認証されねばならないことから、クオーティング・エンクレーブ自身が、認証エンクレーブとして知られている特殊用途のエンクレーブである。
各エンクレーブは、2つの256ビットの幅の計測値レジスタ(MR_EADD&MR_POLICY)および2つのレザーブされたレジスタを提供する。これら計測値レジスタは、エンクレーブのSECS内に含められている。
図11は、本発明の一実施形態における計測値レジスタMR_EADD1100を更新するEADDプロセスを示す。拡張処理1115は、MR_EADD1100の現在の値、ページデータ1105、およびページメタデータ1110を入力として利用することができる。拡張処理の出力がMR_EADD'1120であり、これは、MR_EADD1100に格納される次の値となる。
MR_EADDは、EINIT命令が呼び出される前にEADD命令を利用して構築されたものであるので、エンクレーブの集合計測値を含んでいる。これはマイクロコードにより書き込まれるので、エンクレーブコードが読み取りだけができるSECSのページに配置される必要がある。EADDは、呼び出される毎に、SHA256をページデータおよびそのページに関連付けられたセキュリティメタデータに計算して(つまり、これはページおよびページのSEC_INFOフラグの(エンクレーブのベースアドレスに対する)相対アドレスである)、この値をMR_EADD1100に拡張する。「拡張」とは、新たなMR値=ハッシュ(古いMR値||入力値)という意味である。
MR_POLICYは、エンクレーブの起動を許可するポリシーを認証するときに利用されるポリシーの値を含んでいる。この値は、起動時にSECS内に配置されたエンクレーブ許可証から取り出されて、EINIT命令が成功裏に完了したものとしてコピーされたものである。MR_POLICYは、マクロコードによってのみ書き込まれるので、エンクレーブコードからは読み取りしかできないSECSのページに配置される必要がある。
図12は、本発明の一実施形態におけるレポートを生成するEREPORT命令を示す。キーID1200、所有者エポック1205、パッケージヒューズキー1210、および固定ストリングMACキー1215が、導出命令1220に入力される可能性がある。導出1220の出力は、CMAC1225を、TCBバージョン1232、ISVバージョン1234、機能1236、フラグ1238、ユーザデータ1240、および計測値レジスタ1242の現在の値とともに入力することができる。CMAC1225の出力は、MAC1244に格納することができる。EREPORT命令の出力は、キー識別子1230、TCBバージョン1232、ISVバージョン1234、機能1236、フラグ1238、ユーザデータ1240、計測値レジスタ1242、およびMAC1244を含むことができる。
EREPORT命令は、対称鍵ベースのGMACを計測値レジスタ、ユーザデータ、およびさらなるコンテキスト情報(例えば、エンクレーブの機能およびフラグ)に行うための中間鍵を生成する。
計測値レジスタに加えて、ユーザは256ビットの幅のデータブロックを提供して、レポートに含めさせることができる。ユーザは、多くのアプリケーション特定の値(例えばチャレンジャNONCEおよび/またはアプリケーション作成キー)の証明を希望する。これらの値は、単一のハッシュに低減(reduce)され、レポート内に含ませることができる。
キーの磨耗を防ぐために、EREPORTを繰り返し呼び出して、乱数128ビット値(reportKeyIDとして知られている)を、プロセッサの各電力サイクルで生成して、内部の位置に格納する。この値は、この値を利用した2∧32AES処理の後に増分される。一実施形態では、EREPORT命令への各呼び出しによってこの値を1つ増分させる。
表5−2:EREPORT構造
レポート構造中のフラグフィールドは、チャレンジャがエンクレーブを信頼してよいかを確かめるために有用なので、エンクレーブについてのある状態情報を決定するために、または、EREPORT命令を呼び出したときに利用することができる。
表5−4:フラグ
一実施形態では、適切な機能セットを有するアーキテクチャエンクレーブが、EGETKEYコマンドを有するCMAC処理で利用されるキーを取得することがアーキテクチャにより許可されているので、現在実行されているハードウェアでレポートが生成されたことを検証することができる。この機能はクオーティング・アーキテクチャ・エンクレーブに限定されている。
エンクレーブ外で実行しているときにエンクレーブの計測値を取得するために、ERDMR(計測値読み取り)命令が提供される。この命令は、有効なSECSページへのポインタ、および、計測値を配信するアドレスへのポインタを採る。計測値は、MEASUREMENT構造の形態で配信される。MEASUREMENT構造は暗号による保護(暗号保護)はされない。
エンクレーブページキャッシュ内にないときにはエンクレーブページは暗号により保護される。暗号保護には、機密保護、偽造保護、および再生保護という3つのレベルがある。一実施形態では、アプリケーションが、同じエンクレーブの他のページについて選択された保護レベルとは独立して各エンクレーブページの保護レベルを選択することができる。エンクレーブの実装により、アプリケーションは、偽造保護、偽造保護、および再生保護、機密保護および偽造保護、および機密保護、偽造保護、よび再生保護という組み合わせから選択を行うことができる。機密保護および偽造保護をエンクレーブページに行うには、GCM(Galois Counter Mode)等の幾つかの認証された暗号モードのうちいずれかを、AES等の適切な暗号法とともに利用することができる。しかし、再生保護には、より高度な解決法が要求される。
図13は、本発明の一実施形態にみることができる、偽造保護および再生保護メカニズムを示している。偽造保護により、攻撃者が、プログラムが生成していない暗号化されたデータの別の値で置き換えることが防がれる。レプレイ保護により、攻撃者が、プログラムが生成した現在の最新値ではない暗号化されたデータの値で置き換えることが防がれる。ノードバージョン番号1300はIV1310に入り、その後GMAC1325アルゴリズムに入ることができる。子1305のバージョン番号は、データ1315をGMAC1325アルゴリズムに送ることができる。GMAC1325アルゴリズムは、キー1320、IV1310、およびデータ1315を組み合わせてMAC1330を生成する。
再生保護によって、論理プロセッサが任意の時点に見るエンクレーブの全てのコンテンツが、破損してないエンクレーブの単一のスナップショットに属するように保証される。従って再生保護メカニズムは、エンクレーブバージョンのコンセプトを定義して、偽造保護されたエンクレーブページが、エンクレーブのそのバージョンに属すかを判断するメカニズムを提供する必要がある。この目的のために、再生保護メカニズムは、GMAC等のメッセージ認証アルゴリズムを利用して、偽造保護されたエンクレーブページ各々の内容をページバージョン番号に結びつける。GMACの場合には、このバージョンは、図13に示す初期化ベクトル(IV)の一部として利用することができる。
図14は、本発明の一実施形態に見られる中継保護メカニズムのMACツリー構造の部分の一例を示す。リーフノード1425は、個々のMACコンテンツページ1430のバージョン情報を含みうる。1420等の各リーフノードは、個々のMACコンテンツページを含む(不図示)。各内部ノード1410、1415は、リンク先の子のグループのバージョン情報を含みうる。ルート1400は、ツリーデータ構造の最高位のノードである。
全エンクレーブに対するバージョン付けを拡張するために、再生保護メカニズムは、バージョンツリーを維持する。リーフノードは、エンクレーブインスタンスの個々の再生保護されたページのバージョンを含む。各内部ノードは、子の各グループのバージョンを提供するので、それらが表すページのバージョン情報を論理的に保持している。図14はこのコンセプトを図式化している。
一実施形態では、O(n)ページをO(log n)へと処理する必要のあるデータ数を低減させるようにツリー構造が選択されている。ハッシュツリーではなくてバージョンツリーを利用することで、ツリーを更新することなくEPCからのページの強制退去が可能となる。
再生保護では各ページのバージョンが暗号的に自身の内容に結び付けられている必要があるので、再生保護では偽造保護が必要となる。従って、SEアーキテクチャにおいては偽造保護が必須である。さらに、SEを始めから実装しておくことにより、サポートされる保護の組み合わせのリストがさらに制限されうる。
OS/VMMは、ECREATE命令を実行することによりエンクレーブを生成する。エンクレーブの生成中に、エンクレーブにより保護されるリニアアドレスの範囲が特定される。このリニアアドレスの範囲は、エンクレーブリニア空間(ELS)レンジとして知られている。
ひとたびエンクレーブが生成されると、ELSレンジに属している個々のページを、EADDPRE命令を利用してエンクレーブに追加する。EADDPRE命令は、追加されたページの各々を、これらのページをエンクレーブページキャッシュ内に移動させることにより、エンクレーブ保護領域に移動させる。EWBINVPGを利用してこれらページのいずれかがEPC外に置かれている場合、論理プロセッサは、これらページに暗号保護を行う。
暗号保護は、各エンクレーブページに暗号メタデータを関連付けることにより行われる。メタデータは、uCodeのフローにより、様々なプロセッサ命令がエンクレーブページのコンテンツを復号して、各エンクレーブページの信頼性/フレッシュネスを検証するために利用される。SEアーキテクチャは、暗号メタデータを更新、管理、およびその正当性を立証(validate)するためにこのような命令を幾つか提供する。
各エンクレーブページは、セキュリティ情報SEC_INFOデータ構造に関連付けられている。SEC_INFOデータ構造の目的は、ページを復号および検証する必要のある暗号メタデータを保持することである。SEC_INFO構造の様々なフィールドは以下の通りである。
セキュリティ情報フラグ(SEC_INFO.Flags)は、保護されているページのページタイプ、暗号およびアクセス保護を記述する。
セキュリティマップ(SMAP)は、エンクレーブページのフレッシュネスを検証するために必要となる暗号メタデータを格納するのに利用されるデータ構造である(つまり再生保護)。セキュリティマップは、エンクレーブの特定のスナップショットの完全バージョンのツリーを表す。セキュリティマップの各ノードは、256の子のノード(リーフノードの場合にはエンクレーブページ)のバージョンを保持する。セキュリティノードに関するさらなるメタデータが、特定のSMAPノードのSEC_INFO内に含められる。
一実施形態では、セキュリティマップツリーは2レベル深くてよく(セキュリティマップの深さは、SEアーキテクチャによりサポートされるエンクレーブのサイズに関している。Gen1では、SEアーキテクチャは最大エンクレーブサイズ32GBをサポートしている。)、エンクレーブ内のエンクレーブページのエンクレーブオフセットを利用してアクセスされる。SMAPのルートは、SECSに含められ、128の子のノードのバージョンのみを保持する。エンクレーブオフセットのビットは、適切な子を選択するのに利用され、SMAPにインデックスするのに利用される。gen1では、エンクレーブオフセットは35ビット長である。エンクレーブオフセットは、以下の公式により抽出される(エンクレーブリニアアドレス&エンクレーブマスク)。エンクレーブマスクは、(エンクレーブのサイズ−1)で求められ、ECREATE中に計算することができる。
一般的には、深さl>1において、ビットN−(l)×8からN−(l+1)×8+1を利用して、次のレベルの適切な子を選択する。
注:セキュリティマップは、論理データ構造であり、アーキテクチャではない。論理プロセッサは、SMAPが位置しているリニアアドレス空間の位置についてすら認識していない。システムソフトウェアは、セキュリティマップを維持および探索(walking)する役割を担う。セキュリティマップの各個々のノードは、アーキテクチャにより定義された構造を有するが、アーキテクチャは、セキュリティマップがどのようにメモリ内に維持されているかを特定しない。しかし、セキュリティマップ内の各ノードが、セキュリティマップ内によく定義された論理位置を有しており、ノードがマップ内であちこち移動する場合にはセキュリティマップに関する様々なプロセッサ命令が、それを攻撃のシナリオとして解釈する、ということに留意されたい。
ルートセキュリティノードは、SECSに含まれており、128の子のバージョン情報を含んでいる。非ルートセキュリティノードは、保護されたページであり、関連付けられたSEC_INFO(and its associated SEC_INFO)である。保護されたページは、256の子のバージョン情報を含む。
SEC_INFOは、SMAP内のSMAPの位置を含む。SMAPの位置は、リニア/エンクレーブオフセットおよびページタイプSMAP_LEVEL_1およびSMAP_LEVEL_2により決定される。
再生保護されたエンクレーブページを追加するためには、SMAPの親が生成されて、FCRビットがクリアされた状態でEPC内に常駐している必要がある。エンクレーブページの整合性を検証するために、論理プロセッサは、SEC_INFO構造内のIV_Pおよびkey_idを利用してキーを生成する。このキーを利用して、SEC_INFO構造およびページの内容内のフラグに対してMACを計算する。計算されたMACは、SEC_INFO構造内に設けられているMACと比較される。MAC同士が整合する場合に、このページが整合性チェックに合格したとみなすことができる。
論理プロセッサは、ELPG命令を利用してEPCにページを装填するときに、ページの整合性を検証する。この命令の一部として、論理プロセッサは、ページの検証に利用されたSEC_INF構造からIV_Pを記憶する(note down)。
エンクレーブページのフレッシュネスを検証するために、論理プロセッサは、エンクレーブページおよびそのsmapの親がEPCに装填されており、smapの親がフレッシュであることを検証する。そして、ページのバージョンを、smapの親に格納されているバージョンと比較する。これら2つのバージョンが合致した場合には、プロセッサは、このページの新たなバージョンを生成して、smapの親のバージョンとエンクレーブページのバージョンを更新する。最後に、エンクレーブページをフレッシュであると表示する。
注:新たなバージョン生成によって、ページを修正可能なものにすることができる。これにより、アーキテクチャおよび実装両方が簡単になる。
エンクレーブページを除去するために、論理プロセッサは、エンクレーブページとそのsmapの親とがEPCに装填されており、両方ともフレッシュであることを検証する。そして、smapの親のページのバージョンを0に設定して、エンクレーブページのEPCスロットを利用可能であると表示する。
エンクレーブページキャッシュ(EPC)は、CPUが、SE暗号保護により暗号保護を受けていないエンクレーブページを一時的に格納するために利用するセキュアなストレージである。
以下の要件がEPCで特定される。非デバッグエンクレーブに属すEPCに装填されるエンクレーブメモリページへのアクセスは、エンクレーブ外のソフトウェア実体による修正から保護することができる。攻撃者は、直接のハードウェア攻撃では、EPCに装填されている非デバッグエンクレーブに属す平文データを読み取ることができない。また攻撃者は、直接のハードウェア攻撃では、非デバッグエンクレーブに属すEPCのデータを修正することができない。システムのCPUは、EPCに装填されるデータにコヒーレント且つセキュアにアクセスすることができる。
EPCを実装するメカニズムは幾つかある。EPCは、オンダイSRAMまたはeDRAMの上に実装可能である。EPCはさらに、CPUの最終レベルキャッシュのやり方を動的に隔離することにより構築することもできる。この実装例では、パッケージの外部からの許可されていないアクセスからEPCを保護することができる。一方でシステム内の他のパッケージは、EPCにコヒーレント且つセキュアにアクセスすることができる。
EPCを実装する別のメカニズムに、クリプト・メモリ・アパーチャ(Crypto Memory Aperture)がある。クリプト・メモリ・アパーチャ(Crypto Memory Aperture)は、プラットフォームDRAMを利用して暗号により保護された揮発性ストレージを生成する費用効果のよいメカニズムを提供する。CMAは、CPUアンコア(CPU uncore)内の1以上の戦略的に配置された暗号ユニットを利用してカスタマ技術が必要とする様々なレベルの保護を提供する。様々なアンコア(uncore)エージェントは、CMAに対するメモリアクセスを認識し、これら25のアクセスをアンコア内に位置しているクリプト・コントローラにルーティングするよう修正される。クリプト・コントローラは、所望の保護レベルに応じて、プラットフォームDRAMへの1以上のメモリアクセスを生成して、暗号文を取得する。そして、暗号文を処理して、平文を得て、元のCMAメモリ要求を満たす。CMAは、Intel QuickPathインターコネクト(QPI)プロトコルに完全に統合されており、QPIプロトコルへのセキュリティ拡張によりマルチパッケージプラットフォームにスケーリングされる。マルチパッケージプラットフォーム30の構成では、CMAは、外的に対面している(externally facing)QPIリンク層のリンクレベルのセキュリティ(Link−Sec)エンジンを利用して、Intel CPUの間のメモリ転送を保護する。
SECSは、EPCに現在装填されている場合にアクティブと称される。本書類では後述するように、OS/VMMは、EPCに装填されるものを管理する役割を果たす。しかし、EPCにエンクレーブページを装填する間に、OS/VMMは、その対象ページ自身がSECSである場合を除いて、CPUにそのページのSECSの所在を伝える。装填されているページがSECSではない場合には、CPUは、そのページに対応するSECSをEPC内に配置するよう要求する。エンクレーブのページを装填する前にはいつでも、OS/VMMは、そのエンクレーブのSECSをEPCに装填してよい(MAY load)。
CPUは、SECSをEPCに装填することのできる回数に対しては制約を課しはしないが、OS/VMMがエンクレーブページキャッシュにSECSのコピーを複数装填するようなことが頻繁に行われるとは考えにくい。とはいえ、もしも同じSECSの複数のコピーがEPCに装填される場合には、これらコピーそれぞれを別個のアクティブSECSインスタンスとして捉え、アクティブSECSの異なるインスタンスに属すEPCに装填されたエンクレーブページを、ハードウェアによりそれぞれ異なるエンクレーブに属すものとして捉える。
OS/VMMは、EPCを、システムアドレス空間の物理メモリの連続ブロックとしてとらえる(10)。しかし、内部ストレージを低減させて、高速インデックスを可能とするために、CPUは、スロット識別子(SID)を各EPCページに関連付ける。EPCページの物理アドレスおよび対応するスロット識別子は、以下のように互いに関連している。
sid=(page_pa-epc_base_pa)>>12
page_pa=pc_base_p|(sid<<12)
ハードウェアは、0xFFという特殊なスロットを用いて、無効なスロットを示す。EPCスロット識別子は、uCodeおよびPMH両方により利用されて、エンクレーブページに関する情報を追跡する。
EPCに装填される全てのエンクレーブページは、よく定義されたシステム物理アドレスを有する。EPCに属す物理アドレスおよびEPCスロット識別子間に一対一のマッピング関係があることから、EPCに装填される各ページは自身のEPCスロット識別子あるいはEPC_SIDを有するということができよう。
加えて、SECSページを除く、EPCに装填される全てのエンクレーブページは、アクティブSECSインスタンスと関連付けられる。アクティブSECSインスタンスが、EPCに装填されたSECSページにすぎないことを想起されたい。この結果、アクティブSECSページも自身のEPC_SIDを有する。非SECSエンクレーブページが属すSECSページのEPC_SIDは、非SECS25ページのSECS_SIDと称される。EPCに装填される各ページについて、ハードウェアはSECS_SIDの記録をとっておく。EPCに装填されるSECSページのSECS_SIDは、0xFF(または無効SID)と定義される。
EPCMは、プロセッサがページキャッシュの内容を追跡するために利用するセキュアな構造である。30EPCMは、EPCに現在装填されている各ページのきっちり1つのエントリを保持する。それが表すページにおいては、各EPCMエントリが、ページが属すエンクレーブ、ページがエンクレーブページキャッシュに移動させられるリニアアドレス、ページのバージョン等の情報を追跡する。EPCM構造は、アドレス変換フローにおいてCPUにより利用されて、EPCに装填されるエンクレーブページに対してアクセス制御を実施する。EPCMエントリは、(x)uCodeにより、様々な命令フローの一環として管理される。
本発明の一実施形態では、エンクレーブページキャッシュ(EPC)は、割り当て、割り当て解除が動的に行われてよい。一実施形態では、オペレーティングシステム等のソフトウェアが、EPC等のメモリページを割り当てたり、EPCのメモリ割り当て解除を行ったりする。一実施形態では、オペレーティングシステムは、エンクレーブの任意のページをEPC内に割り当てることもできる。一部の実施形態では、EPCは、メモリ内の全ての利用可能な位置を占めてよい。一実施形態において、動的EPCの固定EPCとの1つの違いは、動的EPCがメモリのページの追加および除去を可能とすることである。一実施形態では、ソフトウェアドライバ等の論理が、メモリ領域をEPCとして割り当てたり、EPCのメモリ割り当てを解除したりする。一実施形態では、起動前処理によりメモリの各ページのメタデータの格納に利用できるメモリがチェックされ、ソフトウェアがページをEPCまたは非EPCであると宣言し、ハードウェア論理が各ページの属性の追跡・実施(enforce)を行ってよい。
一実施形態では、ハードウェア論理は、変換ルックアサイドバッファ(TLB)およびページミスハンドラ(PMH)によって、EPCとして利用されるメモリに対するアクセスを制御してよい。一実施形態では、検索アドレスがTLB内に合致するものがあるとき(TLBヒットとして知られている)、セキュアなエンクレーブがEPCを退出するときにTLBをフラッシュしてよい。一実施形態では、検索アドレスがTLBに合致するものがない場合(TLBミスとして知られている)、さらなるルックアップによって、複数のメモリ参照においてエンクレーブページキャッシュマップ(EPCM)からデータを取得することができる。一実施形態では、PMHは、EPCMのルックアップを行うことができる。別の実施形態では、PMHのレンジレジスタをチェックして、連続物理アドレス、EPCに対する制御を制御する。オペレーティングシステムは、EPCページへのアクセスとして、直接メモリアクセス(DMA)を許可しない。もしもメモリの戻りページが、エンクレーブページとして表示されていた場合には、そのページのセキュアなエンクレーブ制御構造識別子(SECSID)を、現在実行中のエンクレーブと比較して、アクセスがセキュアであることを確かめてよい。戻りページのSECSIDと、現在実行中のエンクレーブのものとが合致しない場合には、PMHは停止メッセージを発行してよい。メモリの戻りページがエンクレーブページとして表示されていない場合、またはメモリの戻りページがエンクレーブページとして表示されており、そのページのSECSIDが実行中のエンクレーブのものと合致する場合には、PMHは、ページ変換をTLBに装填してよい。一実施形態では、キャッシュタグを利用して、書き戻しサイクルで他のラインからエンクレーブラインを識別することができる。しかし、少なくとも1つの実施形態では、そのタイプのメモリ要求が書き戻しサイクル中にEPCMにアクセスすると論理が判断する場合には、キャッシュタグは利用されない。
本発明の一実施形態では、ソフトウェア、BIOSが、オペレーティングシステムが起動してエンクレーブページを作成する前に、メモリを割り当てることができる。一実施形態では、ソフトウェアは、BIOSの一連のステップによりEPCを生成することができる。BIOSは、あるメモリをメタデータの格納用にリザーブすることができ、各プロセッサについてレンジレジスタを設定することができる。BIOSは、ベースアドレスおよびメモリサイズを入力とすることができる。システム構成は、MCHECKという処理によりチェックされて、全てのパッケージおよび全てのコアにおける全てのレジスタを、エンクレーブ外のアクセスから保護することができる目的に適した設定とする。MCHECKは、システムがリセットされるまでレジスタをロックする。別の実施形態では、ソフトウェアは、メモリの部分をEPCの一部と宣言することの出来るEPCADDとして知られている命令によりEPCにページを追加することができる。EPCADDシーケンスは、メモリアドレスを入力とすることができ、成功または失敗を示すメッセージを出力することができる。EPCADDが成功を示すメッセージを出力する場合には、EPCADDは、EPCM.Eビットを設定することができ、その物理アドレスに対応するページをシステムの全てのTLBからフラッシュする。本発明の一実施形態では、EPCADDは、RAXにおける01のエラーコードを戻して、入力アドレスを有するページが既にEPCページであることを示し、02のエラーコードを戻して、入力アドレスが範囲外であることを示すことができる。EPCADDがEPCの一部であるとして宣言するメモリページは、EPCセマンティクスにデータにアクセスするよう要求してよい。本発明のこの実施形態では、ソフトウェアは、EWBINVGとして知られている命令のEPCからページを除去して、暗号化されたデータを、暗号保護および整合性保護を継続させながら、引き続き利用可能にすることができる。このフォーマットのデータは、ハードディスクドライブの通常メモリに格納することができる。また別の実施形態では、EPCREMOVEとして知られている命令のソフトウェアが、EPC内のページを除去して、暗号化されたデータを利用不可能にすることができる。EPCREMOVEを実行するハードウェアは、ページおよびEPCMの部分をクリアする。EPCREMOVEは、先ずEWBINVPGを実行することなく実行することができる。一実施形態では、EPCREMOVEシーケンスは、メモリアドレスに基づいてEPCからページを除去することができる。本発明の一実施形態では、EPCREMOVE命令は、RAXに01のエラーコードを含み、除去されるページが、セキュアなエンクレーブ制御構造(SECS)の一部であり、除去不可能であることを示し、02のエラーコードは、除去されるページがEPCページではないことを示す。メモリのページのグローバルTLB撃墜は、本発明の一実施形態におけるEPCREMOVEから生じてよく、ページに前に占有されていたメモリは、汎用ソフトウェアアクセス用に利用可能となってよい。
PMHは、メモリ空間の保護されている領域へのアクセスを防止する。アーキテクチャによっては、これは、EPCへのアクセスの物理アドレスチェックのみといった簡単なもので済むこともある。さらなるPMHサポートを利用して、SEの性能向上または別の実装が可能となる場合もある。SEアーキテクチャは、エンクレーブページキャッシュに対するエンクレーブページへの不正アクセス防止にページミスハンドラ(PMH)を利用する。PMHは様々なイベントを検知して、これらイベントをマイクロコードに報告する。マイクロコードは、イベントをOS/VMMに報告してよい。次いでOS/VMMは、不良を修復するために適切な命令を実行することができる。
ECREATE命令を利用してエンクレーブを作成する場合には、リニアアドレスレンジをそのエンクレーブに対して指定する。このレンジは、そのエンクレーブの「リニアアドレスレンジ(linear address range)」と称される。エンクレーブのリニアアドレスレンジに属すメモリページは全て、エンクレーブの保護下にあり、SEC_INFOエントリが関連付けられていると考えることができる。
あるエンクレーブのリニアアドレスレンジに属すメモリページも、「エンクレーブページ(enclave page)」と称される。エンクレーブ内で実行しているプログラムは、エンクレーブページキャッシュ内に装填されておりそのページの所有者であるエンクレーブであるエンクレーブページにのみアクセスを許可される。プロセッサは、こうではない場合には例外クラスイベントを生成する。OS/VMMは、必要に応じて、エンクレーブページをEPCに装填する責任を負う。
論理プロセッサがエンクレーブを実行しており、そのエンクレーブページにメモリアクセスを生成する場合、このメモリアクセスは「エンクレーブアクセス(enclave access)」と称される。正しい実体によりアクセスされていることを確かめるためにかドレスチェックが行われてよい。
一実施形態では、PMHは、アクセス制御機能を提供して、プログラムがエンクレーブ内で実行していないときにEPCを保護する。各論理プロセッサについてイネーブルされているレンジレジスタは、プロセッサがエンクレーブコードを実行していないときにEPCに対するアクセスを制限する。このレンジレジスタは、プロセッサがエンクレーブコードの実行を開始するとディセーブルされる。その持ち場において、プロセッサは特殊なページテーブルを定位置に置く。これらページテーブルは、プロセッサによる制御を受けて、そのエンクレーブが所有しているEPCページのみにアクセスを許可する。プロセッサおよびマイクロコードは、これら2つのメカニズムを利用してEPCへのアクセスを制限する。
一部の実施形態では、性能、実装の複雑性、シリコンのコストといった数多くの軸同士の間を調整されてよい。この章では、開発者に対して可能性ある調整例の幾つかを示すために3つの実装例を紹介する。以下の表8−1は、これら保護の例および必要となるPMHサポートを示す。
表8−1の第1行に示すとおり、必要なアクセス制御保護を提供するには追加のレンジレジスタは1つでよい。この特定の実装例では、他の保護はマイクロによって提供される。レンジレジスタは、論理プロセッサごとにイネーブルされてよい。このメカニズムを利用する基本実装例を図2−2に示す。
PMHは、マイクロコードモードでもエンクレーブモードでも実行されていないLPからCMAレンジ(CPUのCMRRがカバーしている)へのアクセスを除去するよう修正される。加えて、エンクレーブモードで実行しているLPは、CMAのEPCサブレンジにのみアクセスを許可される。
図15は、ページ不良エラーコードマップの実装を示す本発明の一実施形態を示す。ビット5 1540が設定されている場合、ビット9、ビット8、ビット7、ビット6を一緒に復号して、ページ不良エラーコードを決定することができる。resビット1512、I/Dビット1514、REVDビット1516、U/Sビット1518、W/Rビット1520、Pビット1522。
あるページがEPCにない場合、その旨を伝えるために「不良」がOS/VMMに提供される。表8−2に示すように、ページ不良エラーコードマップを変更する。これは、不良条件を報告するために利用される新たなビットを示している。EPC不良がない場合には、ビット5をゼロに設定して、ビット6から9もゼロに設定する。不良がEPC条件に起因している場合には、ビット5を設定して、ソフトウェアはビット6から9を復号して、EPC不良条件を解明してもよい。不良タイプについてのさらなる情報は次のセクションに記す。
ページ不良エラーコードのビット5が設定されている場合、ビット6から9が所与であると解釈される(表8−2)。これは、このページ不良を起こした条件を示している。状態の一部は、通常処理では生じ得ないであろう不法の条件を示しており、OS/VMM管理エラーを示している。
攻撃からEPCを保護するためには、プラットフォームの全てのTLBのEPCアドレスを無効化するメカニズムを利用することができる。この特徴により、全てのコアに対して、特定のページの無効化を知らせることができる。次いで、全てのプロセッサから撃墜完了報告を受けるまで待つ。
エンクレーブが退出するたびに(EEXIT)、TLBは、TLBに現在存在しているエンクレーブページへのアクセスを禁ずることができる(may not allow accesses)。これは、TLBのクリアにより、またはさらなるビットを利用してエンクレーブエントリをタグ付けすることにより可能となる。
また別の方法としては、エンクレーブ退出時にTLBでエンクレーブビットを利用して、全てのエンクレーブエントリをクリアする、というものもある。別の方法としては、幾つかのビットを利用して特定のエンクレーブを特定するものもある。この場合、エンクレーブエントリは強制的に除去される必要がない。エンクレーブエントリは、tlbに残されてよい。アドレスをルックアップのためにtlbに送る場合には、これらビットはルックアップに追加される。これらビットは、エンクレーブの身元を示すコアからのエンクレーブidと比較される。ビットが合致した場合には、要求はこのエンクレーブから来ていることになる。合致しない場合には、要求がこのエンクレーブからのものではないことになるので、ルックアップはこの位置にヒットしない。
エンクレーブ認証は、エンクレーブコードのエンクレーブ内における実行を許可した認可機関(つまり、このコードの著者/承認者)を見つける手段を提供する。エンクレーブ認証はさらに、エンクレーブマイクロコードフロー、フレキシブルシール&レポート、および、幾つかの新たなビジネスモデルの実施点を外部委託するファウンデーションも提供する。
セキュアエンクレーブアーキテクチャのある態様では、マイクロコード化された命令内の実装にあまり適していない複雑、且つ時間のかかるフローが必要となる場合がある。これに対する解決法は、セキュアエンクレーブアーキテクチャのこれらの部分をマイクロコードに外部委託することである。多くの場合、任されたコードは、繊細なプロセッサまたはプラットフォームデータへの特別なアクセスを要求する。例えばEPID信号は、単一の命令には長すぎる。この代わりに、クオーティング・エンクレーブを利用して、EPID秘密鍵への特別なアクセスを許可することにより、EPID署名されたクオートを生成する。エンクレーブ認証により、Intelは、クオーティング・エンクレーブのみによって、EPIDキーに対するアクセス等の特別なエンクレーブに許可された追加機能を特定することができる。Intelが提供するエンクレーブは、追加機能を有し、コアのエンクレーブ機能を実装するが、アーキテクチャエンクレーブと称される。
エンクレーブ・シール・ストレージは、エンクレーブのある属性(例えば装填時間計測値)にデータを暗号化する機能をエンクレーブソフトウェアに提供する。エンクレーブ証明フレームワークによって、エンクレーブは、エンクレーブを計測した証拠を外部の実体に提供することができる。多くの状況において、エンクレーブの正確なソフトウェアハッシュよりも、データのシールまたはエンクレーブのソースに対する証明のほうが望ましい。
一実施形態では、認証されたエンクレーブにおける署名が確認されると、エンクレーブの署名に利用されたキーの公的な部分は、シール&証明メカニズムに利用可能となり、この結果、販売業者は、エンクレーブ計測値に基づく強固な保護と、エンクレーブのコードのソースに基づくこれよりも柔軟な保護との間で選択することができるようになる。
エンクレーブ認証は2つの部分に分割される。各エンクレーブは、Intelにそのルートを辿る(rooted back to Intel)ことができる署名鎖(signature chain)を有するエンクレーブライセンスを伴っている。エンクレーブライセンスは、そのエンクレーブのソース/責任実体、エンクレーブが必要とする特別な機能、および、そのエンクレーブを実現する特別なビジネスモデル/取り決めを特定するために必要な追加情報を示す。ライセンスは、特別なエンクレーブに対するものであってよく、これは、このエンクレーブの計測値を示しており、または、キーについて示しており、これが後に必要に応じてエンクレーブに署名することができるようになる。
例えばAが、Aのビデオプレーヤで利用するエンクレーブを製造するライセンスを購入する場合を考える。このために、Intelは、販売業者Aのビデオプレーヤのルートキーと、Intelが販売業者Aがビデオプレーヤエンクレーブでの利用を許可される機能とに関するライセンスを生成する。次に販売業者Aは、ビデオプレーヤのルートキーを利用して、リリースする各ビデオプレーヤ修正版についての個々のライセンスファイルに署名する。これにより、エンクレーブのライセンス鎖が、複数の中間ライセンスを含むことになる。
署名されたライセンス鎖は、エンクレーブ起動プロセス中の評価には理想的とはいえないので、代わりに、これらを、許可証(permit)と称される単一の命令の実行しやすい構造(single instruction digestible structure)に組み込む。許可証は、CMACアルゴリズムを利用して対称認証され、エンクレーブの初期化(EINIT)中に解釈される。
ラインセンスの部分の殆どが許可証にコピーされ、同様の構造を成す。ライセンスIDは、ビジネス上の取り決めを特定するための64ビットの数値である。ライセンスの種類は、ライセンスを適用するプラットフォームを特定する。バルクライセンスにより、このエンクレーブを、セキュアなエンクレーブをサポートしているプラットフォーム上に立ち上げることができる。プラットフォームごとのライセンスにより、プラットフォームは先ず示されているライセンス認可機関に接触をとり、エンクレーブを立ち上げる許可を要求する。ひとたび許可されると、ライセンス認可機関とは接触をとる必要はなくなるが、これにより、ライセンス認可機関は、このエンクレーブが配置されたプラットフォームの数を課金目的で追跡することができる。このエンクレーブをライセンスしたISVは、エンクレーブのこのバージョンのセキュリティバージョン番号を構築することもできる。こうすることで、このバージョンがシールするデータを、前のバージョンではなくて将来のバージョンについて利用可能とすることができる。フラグフィールドは、この許可証を適用するために設定されうるエンクレーブのためのフラグを示す。機能マスクは、このエンクレーブに許可されうる特別な機能のビットマスクである。親のキーハッシュとは、このエンクレーブのライセンスを署名して、キーを署名した公開鍵でハッシュした公開鍵のハッシュである。実体ハッシュとは、このライセンスを適用する実体の予期されるハッシュである。エンクレーブの場合には、これは、適切に構築されたエンクレーブのMR.EADDの値である。ライセンスキーにおいては、これは公開鍵のハッシュである。
ライセンスにおいては、ライセンスを署名するのに利用される公開鍵を、ライセンス自身に含める。許可証はCPUキーを利用してMACされる。正規のcpuMACは、EMKPERMIT命令がこの許可証を、ライセンス鎖が今度はIntelに対して認証されたことを示す。ライセンスの種類がバルクではない場合には、ライセンスMACが、アーキテクチャライセンスエンクレーブが適切なライセンス認可機関に連絡して、このプラットフォームがエンクレーブを立ち上げうるという確認を受けたことを示す。
全てのエンクレーブが許可証を要求するわけではない。エンクレーブの開発をし易くするために、開発中およびソフトウェアのライフサイクルのデバッグ段階に許可証をオプションとする。以下のポリシーがEINITにより実施される。非デバッグエンクレーブは常に許可証を立ち上げることを要求する。デバッグエンクレーブは、許可証なしに立ち上げられる。しかし、EINITに許可証が提示されない場合には、MR.Policy、ISV Secバージョン、許可証の見るバージョン(Permit See Version)、および機能の全てを0に設定する。
許可証がデバッグエンクレーブの立ち上げに利用される場合には、permit−>フラグ「デバッグ」を設定することができ、デバッグエンクレーブが許可する機能のみを許可証に設定することができる。
図16は、本発明の一実施形態のエンクレーブを立ち上げる許可証を生成するプロセスの一例を示す。このプロセスは、3つの段階(許可証発行1600、さらなるライセンス承認1640、および初期化エンクレーブ1680)を有することができる。許可証発行1600段階では、ISVキー許可証1615を、EMKPERMIT命令1612をISVキーライセンス1610に実行することにより生成することができる。CPUのみ用のMACを有するエンクレーブ許可証1625は、EKPERMIT命令1612を、エンクレーブライセンス1620およびISVキー許可証1615に行うことにより生成することができる。さらなるライセンス承認1640段階では、CPUのみ用のMACを有するエンクレーブ許可証1625、および、ライセンスされる情報に対応する第三者エンクレーブ1642が、ライセンスエンクレーブ1644に入り、ライセンスエンクレーブ1644が、CPU用のMACおよびライセンスを有するエンクレーブ許可証1645を生成する。初期化エンクレーブ1680段階では、エンクレーブSECS1682、および、CPU用のMACおよびライセンスを有するエンクレーブ許可証1645が、EINIT1684命令に対する入力とされてよい。EINIT1684mリtリの出力は、ISVエンクレーブ1685となる。
エンクレーブを起動するには、ソフトウェアとともに出荷されるライセンスから許可証を生成して、CPUに提供して、エンクレーブを開始させることができる。このプロセスは、許可証発行、さらなるライセンス承認、および、エンクレーブ初期化という3つの段階に分割することができる。図16は、このプロセスのフローを示す。
EMKPERMITという新たな命令を利用して、ライセンスから許可証を生成する。EMKPERMITは、単一のライセンスから単一の許可証を生成するが、連続呼び出しされることで、ライセンスの鎖を、許可書キーを利用してMACを有する単一の許可証に変換することもできる。次のセクションでは、このことを詳述する。
各ライセンスは、許可証を利用可能とするためにとることができるさらなるステップを決定する「ライセンスの種類」を含む。プラットフォームごとのライセンスは、クラウドのライセンス認可機関に、エンクレーブが配置されるプラットフォームの課金額を維持するよう要求する。この種類のライセンスにおいては、さらなる段階が必要となる。つまり、ライセンスエンクレーブと称されるアーキテクチャエンクレーブは、クラウドのライセンス認可機関と交渉して、承認されると、ライセンスキーを用いて許可証にさらなるMACを提供する。例えばアーキテクチャエンクレーブは常にバルクライセンスであり、これは、実行するためにライセンスキーMACが不要であることを意味する。これらは、セキュアなエンクレーブをサポートする任意のプラットフォーム上で動作する。
エンクレーブの初期化において許可証が実施形態される。初期化中に許可証が処理され、エンクレーブ計測値が許可証内のものと合致した場合には、MACは正しいことになり、エンクレーブが起動される。EINITはライセンスの種類を見て、さらなる承認を要するライセンスのライセンスMACのみを調査する。
EMKPERMITは、ライセンス上のRSA署名を検証するのに必要となる時間のために、特権付き命令である。この命令は、検証して、その内容から許可証を生成する非常に単純な署名付き証明書をとる。ライセンスは、署名およびそれを署名するのに利用するキーの公開部分の両方を含む。これにより、uCodeは、Intelのライセンス署名キーのハッシュのみを格納して、Intelが署名したライセンスを認証することができる。EMKPERMITは、さらに、キーの認証された承認を提供することにより、ISVキーが署名したライセンスを認証することができる。これは、ISVの公開鍵のハッシュを含む許可証を作成することによって行われる。この結果、EMKPERMITがIntelのライセンスを、内部ハッシュ、あるいは、第2の許可証に提供されているハッシュを持つISVキーを利用して、Intelのライセンスを検証することができる。
EMKPERMITは、ライセンスへのポインタ、キー許可証へのオプションのポインタ、および、出力許可証へのポインタという3つのパラメータをとる。Intelが署名したライセンスについては、キー許可証が空値であり、内部的にハードコードされた許可証パラメータのセットが利用される。アーキテクチャエンクレーブのライセンスを認証する呼び出し方法を利用して、その許可証を生成する。EMKPERMITは、このライセンスの公開鍵がuCodeにより認可されるようにする(含まれている公開鍵のハッシュを内部ハッシュと比較することにより)。
ISVの場合には、ISVのキーは、Intelが署名したライセンスを有する。キー許可証を利用しないEMKPERMITの呼び出しには、Intelのキーハッシュを利用して、ライセンス上の署名を検証して、ISVキーのハッシュを認可する許可証を生成して、合法なライセンス署名キーを表す。そしてEMKPERMITを再度呼び出す(ISVのキーの許可証を含む)。EMKPERMITは、キーの許可証のMACを認証して、前にIntelのハッシュを利用したISVキーのハッシュを利用する。エンクレーブライセンスの公開鍵がISVキーの値にハッシュを行い、且つ、エンクレーブライセンスがそれにより適切な署名を行う、ということを仮定して、EMKPERMITは、エンクレーブ用の許可証を生成する。この許可証は、ライセンス情報(全鎖で一貫していてよい)、ライセンス鎖の全ての公開鍵のハッシュ、エンクレーブの計測値、およびその機能を示している。
以下のステップがu−codeによりEMKPERMIT中にとられる。
ライセンスエンクレーブは、uCodeが見える範囲の外で起動されるエンクレーブについての決定をするように設計される。例えばuCodeは、ISVのIntelとのビジネスにおける取り決めにより、さらなるエンクレーブ配置が許可されるかを評価する。ライセンスエンクレーブは、アセスメントを行う必要がある全ての材料の収集、および、エンクレーブの起動のさらなる承認、拒絶を行うように設計されている。ライセンスエンクレーブは、複雑なビジネスにおける取り決めのみをサポートする必要があり、バルクライセンス(例えば、必要とされている回数だけ任意のプラットフォームでエンクレーブを起動させる機能)には必要がない。
ライセンスエンクレーブは、システムサービスであることが予期されている。ライセンスが、ライセンスエンクレーブからのさらなる承認が必要であると示す場合、EMKPERMITが生成したライセンス鎖およびエンクレーブ許可証をライセンスエンクレーブに渡す。ライセンスエンクレーブは次に、承認要求を生成する。そしてアプリケーションはこの承認要求を適切なライセンス認可機関に送り、ここで承認通知が生成される。そしてライセンスエンクレーブに戻されて、ライセンスエンクレーブは、ライセンスキーを利用して、ライセンスMACフィールド内の許可証をMACする。
エンクレーブに対して許可証が発行されると、エンクレーブ機動プロセスでu−codeを利用して評価して実施することができる。これは、許可証のリニアアドレスをパラメータとして利用して、EINIT命令の一部として実施される。(1)スクラッチパッドの許可証をコピーする、(2)許可証上のcpuMACを、許可証キーを利用して検証する、(3)ライセンスタイプ!=バルクである場合には、ライセンスMACを、ライセンスキーを利用して検証する、(4)許可証内の計測値を、SECS内のMR.EADDと比較する、(5)許可証内のフラグを、SECS内のフラグと比較する、(6)許可証内のPubkeyハッシュをMR.Policyにコピーする、(7)ISV SVNをSECSにコピーする、(8)許可証内の機能マップをSECSにコピーする、という、さらなるステップをEINITに、認証されたエンクレーブメカニズムの一環として追加する。
<機能>
現在の機能マップは、このエンクレーブに利用可能な128ビットマスクの機能である。
空間は、EINITがとるアクションに基づいて組織化される。ビット00−03は、リングレベルの制約がこのエンクレーブ上でアクティブになったときの将来の利用のためにリザーブされる。04−07は、将来許可されるページ保護を示すためにリザーブされている。08−23は、EGETKEYを通じて利用可能なプロセッサキーである。24−31は、他の制御(例えば証明のために名称ベースのモードを利用する、または、将来制限を希望する技術に対するもの等)のためである。一部の機能は、デバッグモードでエンクレーブによって利用されない。デバッグ列は、ある機能をデバッグモードにおいて利用して合法かを示す。
将来の世代においては、ビット00は、リングレベルおよびVTの制約が、このエンクレーブに適用されることを示していてよい。ビット01−02は、エンクレーブが実行を許可されるリングレベルを示しており、ビット02は、エンクレーブがVTルートモードで実行されるか示している。各EENTERにおいて、現在のCPLをビット01−02に比較して、このエンクレーブがこのリングレベルにおいて実行を許可されているかを判断する。これを実行する試みが誤ったリングで行われる場合、EENTERは失敗する。同様に、リング制約がアクティブな場合は、エンクレーブは、ビット03が起動中にはVTルートモードからしか入ることができない。第一世代では、これらビットがMBZである。
エンクレーブページは、暗号化されても、整合性のみを保護されてもよい。さらに、ページは実行可能であってもなくてもよい。将来の世代においては、これらの属性を追跡して、EPCMのセキュリティ情報の部分で実施することができる。ページが実施可能であるか、またはエンクレーブが既にEINITされているかに基づいて、エンクレーブのエンクレーブページへの暗号化の利用を制御するために機能ビットがリザーブされる。
多くのアーキテクチャエンクレーブは、CPU内で、またはCPUにより保護されているキーへのアクセスを要求するリング3の実体である。EGETKEYはこれらキーに対するアクセスを提供し、機能ビットは、キーへのアクセスを許可することができるか決定するためにEGETKEYにより利用される。
以下は、これら特性および短い説明を有する現在のアーキテクチャエンクレーブのリストである。
プロビジョンエンクレーブは、KEY_PROVISION機能を有し、Intelにより承認されており、新たなデバイス証明キー(DAK)またはプロビジョン証明キー(PAK)が必要になるたびに、単一のパッケージプラットフォーム上で実行される。その目的は、エンクレーブに、EGETKEYが提供するプロビジョンシードに基づいて、デバイスID&プロビジョンキーを導出させる、というものである。次いでプロビジョンエンクレーブは、これらキーを利用して、プロビジョンサーバに対してプラットフォームの正当性を証明して、デバイス証明キー(DAK)を取得する。DAKを取得した後で、プロビジョンエンクレーブは、オプションとしてDAKを利用して、プラットフォーム証明キー(PAK)プロバイダとの間で認証を行い、PAKを再試行する。PAKの利用により、特定のISVについて保証することで、ユーザによりよいプライバシーを提供することができ、そのアクティビティがそのプラットフォームの前の所有者のものに関連付けられなくなる。PAKを取得してから、プロビジョンエンクレーブは、クオーティング・エンクレーブが取得することができるように、それをシールする。
クオーティング・エンクレーブは、機能KEY_REPORTを有し、エンクレーブにより承認されており、EPIDキーをプロビジョンするのに利用されたプロビジョンエンクレーブ(通常はIntel)と同じ著者を有する。その位置は、全てのappsに対して利用可能であるOSサービスである。その目的は、エンクレーブにプラットフォームEPIDキーのシールを解かせることである。EREPORTからのレポートは入力として提供される。エンクレーブは、EGETKEYを利用して、レポートキーを取得する。レポートキーは、次に、レポートを検証するのに利用される。エンクレーブは、EPIDの利用によりクオートに署名する。
ライセンスエンクレーブは、KEY_LICENSE機能を有し、Intelにより認可され、Root Intelにより署名されており、エンクレーブ(OSサービス)とともに出荷され、単独でインスタンス化されている。その目的は、複雑なライセンスポリシーを評価することである。エンクレーブがライセンスエンクレーブからさらなるライセンス確認を要求する場合には、EINITは、ライセンスエンクレーブがライセンスキーを利用してその許可証をCMACした後に限り、それを受け付けることができる。
単一のパッケージシステムにおいて、エンクレーブのアーキテクチャが利用する全ての対称キーを、プロセッサのヒューズアレイに格納された単一の特異性ソースから導出する。キー階層は、SE TCB階層に分割されて、これはプラットフォーム実装に依存しており、その構造が全てのセキュアなエンクレーブ実装にわたり一貫したSEキー階層である。TCB復帰用のキーイング材料およびEPIDプロビジョンの基礎は、SEキー階層のルートとして機能するSE TCB階層により提供される。エンクレーブ命令セットおよびトラステッドアーキテクチャエンクレーブ両方で利用される全てのキーイング材料は、SEキー階層により提供される。
プラットフォームは、ヒューズされている128ビットのプラットフォーム固有キーを提供する。これらキーは、秘密のCPU論理に格納されているキーを利用してヒューズで暗号化される。幾つかの単一の目的のキーはこのキーを利用して導出され、TCB復帰技術は、プラットフォームの要件に基づいて適用される。結果生じるキーは、SEキー階層のルートとして機能する。
アーキテクチャエンクレーブのキーは、EGETKEY命令を利用して取得される。
エンクレーブアーキテクチャは、REPORTの値の証明をプラットフォーム外のシステムに提供するために非対称キーの利用を必要とする。このキー(EPIDキー)は、最初はヒューズで提供されるが、配置後にキー階層から導出されるキーの1つを利用して再度プロビジョンされてよい。EPID証明キーのプロビジョン方法は、本明細書の範囲外である。さらなる情報は、デバイス証明キー(DAK)プロビジョン仕様を参照されたい。
最後に、エンクレーブのアーキテクチャも、全てのプロセッサの論理にあるキーを利用して、OEMにおけるキーイング材料をプロビジョンする。このキーはアウトオブボックス経験グローバルキー(Out-of-Box Experience Global Key)として知られている。我々は、このキーに同様の導出処理を行い、ISVの固有性を提供する。OOBキーから導出されたこれらキーのISVによる利用法は、本明細書の範囲外である。
キー階層のSE TCBの部分はプラットフォーム特有であり、全ての基礎は、同じ基本のキーセットを必要とする。我々はこれらをベースキーと称す。これらは全てヒューズキーおよび論理キー内に導出され、SEキー階層のルートである。次いでこれらキーは、SE命令により、SEアーキテクチャで直接利用される全てのキーを導出するために利用される。これらキーはTCBキー階層の結果である。4つのSEベースキーに、プラットフォーム固有メカニズムによりSEアーキテクチャに利用可能となるEPIDコンポーネントが足し合わせられる。表12−1は、これらキーをそれぞれ示す。
図17は、単一のパッケージのセキュアなエンクレーブのためのプラットフォームキー階層の実装を示す本発明の一実施形態を示す。ボックスベースキー外1700は、利用可能な導出リソース1750から導出され1702、ボックスキー外1704が生成される。利用可能な導出リソース1750は、固有値1752、所有者エポック1754、セキュアなエンクレーブセキュリティバージョン1756、SECS計測値レジスタ1758、ISVセキュリティバージョン1760、およびSECSフラグ1762を含むエレメントを有するストリングである。プロビジョンキー1710は、Intelバックエンドに対してプラットフォームの正当性を証明することができる。EPID ID1712は署名キーである。初期safeIDキーブロブ1718は、クオートであり、safeIDシード1716に関連付けられている。ベースopsキー1714は、利用可能な導出リソース1750からの情報と組み合わせられて、エンクレーブキー1730、許可証キー1732、ライセンスキー1734、レポートキー1736、認証キー1738、およびシールキー1740を含む一連のキーを導出する1720ことができる。
図17aは、マルチパッケージキー階層の一実施形態を示す。
セキュアなエンクレーブ命令およびデータ構造は、キーイング材料のソースであるベースキーに依存している。表12−1に示すプラットフォームキー階層は、プラットフォームキー材料の階層関係、および、プラットフォームルートキーからのキーの導出方法の記述である。
エンクレーブラップキー(enclave wrapping key)1752は、エンクレーブページキャッシュ(EPC)内で保護されていない間にセキュアなエンクレーブ制御構造(SECS)のページを暗号化するのに利用される対称キーである。
許可証キー1754は、許可証に正当性および整合性を提供するのに利用され、これにはエンクレーブの機能およびライセンス情報が含まれる。許可証はMACされて、EINITへの遷移中にその整合性が確かめられる。このキーはEMKPERMIT uCodeおよびEINITにより利用される。
ライセンスキー1756は、uCodeにより評価不可能なライセンスポリシーに準拠してアサートするのに利用される(is used assert compliance with)。ライセンスキーは、EINITが評価するライセンスエンクレーブから認証された承認を生成するのに利用される。EINIT uCodeが利用するこのキーは、EGETKEYを介して利用可能であり、KEY_LICENSE機能セットとともにエンクレーブされる。
レポートキー1758は、レポートの正当性および整合性を提供するのに利用される。レポートは、ERREPORTによりMACされ、クオーティング・エンクレーブに遷移する間に、整合性を確かめられる。このキーはEREPORT uCodeにより利用され、QUOTE機能セットを有するエンクレーブに対してEGETKEYを介して利用可能となる。
認証キー1760は、エンクレーブ固有キーであり、クオーティング・エンクレーブからISVエンクレーブに送信されるデータの正当性および整合性を提供するのに利用され、エンクレーブからエンクレーブへの認証を同じプラットフォームで実現する。キーは、EGETKEYを介して全てのエンクレーブに利用可能となり、ISV_AUTH機能セットを有するエンクレーブが、必要としているキーを特定することができる。
シールキー1762は、128ビットを各エンクレーブに提供して、それらの含む繊細なデータを暗号化させる。複数のシールポリシーをこのシールキーに統合することで、ISVに、どのソフトウェアを使ってデータのシールを解くかについての柔軟性を持たせることができる。これらのキーは、EGETKEを介して任意のエンクレーブに利用可能となるが、個々にはシールキーは、要求されているシールポリシーに合致するエンクレーブにのみ利用可能となる。
EPID ID1712は、パッケージを一意に識別する。その唯一の目的は、デバイス証明キーのプロビジョンを可能とする、ということであり、デバイス証明キーは、EPIDベースの匿名証明キーである。EPID IDは、プロビジョンエンクレーブのみにアクセス可能である。プロビジョンエンクレーブは、これをセキュアなチャネルを介して、承認されたプロビジョンサーバのみに提供し、しかもこれは、ユーザまたはオペレーティングシステムが開始するプロビジョンプロセス中に限って行われる。このIDは、PROVISIONING機能を有するエンクレーブに対してEGETKEYを介して利用可能となる。
プロビジョンキー1710は、Intelバックエンドにプラットフォームの正当性を証明すること、および、現在のSE TCBの実行を認証することに利用される。プロビジョンキーへのアクセスを示すことで、プロビジョンサーバは、エンクレーブが実際はEPID IDを所有しており、少なくとも特定のTCBセキュリティバージョン上で実行されているデバイスであることを確かめることができる。プロビジョンキーは、このパッケージおよびこれを要求するプロビジョンエンクレーブの署名者に固有である。これにより、単一のプラットフォームで利用されている場合、これら複数のプロビジョンインフラストラクチャの間を分離させることができる。このキーはEGETKEYを介して、KEY_PROVISION機能を有するエンクレーブに利用可能である。
プロビジョンシールキーは、所有権に変更があった後であっても取得可能な方法でプロビジョンを暗号化することができるように、128ビットキーをプロビジョンエンクレーブに与える。このキーを利用して古いEPIDを暗号化することで、新たなEPIDの取得中にプラットフォームが無効になったことを証明することができる。プロビジョンキーはこのパッケージおよびこれを要求するプロビジョンエンクレーブの署名者に固有である。これにより、単一のプラットフォームで利用されている場合、これら複数のプロビジョンインフラストラクチャの間を分離させることができる。このキーはEGETKEYを介して、KEY_PROVISION機能を有するエンクレーブに利用可能である。
ISVアウトオブボックス(OOB)経験キー1700は、全てのIntelプラットフォームとISVとの間の共有キーである。このキーは、特定のISVに固有のOOBルートから導出される。ISVは、このキーに購入アクセスすることができ、このキーに対して秘密を暗号化して、OEMのハードディスク画像内に配置することができる。これらの秘密は、セキュアなエンクレーブ内で安全に実行されているこれらのコードのみがアクセス可能であり、プラットフォームはオンライン動作または完全な証明キープロビジョンを行う必要がない。これらキーはEGETKEYを介して、OOB機能を有するエンクレーブに利用可能である。
プロビジョンキーは、セキュアなエンクレーブアーキテクチャに対して重要なキーであるが、プラットフォーム・キーイング材料からは導出されない。これらキーは、プロビジョンサーバまたはオフライン技術からプロビジョンされる。デバイス証明キー(DAK)は、個々のエンクレーブの特性を証明するための匿名署名キー(EPID)利用である。これは、キーまたは秘密のプロビジョン中にISVにより利用され、この繊細な情報を改ざんされていないアプリケーションの保護された導入にのみ送信するようにする。
デバイス証明キーには2つのソースがある。好適なアーキテクチャは、ヒューズで圧縮される初期DAKを、EPIDキーブロブおよびEPIDエントロピーとして出荷する。これにより、プラットフォームは、最初の電源投入直後に証明を開始することができるようになる。第2のソースは、DAKプロビジョンサーバに接触をとり、EPID IDおよびプロビジョンキーを利用してハードウェアの正当性を証明した後に1つがダウンロードされる。この2番目の方法は、ヒューザされたEPID キーを有さないプラットフォームおよび基礎となるTCBのバージョンを無効化した後のプラットフォームにより利用される。EPIDヒューズは、EGETKEYを介してPROVISIONING機能を有するエンクレーブにアクセス可能である。
プラットフォーム証明キー(PAK)は、オプションとしてさらなるプライバシーのレベルを提供する。DAKのある利用を関連付けることもできる。特にISVエンクレーブが名称ベースの証明機能を有する場合には、単一のISVが、所与のEPIDがこのサービスを再利用するか判断することができる。(しかし複数のISVの間で、ユーザの追跡のための結託は行われない)。DAKは、所有者にではなくて、むしろプラットフォームに結び付けられているので、この関連付けは、ウォータフォール・イベント中継続する。従って一部のユーザは、第三者にPAKを発行してもらって日々の証明に利用するより、も自身のDAKを利用して自分のプラットフォームの正当性を証明するほうを好む。マルチパッケージのプラットフォームでは、各パッケージのDAKは、PAK(証明におけるプラットフォーム全体を表す)を構築するのに利用される。
ユーザがアクセス可能なキーのキー導出は、NIST特殊公報800−108(擬似乱数関数を利用するキー導出について推奨されている)に準拠する。キー導出関数の構成においては、擬似乱数関数(PRF)が必要である。PRFは、NIST SP800−38Bに定義されているAES−CMACアルゴリズム、処理のブロック暗号モードについて推奨−認証のためのCMACモード、2005年5月(http://csrc.nist.gov/publications/nistpubs/800-108/sp800-108.pdf)に基づく。一般的なキー導出は、DerivativeKey=PRFParentKey(DerivativeString)である。
導出ストリング(derivative string)は、要求されている特定のキーに基づく8つの要素からなるサブセットからなる。表12−2は、導出の一部となりうる利用可能なエレメントをそれぞれ説明している。
各キーは、予め定義された導出要素のセットを有しており、これは導出ストリングを含む。表12−3は、キー階層の各キーに含まれる要素を示している。各列はキーを表し、行は、そのキーに特定の要素が含まれているかを示す。デバッグストリングは、要求を発するエンクレーブのSECSが、デバッグモードにあることを示している場合に含められ、「要求」は、このエレメントが要求されておらず、キー導出のために要求において選択可能であることを示している。
セキュアなエンクレーブは、起動シーケンスの幾つかのポイントでソフトウェアのセキュリティ侵害を分離させ復帰させる技術をサポートしている。分離をサポートするために、エンクレーブに提供された全ての長期キーイング材料を、現在のTCBのセキュリティバージョンを利用して導出する。
このセクションでは、復帰可能なTCBが、uCode、MCHECK、およびマイクロコード(またはuVMM)からなるプラットフォームのアーキテクチャの一例について説明する。ハードウェア要件は、どのSEサポートプラットフォームについても同じであってよいが、具体的なキーフローは、特定のTCB要素に依存している。ここで利用されている技術に類似した技術を利用して他のプラットフォームをサポートすることもできる。
CPUベースの保護技術をサポートするためには、ハードウェアに以下のキーが必要である。これらキーはTCBキー階層の基盤となる。
<ステッピング固有の256ビットの論理キー>
256ビットの論理キーは、128ビットのヒューズ・ラップキー、および、128ビットのアウトオブボックス経験キー(out-of-box experience key)という2つの部分に分割される。しかし、uCodeを追加する単一の128ビットのキーを両方について利用することもできる。
<ダイ固有の544ビットのヒューズキー>
これらには、32ビットのグループid、256ビットのSafeIdA.x値、および256ビットのプレシードが含まれる。A.x値および256ビットのプレシードは、上述した128ビットのヒューズ・ラップキーで暗号化される。
<一次レジスタ>
キー導出プロセスでは、キーを格納して、パッケージ上に置き、uCodeのみに利用可能とさせる必要がある。プラットフォームのランタイム中は2つの128ビットレジスタが必要である。CMAが起動して動作するまでの間は、EPIDキーのために、さらなる256ビットの空間が必要である。この後は、該さらなる256ビットはCPUには不要となる。
<TCB SVNレジスタ>
このレジスタは、各TCB層にSVNを保持するよう分割された64ビットのロック可能レジスタである。分割の仕方はプラットフォーム設計者の裁量に任されているが、8個の8ビットのSVNに分割する、というのが妥当に思われる。このレジスタの各部分は、独立してロック可能である。
キーを特定のTCBバージョンのセットに結合することは、ヒューズキーから第1セットのキーを、開始される機動シーケンスの種類に基づいてuCodeに導出させることにより行われる。このヒューズをロックした後、起動シーケンスの各装填において鎖状に導出(a chain of derivations)が行われる。
低レベルのコードを装填した後で、鎖は、エンクレーブで実行されているソフトウェアの、ISVが割り当てられたセキュリティバージョン(ISV assigned security version)を含み続ける。特定の構成においては、現在のバージョンから導出したキー、および、前の構成からのキーにアクセスすることができる。これにより、新たな安定性のあるバージョンへユーザデータを途切れなく遷移させることができる。
ダイ固有のキーが生成されると、キー・ラップ・キーで暗号化される。これにより、ハードウェア監視ツールを利用してキーを抽出し、その部分に配置される前に通過するキーを保護することが益々難しくなる。
これらキーを暗号化するのに利用される暗号アルゴリズムは、10ラウンドの128ビットのAES−ECB復号である。キー生成サーバは、AES−ECB暗号化を各キーに行い、ヒューズで焼かれる暗号文キーを生成する。
TCBキー階層におけるキー導出に利用される擬似乱数機能(PRF)は、プラットフォームに特有である。AES−NIをサポートするプラットフォーム用には、128ビットのAES−ECBが推奨される。目的は、他のキーからキーを導出するための不可逆的な方法を提供する、というものである。このセクションでは、以下の関数のプロトタイプを利用する。
キー導出ではPRFに3つの方法がある。PRFループ導出は、異なるSVNのキー間の関係を構築しつつ、uCode SVNをキーに投入するのに利用される。具体的には、PRELoop(x-1)=PRFPRELoop(x)(const)である。
これにより、データを前方マイグレーションさせる。uCode SVN3を実行する場合を例にとる。エンクレーブはEGETKEYを利用して、このバージョンに基づくシールキーを取得して(PRELoop(3))、これを利用してデータをシールする。フィールドuCodeのアップグレードを配信し、次の起動uCode SVNは4である。アップグレードの後で、EGETKEY実装は、PRFLoop(4)にアクセス可能となる。エンクレーブが、EGETKEYにSVN3キーを送るよう要求する場合、PRELoop(3)=PRFPRELoop(4)(constant)を計算して、古いシールキーを取得することができる。
この特性を構築するには、PRFのループを利用するが、特性PRF
PRELoop(x-1)がPRF
PRELoop(x)から計算されるので、SVNの最大値を構築して、ここから減算していく必要がある。特定の最大値は、
要求される性能
に基づいて各プラットフォームの種類に対して構築する必要がある。最大値の初期値としては32を推奨する。PRFループ導出は、以下のようになる。
この方法は、uCodeのSVNをSVNキーに投入するために利用され、SEベースのキーの基礎となるキーである。ヒューズされるダイ固有キーは、288ビットのEPID値、および、256ビットのランダムキーを含む。全てのエフェメラルではない対称鍵は、これら256ビット(2個の128ビットキーからなる)から導出することができる。従って、単一のキーから複数のキーを導出するための技術の作成が可能である。こうするためには、ヒューズキーが復号されると、これを利用して異なる固定定数を利用してPRFを呼び出すことができる。鍵を分割すると、一般的には以下のような形になる。
この技術は、EPID IDおよびプロビジョンIDの一部として利用される乱数を生成するのに利用される。
SVNキーがuCode SVNに基づいてループ導出されると、SE CMA等の、離れた保護メモリ内に格納することができる。
マイクロコードは、SVNキーからキーを導出するためだけに、
マイクロコードに曝されるMSRを利用する。MSRは、導出の基礎が、グローバルなアウトオブボックスのキーなのか、ヒューズキーなのか、および、各TCB層について要求されているSVNセットを示すキー選択器を利用する。これにより、要求が現在の値以下であることを確かめることができる。UCodeは、任意の必要なPREを利用して、古いSVNキー、PRF,および要求されているTCB SVNを取得することができる。
適切なSVNキーが利用可能になると、要求されているTCB SVNのCMACのキーとして利用される。マイクロコードは、これをCMACキーとして、Opsキー、またはプロビジョンベースキーの固定ストリングについてSEOpsシード(Intelが知らないヒューズキーの部分から導出した値)に対して利用する。つまり、se_base_key=CMAC(svn_base_key,se_ops_seed)である。
図18は、本発明の一実施形態における、マイクロコードベースのセキュアなエンクレーブキー階層の一例を示す。リセットマイクロコード1800階層では、グローバル・ラップ論理キー1801およびインテルが知っている固有のルートヒューズ1802を、ラップ解除1806機能への入力として利用する。ラップ解除1806およびマイクロコードSVN1805の出力がPRFループ1808に入力される。マイクロコードSVN1805およびグローバルルート論理キー1803は別のPRFループ1809に入る。PRFループ1808の出力は、SVNキー1810レジスタに格納される。PRFループ1809の出力は、グローバルキーレジスタ1812に格納される。マイクロコードSVN1805は、TCB SVNレジスタ1814に格納される。グローバルラップ論理キー1801およびSE EPID A.xヒューズ1893は、ラップ解除1807関数に入力され、結果をSE EPID1816レジスタに格納する。MCheck1820階層においては、MCheckSVN1821およびTCB SVNレジスタ1814の出力が、TCB SVNレジスタ1826に格納される。SVNキーレジスタ1810は、マイクロコードSVNレジスタ1822に格納される。グローバルキーレジスタ1812は、グローバルキーレジスタ1824に格納される。SE EPID1816は、SE EPID1828に格納される。装填マイクロコード1830階層では、マイクロコードSVN1831およびTCB SVNレジスタ1826の出力を、TCB SVNレジスタ1846に格納する。マイクロコードSVNレジスタ1822は、マイクロコードSVNレジスタ1832に格納される。グローバルキーレジスタ1824は、グローバルキーレジスタ1834に格納される。SE EPID1828は、SE EPID1838に格納される。XuMSR導出キー1840階層では、マイクロコードSVN差異1841がPRFループ1842およびPRFループ1844に入る。マイクロコードSVN1832レジスタがデータをPRFループ1842に送り、グローバルキーレジスタ1834がデータをPRFループ1844に送る。PRFループ1842の出力およびTCB SVNレジスタ1836の出力が、PRFループ1846に入り、PRFループ1844の出力およびTCB SVNレジスタ1836の出力が、PRFループ1848に入る。PRFループ1846の出力は、SVNベースキー1850に格納され、PRFループ1848の出力はグローバルキー1852に格納される。マイクロコード1860階層では、Intelが知らない固有のルートヒューズ1894をシード1 1856に格納して、EPIDグループIDヒューズがEPIDグループ1858に格納される。シード1 1856は、PREループ1886およびPRE1888に入る。PREループ1888の出力は、SE EPIDシード1 1892である。PRFループ1886の出力はSE opsシード1890である。SE opsシード1890は、SVNベースキー1850から得られ、要求されたSVN1864は、CMAC1868関数に入り、SE opsキー1872を生成する。現在のSVN1862は、SVNベースキー1850から得られ、CMAC1866関数に入り、SEプロビジョンキー1870を生成する。SVNベースキーが{0、0、0}1874に等しい場合、SVNベースキー1850は、シード0 1876に格納される。シード0 1876は、PRFループ1878およびPRFループ1880に入る。PRFループ1878の出力は、SE EPID ID1882であり、PRFループ1880の出力は、SE EPIDシード0 1884である。
全てのコアが同期して、ドアベルまたは類似したメカニズムを利用して、全てがMCHECKに入るようにする。全てのコアがMCHECKを実行中になると、(1)uCodeが、ヒューズの読み取り、復号、およびロックを行う、(2)uCodeがPRFループをSVNキーに、PRFループをOOBEキーに利用して、uCodeのSVNを両キーに投入する。uCodeは、そのSVNをTCB SVNレジスタに書き込み、その部分をロックする、(3)MCHECKローダまたは早期MCKECKコードが、MCHECKのSVNをTCB SVNレジスタに書き込み、ロックする、(4)マイクロコードパッチ・ローダが、マイクロコードパッチSVNをTCB SVNレジスタに書き込み、ロックする、という各ステップがBSPから行われる。APは、キーフローに参加しない。
マイクロコード初期化中、またはEGETKEYの呼び出し時に、
マイクロコードは、要求を満たすのに必要となるSEベースキーを計算する。ベースキーは、さらに性能向上のために利用するために、CMA内にキャッシュされてよい。表12−4は、ベースキーの計算方法を示す。
プラットフォームのウォータフォールでユーザのプライバシーおよびデータを保護するために、256ビットのランダム所有者エポックをキー導出に含める。この値は、所有者変更中にランダムに作成される。エンクレーブキーを利用する前に、ソフトウェアは、所有者エポックをSE_EPOCH_MSRに書き込んでよい。これはBIOSがフラッシュに永久書き込みを行うことにより実行されてよい。一部のユーザ入力(ユーザ起動パスワードのハッシュ等)からこれを計算することもできる。または、エンクレーブの利用を許可する前に、セキュアなエンクレーブドライバにより提供されてもよい。
この値の機密性は、プラットフォームにより暗号化されるデータが、ウォータフォールの後でラップトップの所有者により最初に認可されているエンクレーブでは復号できないことを保証する必要がある。この値のセキュリティ侵害は、エンクレーブデータのセキュリティ侵害につながらない。
SEキー情報構造は、メモリまたはパッケージの保護された領域に格納されている非永久構造である。CMAが最もよく利用される位置であるが、オンダイで保護されたストレージのいずれかを利用することも可能である。電源投入中には、SEキー情報を初期化することができる。キーIDは乱数値に設定され、キーカウントは0に設定される。エンクレーブキー、許可書キー、およびレポートキーが利用されるごとに、キーIDが読み出され(the KeyID read)、キーカウントを増分する。2^32個のキーが利用された後で、キーIDが新たな乱数の値に変更され、キーカウントが0にリセットされる。SEキー情報配置を5に示す。
電源が投入されると、プラットフォームキーテーブルをuCodeにより初期化する。BIOSその他のホストファームウェアは、現在の所有者エポックを、永久ストレージから、または、ユーザから取得して、これをLoadOwnerEpochMSRに書き込む。この時点ではエンクレーブキー階層が利用可能である。
エンクレーブのアーキテクチャの多くは、エンクレーブデータの認証および機密性を提供するためにキーが利用され、プロセッサの複雑性を最小限にとどめるために、アーキテクチャエンクレーブを利用して、高レベルの利用のためにこれらキーを処理する。例えば、クオーティング・エンクレーブは、REPORTキーを利用して、EREPORT命令により生成されたREPORT構造がプラットフォーム上に作成されたことを確認して、PERMITINGエンクレーブは、PERMITキーを利用して、エンクレーブが起動されたときにEINITが消費するエンクレーブPERMITを生成する。
加えて、任意のアプリケーションレベルのエンクレーブが、エンクレーブ外のプラットフォーム上の格納されている秘密をシールするためにキーにアクセスする必要があり、アプリケーションエンクレーブが再度確立されたとき(電力サイクル中であっても)シールは解除される。
こうするためのメカニズムはEGETKEY命令である。これは、現在のソフトウェア環境について秘密を構築するための単一のインタフェースである。
EGETKEYは現在、以下のキーにアクセスを提供している:(1)プロビジョンキーID(プロセッサについて一意に暗号化された(プロビジョンキーを利用して)データブロブを識別するために、アーキテクチャ・プロビジョン・エンクレーブが利用する)、(2)プロビジョンキー(プロセッサについて一意に暗号化されたデータブロブを復号するために、アーキテクチャ・プロビジョン・エンクレーブが利用する)、(3)プロビジョンシールキー(エンクレーブが、所有者が変わっても復号できるような形にEPIDを暗号化するために、アーキテクチャ・プロビジョン・エンクレーブが利用する)、(4)許可証キー(許可証を作成するためにアーキテクチャ許可証エンクレーブが利用する)、(5)レポートキー(レポート構造を検証するために、アーキテクチャ・クオーティング・エンクレーブが利用する)、(6)ISV認証キー(ISV AUTH KEY)(特定の対象アプリケーションエンクレーブのための認証データを作成するために、アーキテクチャ・クオーティング・エンクレーブが利用する)、(7)認証キー(AUTH KEY)(アーキテクチャ・クオーティング・エンクレーブが受け取ったデータを認証するために、アプリケーションエンクレーブが利用する)、(8)シールキー(エンクレーブ外に格納を希望するデータを暗号化するために、アプリケーションエンクレーブが利用する)、(9)OOB経験キー(アウトオブボックス経験利用のために(例えばBluRayプレーヤ)暗号化データを予めプロビジョンするために、ISVが利用する)。
これら値の殆どは、未加工でプロセッサに常駐はせず、実際には、単一のヒューズキーの値からEGETKEYの要求に応じて導出される。これらキーのそれぞれが単一のキーではなく、可能性のあるセットからの単一のキーにあるときに要求に応じて導出される。配信された特定のキーは、複数のパラメータに依存しており、そのうち一部がユーザ選択可能であり、その他がシステムまたは特定の状態に基づいている。
キーを選択するために、キー要求構造をEGETKEY命令への入力として利用する。キーを選択することに加えて、ユーザは、キー要求構造を利用して、キー生成中に利用を希望する、制御下にあるこれら変数を、呼び出し者に特定させる。以下の図面は、キー要求構造を示す。
キー選択は、ユーザが必要とするキーを特定するのに利用され、キーポリシーは、キーを作成するのに利用されるさらなる値を確かめるのに利用される(それが、アーキテクチャエンクレーブの特定のセキュリティバージョンであろうと、アーキテクチャエンクレーブの特定のセキュリティバージョンであろうと、アプリケーションエンクレーブの特定のバージョンであろうと、現在のエンクレーブに関連付けられた計測値レジスタであろうと(EGETKEYがENCLAVE内から呼び出されるとき))。
さらなるランダムネスがキー導出に利用することもでき、これは特に、キーの消耗を防止するために必要であり、PERMITINGおよびQUOTINGアーキテクチャエンクレーブにより利用される。また、シールキー(SEALing key)を作成するときにもアプリケーションエンクレーブにより利用される。ゼロにセットされたフィールドは、ランダムネスを追加しないことを意味しており、そうでない場合にはフィールドは、256ビットの整列したデータの値を指し示すことになる。以下の表は、キー選択フィールドの構造を特定する。
キーポリシーは、ビットフィールドセレクタであり、特定の値(ユーザまたはシステム状態いずれからのものであっても)が、キー導出に利用されるかを判断するのに利用される。
2つのイネーブルレベルがエンクレーブに提供される。第1のイネーブルは、BIOSによるビットセットのoptである。これは一度の書き込み関数(write once function)である。次のリセットまでにエンクレーブ機能をイネーブルまたはディセーブルする。第2のイネーブルは、OSまたはVMMに提供されて、必要に応じてエンクレーブ機能をONまたはOFFに切り替える。
図19は、本発明の一実施形態にみることができるエンクレーブCTL_MSRレジスタを示す。最下位ビットがイネーブル1900である。レジスタのビット1が1910でOnである。ビット2から63はリザーブされている。
エンクレーブ機能は、先ず、図19に示すエンクレーブCTL_MSRにイネーブルビットを設定することから始まる。このビットは、パッケージのリセットが行われるとディセーブルに初期設定される。このビットは、パッケージリセットの後に一度書き込むことができる。
BIOSは、ビットをセットして、エンクレーブをイネーブルする。BIOSがビットをクリアすると、エンクレーブは、その部分がリセットされるまでイネーブルすることができない。
ソフトウェアは、CPUID命令を実行することで、エンクレーブのサポートを検知することができる。CPUIDは、エンクレーブがサポートされているか否かを示す結果を戻す。
ビットのOptがクリアされると、CPUIDは、そのエンクレーブを実行しないことを報告する。
システムソフトウェアは、図19に示すエンクレーブCTL_MSRを利用してエンクレーブ機能を制御する。Onビットは、ソフトウェアに、エンクレーブ機能に対するアクセスを動的に制御させる。
ソフトウェアは、CPUID命令を実行することで、エンクレーブのサポートを検知することができる。エンクレーブCTL MSRにONビットがセットされている場合に、エンクレーブサポートが示される。
TCSMSRレジスタは、TCSのアドレスを含む各プロセッサ上のレジスタであり、例外処理およびRDTCSPTRにより利用される。エンクレーブに入るときに装填される。レジスタは、EENTERを実行するときにTCSの値を装填され、ERDTCSPTRにより読み取られる。レジスタサイズは、プロセッサのモードに基づく。
各プロセッサ上にあるエンクレーブ・ベースアドレスレジスタは、実行中のエンクレーブの下位アドレスを含み、マイクロコードによりエンクレーブに入るときに装填される。レジスタサイズは、プロセッサのモードに基づく。このレジスタはソフトウェアからは見えず、一時的なマイクロコード(microcode temporary)である。
レジスタは、現在のエンクレーブのアドレスの上限を保持し、エンクレーブに入るときに装填される。レジスタは、エンクレーブが実行を開始するときに、SECSに格納されている値を装填される。これは、一時的なマイクロコードレジスタである。レジスタサイズは、プロセッサのモードに基づく。
エンクレーブページキャッシュ(EPC)最大サイズレジスタは、EPCの最大サイズを示す。このサイズは、4096バイトのページの数で与えられる。これは32ビットのレジスタである。このレジスタは、読み取り専用であり、現在の設計でEPCがサポートする最大サイズを示す。
EPCサイズレジスタEPC_SIZE MSRは、EPCの現在定義されているサイズを示す。レジスタを装填することで、EPCがそのサイズに定義される。この値は、4096ビットのページで与えられる。例えば、4096ビットのページ1枚が1である。レジスタの値は、EPC_MAX値を超えることはできない。値がEPC_MAX値を超えると、WRMSR命令によりGP不良がとられる。このレジスタに書き込むことで、書き込み前に、EPCの全てのデータが無効化される。ソフトウェアは、このレジスタを更新する前に(必要であれば)全てのEPCエントリをセーブしてよい。
EPCベースレジスタは、EPCのベースの位置を示す。このレジスタに書き込むことで、書き込み前に、EPCの全てのデータが無効化される。ソフトウェアは、このレジスタを更新する前に(必要であれば)全てのEPCエントリをセーブしてよい。
概して、外部インタフェースは、エンクレーブのセキュリティを侵害しうる転送またはトランザクションを許可しない。セキュアなエンクレーブは、エンクレーブキーについてランダムな数を要求する。乱数生成器は、マイクロコードによりセキュアにアクセス可能である。パーツのコアに配置される必要はない。
図26は、本発明の一実施形態における、デジタル乱数生成器のためのプロセッサパッケージを示す。プロセッサパッケージ2600は、コア0 2640、コア1 2670という複数のコアを含みうる。コア0 2640は、マイクロコード2642、マイクロコード2644、マイクロコード2646、RNGマイクロコードモジュール2650、およびRNGキュー2654を含んでよい。コア1 2670は、マイクロコード2672、マイクロコード2674、マイクロコード2676、RNGマイクロコードモジュール2680、およびRNGキュー2684を含んでよい。読み取りランダム命令2630は、マイクロコード2642と通信してよく、読み取りランダム命令2635は、マイクロコード2672と通信してよい。プロセッサパッケージ2600は、さらに、DRNG2602を含んでよく、DRNG2602は、STD2608、OPE2610、PSK2612、およびTSC2614をとる。DRNG2602は、デジタルエントロピーソース2604を取得することができ、これはオンラインの自己テスト2606に接続する。オンラインの自己テスト2606の出力は、組み合わせられた調節器/決定論ランダムビット生成器(DRBG)2620の1つの入力であってよい。
エンクレーブは、作成時にデバッグエンクレーブとして設定されてよい。デバッグエンクレーブは、EDBGRDおよびEDBGWR命令を利用してエンクレーブの内容に外部アクセスすることができる。デバッグエンクレーブは、ECREATE内にデバッグエンクレーブを設定することによりセットアップされる。このビットはエンクレーブのECS内に格納される。
デバッグビットクレアで作成されるエンクレーブは、生成エンクレーブである。エンクレーブは、EPCは、エンクレーブがデバッグエンクレーブであると示すデバッグビットを含んでいる。エンクレーブは、メインメモリ内に、またはディスク上に、暗号化されたままで残っている。エンクレーブの内容を探す必要のあるデバッガは、メモリをEPCに装填する。EDBGRDおよびEDBGWR命令を利用して、EPCに常駐するエンクレーブメモリの位置にアクセスすることができる。デバッグエンクレーブは、実行するために許可証を必要とせず、有効な許可証なしに実行される。
生成エンクレーブに入るときにデバッグ制御レジスタDR7は、TCSセーブ領域にセーブされる。DR7は図27に示されている。図27は、本発明の一実施形態では、デバッグレジスタDR7 2700である。レジスタDR7 2700は、L0 2702、L1 2706、L2 2710、L3 2714、G0 2704、G1 2708、G2 2712、およびG3 2716を含む。DR7 レジスタ2700の他のビットは、LE2718、GE2720、001 2722、GD2724、00 2726、R/W0 2728、LEN0 2730、R/W1 2732、LEN1 2734、R/W2 2736、LEN2 2738、R/W3 2740、およびLEN3 2742を含む。
ビットL3−L0およびG3−G0は、0の値に設定されている。DR7は、エンクレーブの退出時に元の値に設定される。
デバッグエンクレーブについては、デバッグレジスタの値を変更しない。RFLAGS.TFは、EENTER命令の開始時に設定され、以下の2つの場合を考慮に入れる必要がある。
1つの場合は、デバッガがレガシー(非SE認識)である、または、エンクレーブが生成(非デバッグ)モードにある場合である。
SE認識デバッガは、デバッグモード・エンクレーブを対象としている。
第1の場合には、#DB例外が、次のEEXIT命令の対象において生じうる。これにより、エンクレーブが、大きく、不透明な処理(large, opaque operation)として取り扱われる。第2の場合には、ユーザは、エンクレーブによる単一のステップへの完全な自由度を利用することができる(complete freedom to single step through the enclave)。この行為は、エンクレーブ内の3つのデータフィールド、および、EENTER、EEXIT、および、EIRETにおけるRFLAGS.TFの特殊処理によりサポートされる。
TCSセーブ領域にレジスタ値をセーブする。レジスタは0に設定される。エンクレーブの終了時には、レジスタは、エントリ値に復元される。エンクレーブが、開始時にイネーブルされた分岐トレース(branch trace)を有する場合、EENTERがエンクレーブに入る前の最終エントリとなる。エンクレーブの終了時に、終了後の始めの位置が分岐トレースに書き込まれる。
Int nおよびInt 3命令は、エンクレーブ内で実行されるときにGP不良として報告される。デバッガは、エンクレーブをデバッグするときにGP不良条件をフックすることができる。
本文書では、AESブロック暗号のためにCMACモード処理を実施する新規な技術を記載する。CMACは、メッセージの真偽をサポートするモードであり、メッセージAおよびキーKを入力として受け付けて、認証タグTを戻す。認証タグの導出は、CBC(暗号ブロック鎖)アルゴリズムを利用して行われる。CMACは、長さ拡張攻撃に対する保護メカニズムを含むために、CBCよりも複雑である。これらを「CMACの3つの特性」と称する。以下では、CBCおよびCMACを概略する。
図20は、本発明の一実施形態で利用される暗号ブロック鎖アルゴリズムを示す。初期化ベクトル2000およびステージ1入力2010は、排他的論理和ゲート2012に入る。排他的論理和ゲート2012の出力は、ステージ1ブロック暗号2015に入る。ステージ1ブロック暗号出力2018は次に、ステージ2排他的論理和ゲート2022に、ステージ2入力2020とともに入る。排他的論理和ゲート2022の出力は、ステージ2ブロック暗号2025に入る。ステージ2ブロック暗号出力2028は、暗号ブロック鎖の次の段階に入る(不図示)。
CBCアルゴリズムは、ブロック暗号を利用して、一部のデータの機密性を確保する、または、このデータの認証タグを計算する。CBCアルゴリズムの基本をなす構想は、前の暗号からの出力が、暗号化前に次の入力ブロックでXORされる、というものである。このようにして、入力データに存在しうるパターンを、暗号文から排除することができる。また、ブロック暗号のトランザクションの間のXOR処理の組み合わせにより、理想的には許されない(forgeable)メッセージ認証タグを導出するために混合が大幅に行われる(strong mixing)。
CBCアルゴリズムは、図20と以下に示される。暗号は、AESの場合同様に、128ビットの暗号と想定する。
CMACの仕様は、CBCアルゴリズムを初期化および終了させるために3つのさらなるアルゴリズムを含む。これらは、CMACの「3つの特徴」と称される。1つ目の特徴は、対称鍵Kから2つのサブキー値K1およびK2を導出することに関する。サブキーK1およびK2は、中間値Lから導出される。CMACは、対称鍵の値Kを利用して、ゼロからなるストリング(つまり0128)に、対称鍵値Kを利用して対称鍵ブロック暗号変換を行うことでLが得られる、と示している。この関係を、式(1)L=CIPHERK(0128)で示す。
Lが導出されると、Lの最上位ビットをチェックする。これがゼロであれば、K
1を、左に1ビットシフトすることにより、Lから導出される。そうでない場合は、Lを左に1ビットシフトして、特殊な値R
bでXORして、K
1を生成する。R
bは、バイナリ形式の(0
12010000111)として定義される。K
2も同じプロシージャでK
1から生成される。サブキーK
1、K
2の導出は、以下の擬似符号に示されている。MSB()がある値の最上位ビットを示すこととする。
CMACの第2の特徴は、入力データにCBCアルゴリズムを利用する前に、パディングを行うことに関している。データの最後のブロックが完全なブロックではない場合にはそのブロックを、1に必要な数の0を付けたビットでパディングして、最終的なブロックが完全なものになるようにする。
CMACの第3の特徴は、長さ拡張攻撃を回避するために行われる最終ブロックに対する修正に関している。最終ブロックが完全に1ではない場合(パディング不要の場合)には、最終ブロックをサブキーK1でXORする。そうでない場合には、サブキーK2でXORする。CMACタグ生成および検証アルゴリズムを以下に示す。
以下では、対称鍵ブロック暗号がAESとして利用され、プロセッサがAESラウンド加速(AES round acceleration)の命令セットをサポートしている場合の、CBC()アルゴリズムの実装方法例を示す。Intelアーキテクチャは、ウェストミア(Westmere)プロセッサ(2009)およびそれ以降の時間フレームにおいて4つの新たな命令をサポートする。これら命令は、AESENC(AESラウンド暗号)、AESENCLAST(AES最終ラウンド暗号)、AESDEC(AESラウンド復号)、AESDECLAST(AES最終ラウンド復号)である。これら命令の仕様を以下に示す。
タグ検証プロセスがタグ生成と同じであることから、CMACモードを、AESラウンド命令を利用して実装するには、AESENC AESENCLASTのみの呼び出しで十分である。図21は、単一のAESブロックの暗号化と関連付けられたフローチャートである。図22は、CBCアルゴリズムを利用する多数のAESブロックの暗号化と関連付けられたフローチャートを示す。
キースケジュール変換を実装するためには、逆混合列(inverse mix columns)用のAESIMC命令とAESKEYGENASSIST命令とを利用することができる。AESKEYGENASSISTは、暗号化に利用されるラウンドキーを生成するために利用される。AESIMCは、暗号ラウンドキーを、均等な逆暗号化モデルに従って復号に利用可能な形式に変換するために利用される。AESIMCおよびAESKEYGENASSIST命令は、http://softwarecommunity.intel.com/articles/eng/3788.htmに記載されている。
CMACは、128ビットの量のビッグエンディアン記述を利用して示される。CMACをリトルエンディアン・マシンを利用して正確に実装するには、16バイト幅の反映処理をソースコード実装のある時点で行う必要がある。この処理は、PSHUFB命令(1クロック・レイテンシー、スループット)の利用により迅速に行うことができる。以下に、バイトシャッフルが必要な時点を記述する。
SUBKEYS()アルゴリズム実装バイト反映(byte reflection)は、AES暗号をゼロストリングに利用して導出された後であって、2つのサブキーが導出される前に、Lに対して行われる必要がある。バイト反映は、2つのサブキーに対して、Lから導出された後で必要である。SUBKEYS()実装は、以下のCで示される。
次に、最終ブロックが完全ではない場合に限って、最終ブロックに対するバイト反映をパディングの前後に行う必要がある。これらのステップは以下のCの実装例に示されている。
function_pshufb()が、128ビット幅のバイト反映を行う。
<SMIのSE要件>
エンクレーブは、SMM空間内での実行を許可されていない。エンクレーブをSMMモードで実行しようとすると、命令のGP不良が生じる。SMIがエンクレーブ内で実行している間に生じると、プロセッサは、レジスタ状態を、遠隔のエンクレーブ内にセーブして、終了する。終了すると、TBD MSRビットを、エンクレーブの実行中にSMIが生じたことを示すように設定する。SMMコードは、エンクレームデータにアクセスできない。EPC領域に接触しようと試みると、実際のモードではジャンクデータを戻し、保護されたモードではEPCページ不良を戻すこととなる。
一部の命令は実行が許可されない。どの命令が合法かを決定するためには幾つかの一般法則が利用される。
1.エンクレーブ内ではリングレベルの変更は許可されない。リングレベルの変更または変更の可能性の命令は禁止されている。
2.外部ソフトウェアは、エンクレーブ内のVMEXITSにサービス提供できない。エンクレーブ内でVMEXITを生成する、または生成する可能性のある全ての命令を禁ずる。
3.ソフトウェアは、エンクレーブ内で仮想マシンを生成することができない。全てのVMX命令を禁ずる。
4.エンクレーブの内部でI/O参照を実行する命令を禁ずる。
エンクレーブの第一世代では、プロセッサは、エンクレーブに入るときに、IOPLセットを0として、リング3で実行されてよい。エンクレーブを仮想化または非仮想化環境で実行する際に、プログラミング環境を保存するためには、表18−1にリストされている命令が合法である。
エンクレーブ内の状態には制約が課されている。エンクレーブに入るとき、GDTR.limit、LDTR.limit, IA32_EFER.SCE、および、IA32_SYSENTER_CSをTCS領域にセーブする。ローカルの値がクリアされる。これらレジスタへアクセスする、またはアクセスを生じさせる命令は、エンクレーブ内で失敗する。GDTR.limit、LDTR.limit, IA32_EFER.SCE、および、IA32_SYSENTER_CSは、エンクレーブを抜けるときに復元される。
エンクレーブの寿命は、独立した(distinct phases)に分類できる。第1の段階は、エンクレーブ生成である。第2の段階は、エンクレーブ利用である。最終の段階は、エンクレーブ破壊である。
エンクレーブの生成および利用には、OS/VMMのサポートが必要となる。エンクレーブはOS/VMMにセキュリティ面で依存しないが、一定のハードウェアデータ構造を適切に維持するためにはOS/VMMが必要となる。OS/VMMがこれら構造の維持に失敗すると、セキュリティは損なわれないが、エンクレーブ全体が不良となる場合がある。
幾つかの命令は、エンクレーブの証明、秘密データのシールおよびシール解除、および、認証されたエンクレーブの許可をサポートする。
第1の段階では、エンクレーブは、アプリケーションによる利用に備えて、セキュアに構築され、内部ソフトウェア環境が設定されていてよい。3つの命令を利用してエンクレーブを生成する。第1の命令ECREATEは、最初の状態環境を設定する。この命令は、エンクレーブキーを生成し、装填し、暗号化を行い、エンクレーブデータ構造の格納に利用される2ページの整合性チェックを行う。第2の命令EADDPREは、エンクレーブに1ページのデータを追加する。詳しくは、エンクレーブ内のコード、スタック、およびヒープに必要なページを追加する。第3の命令EINITは、公知の状態に内部ソフトウェア環境を設定する。この命令の完了時には、エンクレーブは第2の段階である「利用」に移動している。
EINITを実行する前に、構築ソフトウェアは許可証を、EMKPERMITを実行することにより、または、許可エンクレーブを利用することにより取得していてよい。
エンクレーブは、EENTER命令により入力される。この命令により、マシンがエンクレーブモードへと遷移する。そして、予め定義されたエントリポイントへ制御を渡す。EEXIT命令は、エンクレーブから外部アプリケーションに戻る。EIRRET命令は、割り込みの終了からエンクレーブに戻る。
EENTERまたはEIRETを介してエンクレーブに入る際には、以下の処理を命令により実行する。すなわち、処理は、GDTR.limitのセーブおよびクリア、LDTR.limit、IA32_EFER.SCE、IA32_SYSENTER_CSである。抜けるときに、GDTR、LDTR、IA32_EFER、および、IA32_SYSENTER_CSを復元する(On exit restore GDTR, LDTR, IA32_EFER, and IA32_SYSENTER_CS)。
エンクレーブの破壊には命令は存在しない。
EDBG_READ命令は、デバッグエンクレーブ内のある位置の8バイトの読み取りを行う。非デバッグエンクレーブにはアクセスが許可されていない。EDBG_WRITE命令は、デバッグエンクレーブ内のある位置への8バイトの書き込みを行う。非デバッグエンクレーブにはアクセスが許可されていない。
エンクレーブページキャッシュ(EPC)は、2つの命令を解して管理される。2つの命令は、EPCページ(ELPGおよびEWBINVPG)を装填/格納する。
EREPORTは、エンクレーブ計測値を保持する暗号的に保護された構造を生成する。EGETKEYは、様々な種類のエンクレーブ固有キーを取得する手段を提供する。EMKPERMITは、認証されたエンクレーブに対する許可証を生成するために利用される。
注
2:「内部」には利用可能なモデルがないが、内部からEMKPERMITに実行を許可することにまつわる被害は知られていない。
注
3:将来のバージョンでは、リング0からもエンクレーブへのエントリが可能となるかもしれない。
割り込みが生じると、プロセッサ状態をエンクレーブ内にセーブして(隠して)、状態をクリアする。さらに、割り込みの戻りアドレスを隠してもよい。
エンクレーブの実行中に生じる割り込みは、オペレーティングシステムが予期するような形態の割り込みスタックに情報をプッシュして、OSコードを変更する必要がないようにする。これを遂行するために、トランポリンコードへのポインタを、割り込みスタックへとRIPとしてプッシュする。このトランポリンコードは、ゆくゆくは、特殊パラメータ(q.v.)を有するEENTER命令によりエンクレーブへ戻る。
利用される割り込みスタックは、非SEモードで利用されたものと同じ規則により選択される。つまり規則とは、(1)特権付きレベル変更がある場合には、割り込みスタックは、新たなリングに関連付けられたものである、(2)特権付きレベル変更がない場合には、現在のアントラステッド・スタック(Untrusted Stack)を利用する、(3)IA−32e ISTメカニズムを利用する場合には、この方法を利用して割り込みスタックを選択する。
図23は、スタックスイッチで割り込んだ後のアプリケーションおよび割り込みスタックの一実施形態を示す。現在のセーブ状態領域フレーム2300は、RSPレジスタ2305を含む。スレッド制御構造2310は、状態セーブ領域2312および割り込み戻りルーチン2314のカウントを含みうる。割り込みスタック2330は、SSレジスタ2332、RSPレジスタ2334、フラグレジスタ2336、CSレジスタ2338、命令レジスタ2340、およびエラーコード2342を含む。割り込みスタック2330は、RSPレジスタ2334内のデータを、アプリケーションスタック2320およびセーブ状態領域2300のカウントに送ってよい。エラーコード2342は、プッシュ2346後に、RSPから来てよい。割り込みルーティングルーチン2314および命令レジスタ2340は、uRTS2344のスレッドごとのトランポリンを送出する。
いずれの場合にも、割り込みスタックおよびそれにプッシュされた情報の選択は、非SE処理と矛盾しない。図23は、スタックスイッチで割り込んだ後の、アプリケーションおよび割り込みスタックを示す。スタックスイッチのない割り込みは、アプリケーションスタックを利用する。加えて、TCSポインタは、後ほどEENTER命令が、割り込み後にエンクレーブを再開するときに利用するので、RBXに配置される。
TCS::IRR(割り込み戻りルーチン)は、後に特別なスレッドに戻る、スレッドごとのコードシーケンスを指し示している。このポインタは、戻りRIPとして割り込みスタックにプッシュされる。これによりデータ構造のセットが、IRETを、割り込み戻りコード(特別なEENTER命令を含む)が実行されるアプリケーションに戻す。EENTERは、割り込み時に初期化されるRBXレジスタをとり、これをTCSとして利用して、エンクレーブに再度入る。
CF(キャリー・フラグ)、SF(サイン・フラグ)、PF(パリティ・フラグ)、OF(オーバフロー・フラグ)、AS(調節フラグ)、DF(方向フラグ)、ZF(ゼロ・フラグ)というRFLAGSのビットは、レジスタを割り込みスタックにプッシュする前にクリアされる。
図24は、本発明の一実施形態の複数の状態セーブ領域スロットのスタックを実装することのできる方法を示す。スレッド制御構造2400は、次の状態セーブ領域スロット2402、現在の状態セーブ領域スロット2404、および、状態セーブ領域スロット2406を含んでよい。状態セーブ領域0 2410、状態セーブ領域12412、および状態セーブ領域N 2418は、状態セーブ領域内の3つの別個の選択位置である。次の状態セーブ領域スロット2402は、状態セーブ領域で利用される位置を特定する(状態セーブ領域0 2410)。現在の状態セーブ領域スロット2404は、状態セーブ領域で利用される位置を特定する(状態セーブ領域1 2412)。状態セーブ領域スロット2406は、状態セーブ領域で利用される位置を特定する(状態セーブ領域N 2418)。
状態セーブ領域は、割り込み時点のエンクレーブ状態を保持する。割り込みは、次のエンクレーブに再度入る可能性のあるユーザモードに送られうるので、SSAは、図19−3に示すような複数のSSAスロットからなるスタックである。利用される状態セーブ領域の位置は、TCSの3つの変数により制御されるが、3つの変数とは、状態セーブ領域スロット(NSSA)の数(状態セーブ領域スタックの全スロット数を定義する)、現在の状態のセーブ領域スロット(CSSA)(次の割り込み上で利用される現在のスロットを定義する)、状態セーブ領域(SSA)(割り込み上にプロセッサ状態をセーブするのに利用されるセーブ領域スロットのセット)である。
エンクレーブ内のスレッド上で実行中に割り込みが生じたときには、マイクロコードが、TCS::SSAおよびTCS::CSSAを調べて、利用されるセーブ領域を決定する。プロセッサ状態がセーブされクリアされ(秘密のリークを防止するために)、TCS::CSSAを増分する。後述するように、最終スロットで例外が生じた場合には、例外をエンクレーブに送ることができない。
注:EENTERでは、CCSAをNSSA未満としてよく、割り込みについて少なくとも1つのセーブ領域が存在するよう保証される(割り込みから戻るためにEENTERを利用中ではない限り)。
図25は、割り込み、不良、およびトラップの状態遷移を有する状態マシンの一部を示す。可能性のある状態は、非アクティブ2500、アクティブ2510、予期2520、処理済み(EENTER不法)2530、および処理中2540である。EENTERがTCS:ENTRY2502に配置されると、非アクティブ2500は、アクティブ2510に遷移する。EEXIT2504が生じると、アクティブ2510は非アクティブ2500に遷移する。割り込み、不良、またはトラップ2512が生じると、アクティブ2510は予期2520に遷移する。EIRET2514が生じると、予期2520はアクティブ2510に遷移する。EENTERがTCS:HANDLER2524に配置されると、予期2520が処理中2540に遷移する。EIRET2522が生じると、予期2520が処理中2540に遷移する。割り込み、不良、またはトラップ2526が生じると、処理中2540は予期2520に遷移する。EEXIT2532が生じると、処理中2540が処理済み2530に遷移する。エンクレーブ例外ハンドラで処理割り込みが生じ、EIRET2534が生じると、処理済2530が処理中2540に遷移する。エンクレーブ例外ハンドラからではない処理割り込みが生じ、EIRET2534が生じると、処理済み2530がアクティブ2510に遷移する。点線の遷移2522、2526、2534は、エンクレーブ例外ハンドラ内の割り込みの処理中のみに生じる。
図25は、エンクレーブ状態マシンの、割り込みに対処する部分を示す。割り込みは、オプションのスタックスイッチおよび割り込みスタックに合成割り込みフレームをプッシュすることから始まる。イベントが割り込みであった場合には、エンクレーブは割り込み状態に入る。イベントが例外であった場合には、エンクレーブは例外状態に入る。これら2つの状態は、エンクレーブへのエンクレーブ例外を確実に配信するために、さらには、攻撃アプリケーションコードによるスプリアス例外の配信を妨げるために、区別される。
割り込み状態に遷移すると、アントラステッド・コード(アプリケーション、OSまたはこれらの両方)は、EENTER/RETURN_FROM_INTERRUPTを利用したエンクレーブの再開を行うだけでよい。
例外状態に遷移すると、アントラステッド・コード(アプリケーション、OSまたはこれらの両方)は、(1)EIRETを利用してエンクレーブを再開して割り込まれたIPに戻る。これは、例えばページ不良を処理する方法である。割り込みが不良により生じ、不良条件を修正するために何も行われていない場合には、不良命令を再度実行して、不良を再度起こす(and will fault again)。しかしトラップの後のEIRETは、トラップ命令の後に命令に戻る、(2)エンクレーブ例外ハンドラを呼び出す、(3)スレッドまたはエンクレーブを破棄する、と決定してよい。
予期状態のEENTERは、処理中状態に進む。トラップハンドラからのEEXIT(処理中状態)は、処理済状態に進む。ENTER/NORMALは、この状態において不法である。トランポリンからのEIRETは、最後の割り込みからSSAにプッシュされた状態(アクティブまたは処理中状態)を再開する。
セキュアなエンクレーブ命令を2つのオペコード(つまり、特権付きオペコードと特権なしオペコード)に分割する。命令処理は、命令の呼び出し時にRAXの値により決定される。
ECREATE命令は、保護されているSECSを初期化する。ソースオペランドは、page_info構造を指し示している。コンテンツページフィールドは、保護されていないSECS構造を指し示している。SECS構造は、ページが整列されていてもよい。SECSベースの下位の12ビットおよび境界値は0であってよい。SECSは、EPC内の空のスロットのアドレスである。sec_infoは、保護されていないsec_info構造のアドレスである。対応するsec_infoフラグフィールドは、適切に初期化されてよい。
<EADDPRE>
<命令の説明>
EADDPREは、特権のあるソフトウェアに、lin_addrが指定するエンクレーブ内のページに、エンクレーブの外部のページをコピーさせ、エンクレーブページの属性は、sec_infoフラグフィールドを利用して設定される。命令の一部として、ページをハッシュして、結果生じるハッシュ値を、エンクレーブの計測値レジスタに拡張する。EADDPREは、EINIT命令がまだ初期化していないエンクレーブに対してのみ実行することができる。
<EADDPOST>
<命令の説明>
EALLOCATEは、特権のあるソフトウェアに、lin_addrが指定するエンクレーブのSMAPエントリを初期化させ、エンクレーブページの属性は、sec_infoフラグフィールドを利用して設定される。エンクレーブがページにアクセスできるようになる前に、EACCEPT命令を用いてエンクレーブのページにアクセスしてよい。EALLOCATEは、EINIT命令が初期化したエンクレーブにのみ実行される。
<EMKPERMIT>
<命令の説明>
エンクレーブまたはライセンスを認証して、これを用いて許可証を生成する。rbx==NULLである場合には、証明書はIntelにより署名されてよい。他の場合には、ライセンスは、rbx許可証に示されるキーにより署名されてよい。
<EINIT>
<命令の説明>
EINITは、エンクレーブを、ソフトウェア環境で実行準備できた状態として表示する。ついに初期化に成功すると(At the end successful initialization)、EENTERをエンクレーブに対して許可する。
<ELPG>
<命令の説明>
この命令は、ページをエンクレーブページキャッシュ(EPC)に装填するのに利用される。
<EWBINVPG>
<命令の説明>
この命令は、EPCからメインメモリにダーティページを書き戻すために利用される。
<EUPSMAP>
<命令の説明>
この命令は、EPCに常駐しているエンクレーブページのバージョンをチェックおよび更新する。
<EREMOVE>
<命令の説明>
この命令は、データがEPCに装填されたときにSMAPを更新する。
<EADDSMAP>
<命令の説明>
この命令は、エンクレーブを既に初期化したとき、SMAPに新たなページを追加するために利用される。
<EMODIFY>
<命令の説明>
この命令は、SEC_INFOフィールドを修正して、エンクレーブが該エンクレーブ内のページを修正することを許可する。エンクレーブは、ページに対する変更を要求するが、プロセスを完了するために変更を受け付けてもよい。
<EACCEPT>
<命令の説明>
エンクレーブ内のソフトウェアは、この命令を利用して、SEC_INFOフィールドへの変更を受け付ける。これにより、SMAPを新たなページタイプに更新することができる。
<EENTER>
<命令の説明>
EENTER命令は、エンクレーブに実行を渡す。命令の最後に、CPUは、TCS oENTRYまたはoHANDLERで指定されるIPで、エンクレーブモードで実行されている。EENTERは、TCSが有効であり、エントリ可能であることを確かめる。TCSおよび対応するSSAは、命令を続けるためにメモリに常駐させてよい。EENTERはさらに、状態マシンをチェックして、エントリのタイプを判断し、TCS内で一度に1つの論理プロセッサのみがアクティブであることを確かめる。RFLAGS.TFは、EENTER上で、僅かに修正された振る舞いを有する。RFLAGS.TFがTCS.SAVE_TFに格納されて、その後、TCS.TFから装填される。次にデバッグ例外が、RFLAGS.TFの更新値に応じて条件付きで生成される。エンクレーブがデバッグモードにない場合には、デバッグレジスタDR7をTCS.DR7にセーブして、クリアする。IA32_DEBUGCTL MSRについても同様である。
<RFLAGS.TFの振る舞い>
EENTERの実行開始時のRFLAGS.TFの値は、EENTER完了時のトラップに影響しない。TCSから装填されるRFLAGS.TFの値は、トラップがとられているかを決定する。
<DR7の振る舞い>
エンクレーブがデバッグモードにない場合には、デバッグレジスタDR7をTCS.DR7にセーブして、クリアする。
<IA32_DEBUG_CTLの振る舞い>
エンクレーブがデバッグモードにない場合には、IA32_DEBUG_CTL MSRをTCS.DEBUG_CTLにセーブして、クリアする。
<EEXIT>
EEXITは、エンクレーブの外部へと抜ける。
<命令の説明>
EEXITは、エンクレーブモードをディセーブルして、RBSが指定する位置に分岐する。この命令によりレジスタは影響を受けない。秘密がいずれかのレジスタに含まれる場合には、これらレジスタをクリアするのはエンクレーブソフトウェアの任務となる。RFLAGS.TFは、EEXIT上で、僅かに修正された振る舞いを有する。RFLAGS.TFがTCS.SAVE_TFから装填される。次に、デバッグ例外が、RFLAGS.TFの更新値に応じて条件CR-0021付きで生成される。エンクレーブがデバッグモードにない場合には、デバッグレジスタDR7をTCS.DR7に装填する。この振る舞い、および、RFLAGS.TFの振る舞いは、???に詳述されている。
<RFLAGS.TFの振る舞い>
EEXITの実行開始時のRFLAGS.TFの値は、EEXITの完了時のトラップには影響しない。SSAから装填されるRFLAGS.TFの値は、トラップをとるかを決定する。
<DR7の振る舞い>
エンクレーブがデバッグモードにない場合には、デバッグレジスタDR7をTCS.DR7に装填する。
<IA32_DEBUG_CTLの振る舞い>
エンクレーブがデバッグモードにない場合には、IA32_DEBUG_CTL MSRをTCS.DEBUG_CTLから装填する。
<EIRET>
<命令の説明>
EIRET命令は、SSAに前に格納していたマシン状態を利用して、例外または割り込みのために中断していたエンクレーブの実行を再開する。EIRETは、TCSが有効であり、再開可能であることを確かめる。TCSおよび対応するSSAが、処理を進めるために命令のためのメモリに常駐している場合がある。EIRETはさらに、状態マシンをチェックして、エントリの種類を判断し、TCS内で一度に1つの論理プロセッサのみがアクティブであることを確かめる。RFLAGS.TFがEIRET上に設定されている場合、命令の完了時にデバッグ例外が生じる(つまり、通常のTFの振る舞い)。この例外は、エンクレーブ内で生じたものとして報告され(通常のSEで定義されている方法により)、内部では命令は実行されない。EIRETはSSAからのRFLAGSを復元するので、TFは、EIRETの終了時に設定されてよい。この場合、TFは、以下の命令に影響する(これも通常のTFの振る舞いである)。
<RFLAGS.TFの振る舞い>
RFLAG.TFがEIRET命令の始めに設定されている場合、#DBが完了後に生じる。例外は、TFが設定されていなければ制御が転送されたRIPで報告される。実際、エンクレーブにおいて転送処理は行われない。EIRETの通常処理の一環として、RFLAGSをSSAコピーから復元する。結果生じるTFが設定されている場合には、エンクレーブ内の対象命令の実行後に#DBが生じる。これらの振る舞いは、通常のIA IRET命令の振る舞いと矛盾しない。
<DR7の振る舞い>
DR7は、最後の割り込みまたは例外で前にセーブされたSSAコピーからを復元される。
<IA32_DEBUG_CTLの振る舞い>
IA32_DEBUG_CTL MSRは、最後の割り込みまたは例外で前にセーブされたSSAコピーから復元される。
<EREPORT>
EREPORT命令は、エンクレーブの内容に関する計測値を報告する。
<命令の説明>
EREPORTは、エンクレーブ計測値レジスタ、その機能およびデバッグステータス(フラグ)を取得する。これらの値全ては、対称メッセージ認証コードを利用して保護され、REPORTキーを利用して検証することができる。REPORTキーを要求するエンクレーブでは、適切な機能がSECSに設定されて、EGETKEY命令によりこれを取得することができる。この命令の結果は、宛先位置output_buffer_laに配置される。
<ERDMR>
ERDMR命令は、エンクレーブSECSから計測値レジスタの値を読み取る。
<命令の説明>
この命令は、エンクレーブ外からのみ実行可能である。SECSが有効なSECページを指し示している場合には、命令は、output_buffer_laにより特定されるアドレスに、エンクレーブ計測値レジスタの内容を出力する。
<EGETKEY>
エンクレーブコードにより利用されて、プロセッサキー階層から特定のキーを戻す。
<命令の説明>
要求されるキーは、KeyRequest構造を利用して特定され、そのアドレスは入力として提供される。このアドレスは自然整列される。出力は常に256ビットのデータ値となる。この値とするためには、output_laは自然整列される必要がある。
<ERDTCSPTR>
<命令の説明>
ERDTCSPTR命令は、現在のTCSリニアアドレスをRBXに読み込むために利用される。
<EDBGRD>
<命令の説明>
EDBGRD命令は、デバッグエンクレーブから8バイトを読み取るのに利用される。
<EDBGWR>
<命令の説明>
EDBGWR命令は、8バイトをデバッグ・エンクレーブページに書き込むために利用される。
<ERDINFO>
ERDINFO命令は、エンクレーブページキャッシュの内容に関する情報を戻す。
<命令の説明>
エンクレーブ外で実行されると、EREPORTは、自身の機能およびデバッグステータス(フラグ)を、エンクレーブ計測値レジスタに報告する。これらの値全ては、対称メッセージ認証コードを利用して保護され、EVERIFYREPORT命令を利用して検証することができる。この命令の結果は、宛先位置output_buffer_laに配置される。
<ルーチン参照>
<退出(Exit)>
このセクションでは、退出処理についての擬似コードを提供する。このコードは、エンクレーブコードが計画していないエンクレーブからの退出があるときに呼び出される。エンクレーブの実行は、停止した場所から再開される。再開に必要な情報は、外部スタック上にセーブされる。プロセッサのアーキテクチャ状態は、適切なセーブ領域にセーブされる。
<リーダ・ロックの取得>
RWロックにより、論理プロセッサは、共有リソースにアクセスして、スレッドが共有リソースにアクセスすることのできる2つのモードを提供する。この2つのモードとは、(1)共有モード:複数のリーダ論理プロセッサに対する共有の読み取り専用アクセスを許可し、これにより、これら複数のプロセッサが、共有リソースからコンカレントにデータを読み出すことができるようになるモード、(2)排他的モード:一度の1つの書き込み論理プロセッサへの読み書きアクセスを許可するモードであり、排他的モードでロックが取得されると、他のスレッドは、書き込みを行っている実体がロックを解除するまでは共有リソースにアクセスできなくなる、である。
<サブルーチンの説明>
このサブルーチンは、実際のところ、uCodeがPMHアドレス−変換機能をuCodeに曝すとき利用されるハードウェアの追加である。XUTRANSLATEは、主に、PMHコンテキストおよびリニアアドレスを入力として、出力として最終物理アドレスを生成するuOpである。PMHがページテーブル・ウォークの間に不良条件に遭遇すると、これらがuCodeに報告される。uOpの詳細は、本書類の範囲外である。
<サブルーチンの説明>
このサブルーチンは、識別されたキーを有する導出バッファ(DerivationBuffer)にCMAC処理を行うことでキーを生成する際に利用される。導出バッファは、128ビットの倍数でなくてはならない。