(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2023-10-31
(45)【発行日】2023-11-09
(54)【発明の名称】投機的サイド・チャネル・ヒント命令
(51)【国際特許分類】
G06F 21/55 20130101AFI20231101BHJP
G06F 9/38 20180101ALI20231101BHJP
G06F 9/30 20180101ALI20231101BHJP
【FI】
G06F21/55 360
G06F9/38 310X
G06F9/30 310A
(21)【出願番号】P 2020551994
(86)(22)【出願日】2019-03-12
(86)【国際出願番号】 GB2019050676
(87)【国際公開番号】W WO2019193308
(87)【国際公開日】2019-10-10
【審査請求日】2022-03-04
(32)【優先日】2018-04-04
(33)【優先権主張国・地域又は機関】GB
(73)【特許権者】
【識別番号】500395107
【氏名又は名称】アーム・リミテッド
(74)【代理人】
【識別番号】110000855
【氏名又は名称】弁理士法人浅村特許事務所
(72)【発明者】
【氏名】グリーンハル、ピーター リチャード
(72)【発明者】
【氏名】ピリー、フレデリック クロード マリー
(72)【発明者】
【氏名】コールフィールド、イアン マイケル
(72)【発明者】
【氏名】トンネール、アルバン ピエールリック
【審査官】行田 悦資
(56)【参考文献】
【文献】米国特許出願公開第2009/0089564(US,A1)
【文献】特開2008-107913(JP,A)
【文献】特開2012-023618(JP,A)
【文献】すずき ひろのぶ,セキュリティ実践の基本定石[第五二回]記録的規模で影響を与えたMeltdownとSpectre,SoftwareDesign,日本,株式会社技術評論社,2018年04月18日,通算396号,pp.132-135
(58)【調査した分野】(Int.Cl.,DB名)
G06F 21/55
G06F 9/38
G06F 9/30
(57)【特許請求の範囲】
【請求項1】
命令に応答してデータ処理を実行する処理回路であって、メモリ・システムからデータを読み込むための読込み動作の投機的処理をサポートする、処理回路と、
少なくとも1つの後続の読込み動作が投機的に処理された場合に情報漏洩のリスクがあるかどうかを示す投機的サイド・チャネル・ヒント命令を、前記処理回路によって処理されることになる一連の命令が含むかどうかを識別し、前記投機的サイド・チャネル・ヒント命令を前記命令が含むかどうかに応じて、投機的サイド・チャネル軽減措置をトリガするべきかどうかを決定する制御回路と
を備え
、
前記制御回路は、前記投機的サイド・チャネル・ヒント命令が、所与の読込み動作よりも前記一連の命令に含まれず、かつ、前記所与の読込み動作と関連付けられていない場合に、前記所与の読込み動作に対して前記投機的サイド・チャネル軽減措置をトリガするように構成される、装置。
【請求項2】
前記投機的サイド・チャネル・ヒント命令が、前記少なくとも1つの後続の読込み動作が、前記投機的サイド・チャネル軽減措置なしで投機的に実行しても安全であることを示す、請求項1に記載の装置。
【請求項3】
前記投機的サイド・チャネル・ヒント命令が、単一の後続の命令に関連付けられ、前記単一の後続の命令によってトリガされた少なくとも1つの読込み動作が投機的に処理された場合に情報漏洩のリスクがあるかどうかを示す、請求項1から
2までのいずれか一項に記載の装置。
【請求項4】
前記投機的サイド・チャネル・ヒント命令が、後続の命令のブロックに関連付けられ、前記後続の命令のブロックのいずれかによってトリガされた少なくとも1つの読込み動作が投機的に処理された場合に情報漏洩のリスクがあるかどうかを示す、請求項1から
3までのいずれか一項に記載の装置。
【請求項5】
前記後続の命令のブロックに対応する動作の処理の途中でヒント・キャンセル・イベントが発生することに応答して、前記制御回路が、前記後続の命令のブロックの前に前記投機的サイド・チャネル・ヒント命令がないかのように、前記ブロックの残りの命令に対して前記投機的サイド・チャネル軽減措置を実行するべきかどうかを決定するように構成される、請求項
4に記載の装置。
【請求項6】
前記ヒント・キャンセル・イベントが、
例外又は割込みと、
分岐と、
デバッグ状態に入ることと、
診断アクションをトリガするためのブレーク・ポイントと
のうちの少なくとも1つを含む、請求項
5に記載の装置。
【請求項7】
前記処理回路が、前記投機的サイド・チャネル・ヒント命令を構造的無演算命令として解釈するように構成される、請求項1から
6までのいずれか一項に記載の装置。
【請求項8】
前記制御回路が、前記投機的サイド・チャネル・ヒント命令が前記一連の命令の中にあるかどうかに基づいて、キャッシュされた命令又はマイクロ動作に注釈を付けるように構成される、請求項1から
7までのいずれか一項に記載の装置。
【請求項9】
前記投機的サイド・チャネル軽減措置が、読込みマイクロ動作の投機的実行を無効にすることを含む、請求項1から
8までのいずれか一項に記載の装置。
【請求項10】
前記投機的サイド・チャネル軽減措置が、最も新しい解決済みの非投機的マイクロ動作を越えて投機的に実行されることが可能なマイクロ動作の最大数を減らすことを含む、請求項1から9までのいずれか一項に記載の装置。
【請求項11】
前記投機的サイド・チャネル軽減措置が、投機的バリア・マイクロ動作より先に発生するいずれかのマイクロ動作が解決されるまで、前記投機的バリア・マイクロ動作後のマイクロ動作の投機的処理を無効にするように前記処理回路を制御するための前記投機的バリア・マイクロ動作を、前記処理回路によって処理されることになる一連のマイクロ動作に挿入することを含む、請求項1から
10までのいずれか一項に記載の装置。
【請求項12】
前記投機的サイド・チャネル軽減措置が、前記処理回路によってマイクロ動作の処理を低速化すること又は停止することを含む、請求項1から
11までのいずれか一項に記載の装置。
【請求項13】
前記投機的サイド・チャネル軽減措置が、読込みマイクロ動作に応答して読み込まれたデータをキャッシュするためのデータ・キャッシュの少なくとも一部をフラッシュすること又は無効化することを含む、請求項1から
12までのいずれか一項に記載の装置。
【請求項14】
メモリ・システムからデータを読み込むための読込み動作の投機的処理をサポートする処理回路を使用して、命令に応答してデータ処理を実行するステップと、
少なくとも1つの後続の読込み動作が投機的に処理された場合に情報漏洩のリスクがあるかどうかを示す投機的サイド・チャネル・ヒント命令を、前記処理回路によって処理されることになる一連の命令が含むかどうかを識別するステップと、
前記投機的サイド・チャネル・ヒント命令を前記命令が含むかどうかに応じて、投機的サイド・チャネル軽減措置をトリガするべきかどうかを決定するステップと
、
前記投機的サイド・チャネル・ヒント命令が、所与の読込み動作よりも前記一連の命令に含まれず、かつ、前記所与の読込み動作と関連付けられていない場合に、前記所与の読込み動作に対して前記投機的サイド・チャネル軽減措置をトリガするステップと、
を含む、データ処理方法。
【請求項15】
処理回路によって処理するための一連のプログラム命令を生成するためのコンピュータ実行方法であって、
前記処理回路によって読込み動作が投機的に処理された場合に情報漏洩のリスクがある、メモリ・システムからデータを読み込むための前記読込み動作を含む動作の投機的サイド・チャネル活性化パターンを、入力プログラム・コードによって表された前記動作が含むかどうかを識別するために、前記
入力プログラム・コードを分析するステップと、
前記入力プログラム・コードに基づいて、前記一連のプログラム命令を生成するステップと、
少なくとも1つの後続の読込み動作が投機的に処理された場合に情報漏洩のリスクがあるかどうかを示す少なくとも1つの投機的サイド・チャネル・ヒント命令を、前記生成した一連のプログラム命令に挿入するべきかどうかについて、動作の前記投機的サイド・チャネル活性化パターンを前記
入力プログラム・コードが含むかどうかに応じて選択するステップと
、
前記少なくとも1つの後続の読込み動作が、投機的サイド・チャネル緩和手段なしで投機的に実行しても安全であると判断された場合に、前記生成された前記一連のプログラム命令に、前記少なくとも1つの投機的サイド・チャネル・ヒント命令を挿入するステップと、を含む、コンピュータ実行方法。
【請求項16】
前記動作の投機的サイド・チャネル活性化パターンが、コンシューマ読込み動作のターゲット・アドレスが、プロデューサ読込み動作に応答して前記メモリ・システムから読み込まれたデータ値に依存する前記プロデューサ読込み動作及び前記コンシューマ読込み動作を含む一連の動作を含む、請求項
15に記載の方法。
【請求項17】
請求項
15及び
16のいずれか一項に記載の方法を実行するようにデータ処理装置を制御するためのコンピュータ・プログラム。
【請求項18】
請求項
17に記載のコンピュータ・プログラムを記憶するストレージ媒体。
【発明の詳細な説明】
【技術分野】
【0001】
本技法は、データ処理の分野に関する。
【背景技術】
【0002】
データ処理装置は、命令の入力オペランドが正しいかどうか、又は、そもそも命令が実行される必要があるかどうかがわかる前に命令が実行される、命令の投機的実行をサポートすることができる。例えば、処理装置は、分岐の本当の結果がどのようなものであるべきかがわかる前に、後続の命令を投機的にフェッチし、デコードし、実行することができるように、分岐命令の結果を予測するための分岐予測器を有することができる。また、後続の命令をより速く処理できるようにするために、本当の値がメモリから実際に返される前に、メモリからロードされる値が予測されるロード投機をサポートできるシステムもある。投機の他の形式も可能である。
【発明の概要】
【課題を解決するための手段】
【0003】
少なくともいくつかの実例は、命令に応答してデータ処理を実行する処理回路であって、メモリ・システムからデータを読み込むための読込み動作の投機的処理をサポートする、処理回路と、少なくとも1つの後続の読込み動作が投機的に処理された場合に情報漏洩のリスクがあるかどうかを示す投機的サイド・チャネル・ヒント命令を、処理回路によって処理されることになる一連の命令が含むかどうかを識別し、投機的サイド・チャネル・ヒント命令を命令が含むかどうかに応じて、投機的サイド・チャネル軽減措置をトリガするべきかどうかを決定する制御回路と、を備える装置を提供する。
【0004】
少なくともいくつかの実例は、メモリ・システムからデータを読み込むための読込み動作の投機的処理をサポートする処理回路を使用して、命令に応答してデータ処理を実行することと、少なくとも1つの後続の読込み動作が投機的に処理された場合に情報漏洩のリスクがあるかどうかを示す投機的サイド・チャネル・ヒント命令を、処理回路によって処理されることになる一連の命令が含むかどうかを識別することと、投機的サイド・チャネル・ヒント命令を命令が含むかどうかに応じて、投機的サイド・チャネル軽減措置をトリガするべきかどうかを決定することと、を含むデータ処理方法を提供する。
【0005】
少なくともいくつかの実例は、処理回路によって処理するための一連のプログラム命令を生成するためのコンピュータ実行方法を提供し、本方法は、処理回路によって読込み動作が投機的に処理された場合に情報漏洩のリスクがある、メモリ・システムからデータを読み込むための読込み動作を含む動作の投機的サイド・チャネル活性化パターンを、プログラム・コードによって表された動作が含むかどうかを識別するために、入力プログラム・コードを分析することと、入力プログラム・コードに基づいて一連のプログラム命令を生成することと、少なくとも1つの後続の読込み動作が投機的に処理された場合に情報漏洩のリスクがあるかどうかを示す少なくとも1つの投機的サイド・チャネル・ヒント命令を、生成した一連のプログラム命令に挿入するべきかどうかについて、動作の投機的サイド・チャネル活性化パターンをプログラム・コードが含むかどうかに応じて選択することと、を含む。
【0006】
上述のような一連のプログラム命令を生成するための方法を実行するようにデータ処理装置を制御するためのコンピュータ・プログラムが提供されてもよい。コンピュータ・プログラムは、ストレージ媒体に記憶されてもよい。ストレージ媒体は、非一時的ストレージ媒体であってもよい。
【0007】
本技法のさらなる態様、特徴、及び長所は、添付の図面と共に読まれることになる実例の以下の説明から明らかになるであろう。
【図面の簡単な説明】
【0008】
【
図1】データ処理装置の実例を概略的に示す図である。
【
図2】投機的サイド・チャネル攻撃を起動するために潜在的に使用され得る命令のパターンの実例を示す図である。
【
図3】投機的サイド・チャネル・ヒント命令を使用して、後続の読込み動作を安全であると印を付け、投機的サイド・チャネル軽減措置なしで実行する実例を示す図である。
【
図4】潜在的に危険な後続の読込み動作に印を付けるためにヒント命令が使用される代替例を示す図である。
【
図5】複数の後続の命令にヒント命令が適用される別の代替例を示す図である。
【
図6】投機的サイド・チャネル・ヒント命令の欠如の存在に応じて、命令を処理し、投機的サイド・チャネル軽減措置をトリガするべきかどうかを制御する方法を示す図である。
【
図7】実行されることになる動作が、動作の投機的サイド・チャネル活性化パターンを含むかどうかについての分析に基づいて、処理回路によって処理するための一連のプログラム命令を生成する方法を示す図である。
【発明を実施するための形態】
【0009】
データ処理装置は、処理回路で実行する一定の処理がメモリ内のいくつかのデータにアクセスできないことを保証するためのメカニズムを有することができる。例えば、特権ベースのメカニズム及び/又はメモリ保護属性が、メモリの一定の領域へのアクセスを制御するために使用されてもよい。近年、投機的実行及びデータ・キャッシュを使用するシステムにおいて、投機的に実行された命令のいずれかの構造的(architectural)影響が、投機ミス(misspeculation)の結果、覆された後でも、投機的に実行された命令の影響が、データ・キャッシュに残存している可能性があるという性質を活用することによって、悪意のある人物が、アクセスできないメモリの領域から情報を得る可能性があるということが認識されてきた。このような攻撃は、メモリ・アドレスのパターンに特権コードがアクセスするように設計された一連の命令を、機密情報に応じて、より高い特権コードをだまして投機的に実行させるように分岐予測器又は他の投機メカニズムを操作することができ、その結果、この機密情報にアクセスできないより低い特権コードは、キャッシュ・タイミング・サイド・チャネルを使用して、より高い特権コードによってどのアドレスがキャッシュにアロケートされたか、又はキャッシュから取り戻されたかを調査し、機密情報を推定できる可能性のあるいくつかの情報をもたらすことができる。このような攻撃は、投機的サイド・チャネル攻撃と呼ばれることが可能である。
【0010】
投機的サイド・チャネル攻撃による情報漏洩のリスクを減らすために、いくつかの軽減措置がとられることが可能である。投機的サイド・チャネル軽減措置の様々な実例が、下記でより詳細に論じられる。しかし、一般に、投機的サイド・チャネル軽減措置は、典型的には、投機的サイド・チャネル軽減措置がとられなかった場合に達成される性能に比べて、処理性能を低下させることもある。実際には、サイド・チャネル攻撃を通じて情報漏洩のリスクをもたらす可能性があるのは一定のパターンの動作だけなので、投機的サイド・チャネル軽減措置を全ての動作にデフォルトで適用すると、性能を必要以上に犠牲にする可能性があるということを発明者は認識した。投機サイド・チャネル攻撃を潜在的に起動するリスクがあり得る命令のパターン、又は、このようなリスクを生じないものとして検出されることが可能な命令のパターンは、予め検出できる可能性がある。
【0011】
下記で論じられる技法では、処理回路は、少なくとも1つの後続の読込み動作が投機的に処理された場合に情報漏洩のリスクがあるかどうかを示す投機的サイド・チャネル・ヒント命令を、処理回路によって処理されることになる一連の命令が含むかどうかを識別するための制御回路を提供されてもよい。制御回路は、投機的サイド・チャネル・ヒント命令を、処理されることになる命令が含むかどうかに応じて、投機的サイド・チャネル軽減措置をトリガするべきかどうかを決定することができる。例えば、ヒント命令は、別の読込みのアドレスを生成するために制御オペランドとして所与の読込みからのデータが使用される可能性があるかどうかを示すために、実行されることになるコードの分析に基づいて、コンパイル時又はリンク時に、ソフトウェアによって挿入されることが可能である。したがって、ヒント命令を使用して、投機的サイド・チャネル軽減措置が必要とされる可能性がある、又は、省略されることが可能なコードのポイントにフラグを立てることによって、このことが、投機的サイド・チャネル攻撃を軽減する際に、あまり保守的でないアプローチを、処理回路が採用できるようにすることができる。少なくともあるとき、軽減措置は、省略しても安全であることをヒント命令の存在又は欠如が示すとき、省略されてもよい。こうして、例えば、より積極的な投機及び/又はキャッシュのより効率的な使用を可能にすることによって、性能が改善されるのを可能にすることができる。
【0012】
投機的サイド・チャネル・ヒント命令は、異なる方式で実行されることが可能である。1つの実例では、投機的サイド・チャネル・ヒント命令は、少なくとも1つの後続の読込み動作が、投機的サイド・チャネル軽減措置なしで投機的に実行しても安全であることを示すことができる。この場合、制御回路は、ヒント命令が検出されたとき、投機的サイド・チャネル軽減措置の省略が受入れ可能であると決定することができる。その一方で、より早期の投機的サイド・チャネル・ヒント命令の後に発生しない所与の読込み動作に対して、投機的サイド・チャネル軽減措置がトリガされる可能性がある。したがって、この場合、軽減措置なしで後続の読込みを実行すると危険であることを示すとデフォルトで想定され得るのは、ヒント命令がないことであってもよい。
【0013】
代替として、他のアプローチでは、ヒント命令は、危険な命令に、また、安全であると見なされた関連付けられたヒント命令の後に発生しない他の任意の読込み動作に、印を付けるために使用されることが可能である。したがって、投機的サイド・チャネル・ヒント命令は、少なくとも1つの後続の読込み動作が、投機的サイド・チャネル軽減措置なしで投機的に実行すると危険であることを示すことができる。この場合、より早期の投機的サイド・チャネル・ヒント命令が所与の読込み動作に関連付けられたとき、所与の読込み動作に対して、投機的サイド・チャネル軽減措置が制御回路によってトリガされてもよい。その他の場合、より早期の関連付けられたヒント命令がないとき、所与の読込み動作に対して、軽減措置は省略されることが可能である。
【0014】
投機的サイド・チャネル・ヒント命令の1つの形について、ヒントは、単一の後続の命令に適用することができ、この単一の後続の命令によってトリガされた少なくとも1つの読込み動作が投機的に処理された場合に情報漏洩のリスクがあるかどうかを示すことができる。ヒントが適用されるその後の命令は、この命令が読込み動作をトリガするか否かに関わらず、直後の命令であることが可能である。代替として、ヒント命令が適用される命令は、読込みをトリガしない少なくとも1つの介在する命令があったとしても、読込み動作をトリガする次の命令であることが可能である。
【0015】
代替として、ヒント命令は、後続の命令のブロックに関連付けられてもよく、後続の命令のブロックのいずれかによってトリガされた少なくとも1つの読込み動作が投機的に処理された場合に情報漏洩のリスクがあるかどうかを示すことができる。後続の命令のブロックは、所定の数のその後の命令として定義されることが可能であり、又は、指定のメモリ範囲内(例えば、ヒント命令のアドレスからオフセットされた所与のアドレス内)にアドレスがある任意の命令が、ヒント命令による影響を受けると想定されることが可能になるように、メモリ範囲を使用して定義されることが可能である。
【0016】
ヒント命令がその後のヒント命令のブロックに適用される場合、後続の命令のブロックに対応する動作の処理の途中でヒント・キャンセル・イベントが発生するとき、制御回路は、命令のブロックの前に投機的サイド・チャネル・ヒント命令がないかのように、ブロックの残りの命令に対して投機的サイド・チャネル軽減措置を実行するべきかどうかを決定することができる。したがって、一定のイベントが、より早期のヒント命令の影響をキャンセルすると見なされてもよい。例えば、ヒント・キャンセル・イベントは、例外若しくは割込み、分岐、デバッグ状態に入ること、及び/又は、診断アクションをトリガするためのブレーク・ポイント、のうちの少なくとも1つであることが可能である。これらのイベントのいずれかは、命令のブロックが連続的に実行されていないことを示すことができるので、他の命令が間で実行されるリスクがある可能性があり、ヒントに基づいて行われたいずれかの判定が、有効でない可能性があることを意味することができる。より早期のヒントの影響をキャンセルするこのアプローチは、より早期のヒント命令が先に発生しない限り、読込みが危険であるということがデフォルトの想定であるシステムにおいて特に有用である可能性がある。
【0017】
いくつかの実例では、投機的サイド・チャネル・ヒント命令は、構造的無演算命令と解釈されてもよく、構造的無演算命令は、プロセッサの構造的状態(例えばレジスタ状態)へのいずれの変更もトリガしない。
【0018】
いくつかの実例では、制御回路は、投機的サイド・チャネル・ヒント命令が一連の命令の中にあるかどうかに基づいて、キャッシュされた命令又はマイクロ動作(micro-operation)に注釈を付けることができる。マイクロ動作は、プロセッサの実行回路が命令を実行する形の命令であってもよい。メモリからフェッチされたプログラム命令の中には、プログラム命令の機能の一部をそれぞれ実行する複数のマイクロ動作にデコードされることが可能なものもある。他のプログラム命令は、単一のマイクロ動作にマップされることが可能である。異なるプログラム命令からデコードされたマイクロ動作の中にも、実行ステージによって処理するために、単一のマイクロ動作に融合されることが可能なものもある。命令又はマイクロ動作をキャッシュするためにキャッシュが用意される場合、投機的サイド・チャネル・ヒント命令は、他の命令又はマイクロ動作によってとられた可能性のあるスロットを占めることができる。実装形態のいくつかの実例では、制御回路は、ヒントが適用される後続の読込み命令又はマイクロ動作などの他の命令又はマイクロ動作に注釈を付けて、元の一連の命令にヒント命令があったか、なかったかを示すことができる。こうして、その後、処理状態への構造的影響をもたらす別の命令又はマイクロ動作のために、ヒント命令自体をキャッシュから削除してスロットを空けることができるようにすることができる。したがって、場合によっては、投機的サイド・チャネル軽減措置を実行するべきかどうかについての制御は、本来、ヒント命令に基づいていたはずであるが、さらに、その後、ヒント命令の存在、又はヒント命令の欠如に基づいてキャッシュにアロケートされた注釈情報に基づいてもよい。
【0019】
投機的サイド・チャネル軽減措置のいくつかの異なる形が、潜在的な投機的サイド・チャネル攻撃から保護するために使用されることが可能である。以下の実例のいずれかが、個別に又は組み合わせて使用されてもよい。ヒント命令は、これらの措置のいずれかが、所与の読込み命令又はマイクロ動作のために行われるか否かを制御するために使用されてもよい。
【0020】
1つの実例では、投機的サイド・チャネル軽減措置は、読込みマイクロ動作の投機的実行を無効にすることを含むことができる。これは、実行されるはずがなかった命令をより高い特権コードに実行させて秘密情報をロードさせる手段として、分岐予測又はロード値の予測ミスなどの投機ミスを攻撃者が利用できないことを保証する。
【0021】
投機的サイド・チャネル軽減措置の別の実例は、最も新しい解決済みの非投機的マイクロ動作を越えて投機的に実行されることが可能なマイクロ動作の最大数を減らすことであってもよい。あまり積極的でない投機を実行することによって、このことが、不正確にロードされた秘密値から導出されたアドレスへの読込みアクセスに基づいて攻撃者がキャッシュ状態を変更する動作のウィンドウを減らすことを可能にする。
【0022】
軽減措置の別の実例は、投機的バリア・マイクロ動作より先に発生するいずれかのマイクロ動作が解決されるまで、投機的バリア・マイクロ動作後のマイクロ動作の投機的処理を無効にするように処理回路を制御するための投機的バリア・マイクロ動作を、処理回路によって処理されることになる一連のマイクロ動作に挿入することであってもよい。例えば、バリアは、第1の読込みが不正確に投機された場合、(第1の読込みによって不正確に読み込まれた秘密情報に基づく可能性のある)後続の読込みが実行されることがないことを保証するために、連続的な読込み命令の間に挿入されてもよい。
【0023】
サイド・チャネル攻撃を軽減する別のアプローチは、ある期間、処理回路による処理を単に低速化すること又は停止させることであってもよい。パイプラインを低速化することによって、このことが、より早期のマイクロ動作が解決される前に投機的に実行されることになるマイクロ動作の数を影響的に減らし、さらに、不正確に読み込まれた秘密データから攻撃者が情報を得る機会のウィンドウを効果的に減らす。
【0024】
投機的サイド・チャネル攻撃を軽減する他のアプローチは、投機にではなく、投機的読込み動作によってロードされたデータのデータ・キャッシュに、焦点を合わせてもよい。例えば、投機的サイド・チャネル軽減措置は、投機的読込みに応答してロードされた値がキャッシュされないこと、或いは、一時的なバッファに、又は、投機ミス時にフラッシュされ、投機が正しいと判定された場合、主な非投機的キャッシュ・データに影響を与えることしか許可されないキャッシュの投機的領域に、置かれること、であることが可能である。また、投機的サイド・チャネル軽減措置は、投機的読込み動作に応答して読み込まれたデータをキャッシュするためのデータ・キャッシュの少なくとも一部をフラッシュすること又は無効化することを含むことができる。これらの軽減は、投機の積極性を減らすことにではなく、このような投機の影響が他の動作に見えているかどうかに焦点を合わせることができ、どのデータが投機的にロードされたかを調査するために、キャッシュ・タイミング・サイド・チャネルを使用する攻撃者の能力をさらに軽減することができる。
【0025】
これらは、行うことができる潜在的な軽減のうちのほんのいくつかであるということが理解されよう。一般に、ヒント命令の存在/欠如は、これらのステップのいずれかが行われるかどうかを制御するために使用されてもよい。
【0026】
コンピュータ実行方法は、上述のような投機的サイド・チャネル・ヒント命令を含む、処理回路によって処理するための一連のプログラム命令を生成するために提供されてもよい。処理回路によって実行されることになる動作を識別する入力プログラム・コードは、処理回路によって読込み動作が投機的に処理された場合に情報漏洩のリスクがある、メモリ・システムからデータを読み込むための読込み動作を含む動作の投機的サイド・チャネル活性化パターンを、プログラム・コードによって表された動作が含むかどうかを識別するために分析されてもよい。入力プログラム・コードに基づいて、処理回路によって処理されることになる一連のプログラム命令が生成されてもよい。動作の投機的サイド・チャネル活性化パターンをプログラム・コードが含んでいたかどうかに応じて、少なくとも1つの後続の読込み動作が投機的に処理された場合に情報漏洩のリスクがあるかどうかを示す少なくとも1つの投機的サイド・チャネル・ヒント命令が挿入されてもよい。例えば、この方法は、ソフトウェアによってコンパイル時又はリンク時に行われることが可能であり、実行されることになる動作を評価し、動作のいずれかの疑わしいパターンが識別されたかどうかに応じて、必要に応じてヒントを挿入する。上述のように、ヒントは、命令の安全な一節より前に、又は、潜在的に危険な一節より前に、挿入されることが可能である。代替として、この方法は、例えば、ジャスト・イン・タイム・コンパイラ又はトランスレータを使用して、又は、実行の輪郭を描く(profile)動的再コンパイルを使用して、所与のプログラム・コードの実行時に動的に実行されることが可能である。
【0027】
1つの実例では、動作の投機的サイド・チャネル活性化パターンは、ヒント命令を含むか否かを決定するために識別され、コンシューマ読込み動作のターゲット・アドレスが、プロデューサ読込み動作に応答してメモリ・システムから読み込まれたデータ値に依存するプロデューサ読込み動作及びコンシューマ読込み動作を含む一連の動作であってもよい。
【0028】
コンピュータ・プログラムは、プログラム命令を生成するこの方法を実行するようにデータ処理装置を制御するために提供されてもよい。このコンピュータ・プログラムは、その後、生成したプログラム命令を後で実行することになる同じ処理装置で、又は、ターゲットのデータ・プロセッサでの実行のためのコードをコンパイルするコンパイラを動かすコンピュータなどの全面的に別個の計算で、実行されることが可能である。このコンピュータ・プログラムは、ストレージ媒体に記憶されてもよく、ストレージ媒体は、非一時的ストレージ媒体であってもよい。
【0029】
図1は、プログラムの命令を処理して処理動作を実行する処理パイプラインを有するデータ処理装置2の実例を概略的に示す。パイプラインは、プログラム・フローにおいて処理されることになる次の命令のアドレスを識別するためのフェッチ・ステージ4を含み、次の命令のアドレスは、命令キャッシュ6、及び、マイクロ動作キャッシュ(又はトレース・キャッシュ)8に、フェッチ・アドレスとして出力される。フェッチ・ステージ4は、分岐命令の結果を予測するための分岐予測器10に基づいてフェッチ・アドレスを決定することができる。命令キャッシュ6は、メモリに記憶されたプログラム・コード内で命令が定義されるのと同じ形で命令をキャッシュする。命令キャッシュ6からの命令はデコード・ステージ12に送られ、ここで、命令は、実行ステージ14によって実行されるように、マイクロ動作(μops又はuops)にデコードされる。単一のマイクロ動作にマップできるプログラム命令もあるが、プログラム命令の機能の一部にそれぞれ対応する複数の別個のマイクロ動作にマップできるプログラム命令もある。例えば、メモリからデータを読み込むため、又は、メモリにデータを記憶するためのロード/記憶マイクロ動作は、ロード又は記憶のアドレスを計算するためのアドレス生成マイクロ動作、及び、計算したアドレスに基づいてメモリ・システムへのアクセスを実際にトリガするためのデータ・アクセス・マイクロ動作に分けられることが可能である。別の実例は、メモリ内の単一のプログラム命令によって表されることが可能な算術演算であることが可能であるが、実行ステージ14によって別々に処理するために、いくつかのより単純なマイクロ動作に分解されてもよい。
【0030】
実行ステージ14は、例えば、レジスタ16から読み込まれた整数オペランドに基づいて算術又は論理マイクロ動作を処理するための算術/論理ユニット(ALU)といった、異なるタイプのマイクロ動作を処理するためのいくつかの実行ユニット、レジスタから読み込まれた浮動小数点オペランドに対して演算を行うための浮動小数点ユニット、及び/又は、同じレジスタ内のいくつかの独立データ値を指定するレジスタ16からのオペランドを使用したベクトル処理演算を行うためのベクトル処理ユニットを含んでもよい。実行ステージ14の実行ユニットのうちの1つは、データ・キャッシュ20又は(さらなるキャッシュ及びメイン・メモリを含むことができる)メモリ・システム22からデータを読み込む読込み動作、並びに、データ・キャッシュ20又はメモリ・システム22にデータを書き出す書出し動作を処理するためのロード/記憶ユニット18であってもよい。ロード/記憶ユニットは、トランスレーション・ルックアサイド・バッファ(TLB:translation lookaside buffer)24内のページ・テーブル・エントリを使用して、現在の実行状態において、読込み又は書出し(ロード又は記憶)動作のターゲット・アドレスによって識別されたメモリの領域に、プロセッサがアクセスするのを許可されるかどうかを決定することができる。例えば、TLBは、一定のメモリ領域へのアクセスを、プロセッサの一定のモード又は特権レベルに制限することができる。
【0031】
実行ステージ14によって実行される命令は、リタイア(又は書戻し)ステージ26によってリタイアされ、ここで、命令の結果は、レジスタ16に書き戻される。処理パイプラインは、例えば、分岐予測器10、又は、データ・プリフェッチャ又はロード値予測器などの他の投機的要素によって行われた予測に基づくマイクロ動作の投機的実行をサポートすることができるので、リタイア・ステージ26は、予測が正しく行われたかどうかを評価することをさらに担うことができ、予測ミスの場合、投機的に実行した動作の結果を破棄するようにトリガすることができる。予測ミスの後、不正確に投機された命令は、パイプラインからフラッシュされることが可能であり、実行は、正しくない予測が行われる前の最後の正しい実行ポイントから再開することができる。
【0032】
マイクロ動作キャッシュ(又はトレース・キャッシュ)8は、頻繁にデコード・ステージ12を起動する必要性をなくすことによって、処理を高速化し、電力を節約するために用意されてもよい。したがって、マイクロ動作は、命令キャッシュ6からのプログラム命令に基づいてデコード・ステージ12によってデコードされるか、複数の別個にデコードされたマイクロ動作から融合され、将来、対応するフェッチ・アドレスにプログラム実行が再び達するときのアクセスのために、マイクロ動作キャッシュ又はトレース・キャッシュ8にキャッシュされることが可能である。マイクロ動作キャッシュ8は、用意される場合、マイクロ動作が実行される順番に関わらず、マイクロ動作をキャッシュすることができる。例えば、マイクロ動作キャッシュは、このマイクロ動作に対応する命令のフェッチ・アドレスに基づいてタグ付けされたいくつかのエントリを有してもよい。したがって、フェッチ・アドレスを命令キャッシュ6に入力すると同時に、フェッチ・アドレスも、マイクロ動作キャッシュに供給されることが可能であり、マイクロ動作キャッシュ内にヒットがある場合、これは、デコード・ステージ12によってデコードされたマイクロ動作の代わりに、マイクロ動作キャッシュによって出力されたマイクロ動作を選択するように多重化装置30を制御することができる。また、マイクロ動作キャッシュからの信号は、マイクロ動作キャッシュ内にヒットがあるとき、デコード・ステージ12の少なくとも一部を節電状態にするために使用されてもよい。
【0033】
トレース・キャッシュが用意される場合、トレース・キャッシュは、マイクロ動作自体をキャッシュできるだけでなく、実行ステージ14によってこれらのマイクロ動作が実際に実行された順番を追跡することもできるということを除いて、マイクロ動作キャッシュと同様に動作することができる。例えば、実行されたマイクロ動作のトレースは連続分岐動作を含んでもよく、処理されたマイクロ動作のそれぞれに応答して、フェッチ・ステージ4が各連続フェッチ・アドレスを個別に再計算する必要なく、実行ステージ14による実行のための動作の連続ブロックとしてフェッチされることが可能なトレース内の単一のエントリを提供するように、分岐の間で実行されたマイクロ動作の異なるブロックを一緒に並べることができる。また、マイクロ動作キャッシュは、さらに、その後、正しくなかったという結果になる可能性のある投機的に実行されたマイクロ動作をキャッシュすることができるが、トレース・キャッシュ8は、マイクロ動作の正しく実行された順番をキャッシュすることができる(不正確に投機された動作に対応する追跡は無効化されてもよい)。マイクロ動作キャッシュ及びトレース・キャッシュのうちのただ1つを有することができるシステムもあるが、両方を有することができるシステムもあるということが理解されよう。
【0034】
マイクロ動作キャッシュ又はトレース・キャッシュを用意する1つの利点は、組み合わされたマイクロ動作の処理を、実行ステージ14における処理ユニットがサポートする場合、プログラム命令を単一の共通マイクロ動作に分けることに応答して、デコード・ステージ12によってデコードされた複数のマイクロ動作を融合させることによって、さらなる性能の最適化を可能にすることができるというものである。マイクロ動作を融合させることによって、可能なとき、この動作に必要なパイプラインの利用量を減らし、他の動作の実行のためにパイプライン・スロットを空け、性能を改善するのに役立てることができる。
【0035】
投機的メモリ読込みを使用する投機ベースのキャッシュ・タイミング・サイド・チャネルが最近提案された。投機的メモリ読込みは、先進的なマイクロプロセッサに典型的なものであり、非常に高い性能を可能にする全体的な機能の一部である。構造的に未解決の分岐(又はプログラム・フローにおける他の変化)を越えたキャッシュ可能な位置への投機的メモリ読込みを行うこと、及び、これらの読込み自体の結果をさらに使用して、さらなる投機的メモリ読込みのアドレスを形成することによって、これらの投機的読込みは、アドレスが第1の投機的読込みの値を示すキャッシュにエントリをアロケートする。これは、そうでなければ、信頼できないコードにアクセスできなくなる位置の第1の投機的読込みを行わせるように、この信頼できないコードが投機を制御できる場合に、活用可能なサイド・チャネルになるが、キャッシュ内の第2の投機的アロケーションの影響は、この信頼できないコードによって評価される可能性がある。
【0036】
監督ソフトウェアのいずれかの形について、信頼できるソフトウェアによってアクセスされることになる配列又は類似構造に、オフセットとして使用されることになるデータ値を、信頼できないソフトウェアが渡すことはよくあることである。例えば、(信頼できない)アプリケーションは、ファイル記述子IDに基づいて、オープン・ファイルについての情報を要求することがある。当然、監督ソフトウェアは、その使用の前にオフセットが適切な範囲内にあることをチェックすることになるので、このようなパラダイムについてのソフトウェアは、以下の形で書かれることが可能である。
【数1】
【0037】
現代のマイクロプロセッサでは、プロセッサの実行は一般に、(7行目によって示された)untrusted_offset_from_userの範囲チェックに関連付けられた分岐を実行する前の値を確立するために、(上記のコードの9行目によって示された)データ・アクセスを投機的に行う可能性がある。(OSカーネル又はハイパーバイザなどの)監督レベルでこのコードを実行するプロセッサは、信頼できないソフトウェアによって渡されたuntrusted_offset_from_userの範囲外の値によって決定された、この監督レベルにアクセス可能な通常のメモリ内のどこからでも投機的にロードすることができる。これは、投機が正しくない場合、ロードされた値がハードウェアによって破棄されることになるので、構造的に問題ではない。
【0038】
しかし、先進的なプロセッサは、さらなる投機のために投機的にロードされていた値を使用することができる。これは、投機ベースのキャッシュ・タイミング・サイド・チャネルによって活用されるこのさらなる投機である。例えば、以前の実例は、以下の形であるように拡張される可能性がある。
【数2】
【0039】
この実例では、「値」は、untrusted_offset_from_userと組み合わされたarr1->dataから計算されたアドレスを使用してメモリからロードされ(10行目)、次に、さらなるメモリ・アクセスの基礎として使用される(13行目)。したがって、値2の投機的ロードは、値についての、投機的にロードされたデータから導出されたアドレスから生ずる。プロセッサによる値2の投機的ロードが、キャッシュへのアロケーションを行わせる場合、このロードのアドレスの一部は、標準キャッシュ・タイミング・サイド・チャネルを使用して推測されることが可能である。このアドレスは値のデータに依存するので、値のデータの一部は、サイド・チャネルを使用して推測されることが可能である。
【0040】
(いくつかの投機的実行において)このアプローチを値の異なるビットに適用することによって、値のデータの全体が決定されることが可能である。したがって、信頼できないソフトウェアは、untrusted_offset_from_userに範囲外の量を提供することによって、監督ソフトウェアがアクセス可能などこでもアクセスすることができ、したがって、このアプローチは、監督ソフトウェアによってアクセス可能ないずれかのメモリの値を取り戻すために、信頼できないソフトウェアによって使用される可能性がある。
【0041】
現代のプロセッサは、命令キャッシュ、データ・キャッシュ、及び分岐予測キャッシュを含む複数の異なるタイプのキャッシングを有する。これらのキャッシュにおけるエントリのアロケーションが、信頼できない入力に基づいてロードされたいくつかのデータの任意の部分の値によって決定される場合、原則として、このサイド・チャネルは刺激を受ける可能性がある。
【0042】
このメカニズムの一般化として、分岐に渡されたコードは投機的に実行される可能性があるので、分岐後にメモリにアクセスするいずれかのシーケンスは、投機的に実行される可能性があることを、基礎となるハードウェア技法が意味するということが理解されよう。このような投機では、さらに投機的に行われる可能性のある第2のロード又は間接分岐のためのアドレスを組み立てるために、投機的にロードされた1つの値が次に使用される場合、この第2のロード又は間接分岐は、そうでなければ、この値を読み込むことができないはずのコードによって、キャッシュのタイミング分析を使用して読み込まれることが可能になるように、第1の投機的ロードによってロードされた値の指示を残すことができる。この一般化は、一般に生成された多くのコード・シーケンスが、他のあまり特権的ではないソフトウェアによって読み込まれる可能性のあるキャッシュ・アロケーションのパターンに情報を漏らすことになることを意味する。この問題の最も深刻な形は、本セクションの初めの方で記述したものであり、ここで、あまり特権的ではないソフトウェアは、どの値がこのようにして漏らされるかを選択することができる。
【0043】
したがって、このタイプの攻撃に対する対抗措置を用意することが望ましい可能性がある。いくつかの軽減措置が使用されることが可能である。例えば、データ・キャッシュ20又はメモリ・システム22からデータを読み込むための読込み動作が投機的に行われるのを阻止されることが可能であり、又は、パイプラインを低速化すること、若しくは、より早期の命令が解決されるのを待つ間、投機的に実行される可能性のある命令の数を減らすことによって、投機が、あまり積極的に適用されないことが可能であり、これは、上記で論じられた攻撃のタイプを攻撃者が活用する機会のウィンドウを減らすことができる。他のアプローチは、メモリから読み込まれた、より早期のデータ値に基づいて計算されたコンシューマ読込みのターゲット・アドレスを有するコンシューマ読込みを、より早期のデータ値をメモリから読み込むプロデューサ読込みと区別するために、いくつかの制御依存の読込み動作が検出されたときに挿入されることが可能な投機バリア命令を提供することができ、バリア命令は、第1の読込みが依然として投機的である間、第2の読込みを投機的に実行できないことをパイプラインに知らせる。これは、第1の読込みが決して実行されるはずではなかった場合、第2の読込みが発生する前に第1の読込みがキャンセルされることになることをバリアが保証するということを保証する。不正確に投機的に実行された読込み動作によるキャッシュ状態への影響を減らすために、他のアプローチが行われることが可能である。例えば、データ・キャッシュ20は、非投機的データのために使用されるメイン・キャッシュ領域、及び、読込みが依然として投機的である間に、投機的に実行された読込み動作に応答して読み込まれたデータのために使用される投機的キャッシュ領域に分けられることが可能である。データは、投機が正しいものとして解決されたときにメイン領域に格上げされてもよく、投機的領域の内容は、あまり特権的ではない実行モードにスイッチすることなど、攻撃のリスクが増していることを示すイベントが識別されたとき、破棄されることが可能である。また、場合によっては、攻撃のリスクがあると見なされる動作のパターンが検出されたとき、キャッシュから少なくとも投機的に読み込まれたデータを無効化するために、追加のキャッシュのフラッシュが行われてもよい。
【0044】
これらの軽減措置のいずれかの間の共通要素は、投機的に実行された可能性のある命令が隠されるということ、又は、これらの読込み、及び、これらの読込みに依存するいずれかの動作を、いくつかの後続の読込み動作が遅延させるというさらなるキャッシュ・ミスを招くことを軽減措置が意味するので、プロセッサによって達成された性能を軽減措置が低下させる傾向があるというものである。このような軽減措置は、攻撃を阻止することに効果的である可能性があるが、サイド・チャネル攻撃をトリガするために使用される可能性のある動作のパターンを含んでいないいくつかのプログラム・コードの実行に必要以上に害を及ぼす可能性がある。
【0045】
実際には、下流のいずれの制御依存関係においても使用されることのない命令のシーケンスを識別することが可能であり、その場合、これらの命令に対して、実行を制限する予防策が行われる必要がなくてもよい。
【0046】
例えば、
図2は、投機的サイド・チャネル攻撃を通じて情報漏洩のリスクがあると見なされる可能性がある一連の動作の実例を示す。この一連の命令は、所与のアドレス#add1からデータ値を読み込み、読み込んだデータ値をレジスタR3に記憶するコンシューマ読込み動作40を含む。#add1におけるデータ値は、プロセッサ2で実行するいくつかの処理にアクセスできない秘密値である可能性が潜在的にある。これには、例えば、インデックス値を宛先レジスタR4にセットするために、レジスタR2において定義されたマスクと、ロードされた値を結合させるAND命令といった、ロードされたデータ値に基づいて値を計算するための1つ又は複数の中間命令が続く。場合によっては、複数の別個の命令が、ロードされたデータ値からインデックス値を生成してもよい。その後、コンシューマ・ロード62は、レジスタR4で指定されたインデックスをとり、これをオフセットとして使用して、レジスタR1内のベース・アドレスと結合させ、データ値をメモリから読み込み、データ値を宛先レジスタR5内に入れる後続の読込み動作のアドレスを取得する。
【0047】
したがって、このシーケンスは、より早期のロード40によって読み込まれた値にターゲット・アドレスが依存するコンシューマ・ロード42を含む。したがって、プロデューサ・ロードが不正確に投機された場合、コンシューマ・ロードが実行されたときまでに、この投機ミスが後で検出されても、データ・キャッシュ20へのコンシューマ・ロード42の影響は、プロデューサ・ロード40によってロードされた秘密データにアクセスできなかった攻撃者に、まだ見えている可能性がある。
【0048】
対照的に、別の読込みのアドレスを計算するためにデータ値が決して使用されない可能性のある読込み命令を含むプログラム・コードについて、(例えば、読込みデータ、及び、読込みに依存するいずれかのデータは、いずれかの後続の読込みのアドレスを計算するために使用されることが可能になる前に上書きされるので)、攻撃のリスクを軽減するための措置をとることが必要でなくてもよい。
【0049】
図3から
図5は、ヒント命令のいくつかの実例を示し、ヒント命令は、コンパイル/リンク時に、又は、ジャスト・イン・タイム(JIT)コンパイル若しくは動的リコンパイルを通じて実行時に動的に、ソフトウェアによって追加されてもよく、或いは、次の読込み、又は次の一群の読込みからのデータが、制御オペランドとして使用される可能性があるかどうかを示すために、実行命令の輪郭を描くハードウェアによって挿入されることが可能である。これは、投機的サイド・チャネル軽減措置なしでこれらの読込みを投機的に実行しても安全であるかどうかを、ヒント命令の存在又は欠如に基づいて、処理パイプラインが決定できることを意味する。
【0050】
図3は、軽減措置なしで行っても安全な命令又はマイクロ動作にフラグを付けるために使用されることが可能なヒント命令の第1の実例を示す。この実例では、ヒント命令は、直後の読込み命令に適用されると想定される。この場合、先に発生するヒント命令が何もない読込み命令は、危険であると想定され、したがって、軽減措置を行う必要がある。ヒント命令は、軽減措置が行われるかどうかを制御すること以外のプロセッサ状態に影響がない構造的無演算(NOP)命令であってもよい。
【0051】
図4は、危険な読込みに印を付けるために、ヒント命令が代わりに使用される第2の実例を示し、先に発生するヒントがない読込み命令は安全であると想定される。この場合、
図3のようにヒント命令がないことではなく、投機的サイド・チャネル軽減措置が行われるのをトリガするヒント命令があることであってよい。
【0052】
図5は、N個の後続の命令のブロックに、安全な投機ヒント命令が適用される別の実例を示し、これらのN個の命令のいずれかによってトリガされたいずれかの読込み動作が、軽減措置なしで行っても安全であると見なされるべきかどうかを示す。
図5の実例について、ヒント命令は、
図3のものと同様に定義され、ここで、命令のその後のブロックによってトリガされるいずれかの読込みが安全であることを、ヒント命令の存在が示す。
図4に類似のブロック・ヒント命令の対応バージョンを提供することも可能になり、このバージョンは、軽減措置を必要とする危険な命令のその後のブロックを示す。
図5の実例は、一定の所定の数Nの命令又はマイクロ動作として、後続の命令のブロックを定義するが、その後のブロックを定義する別の方法は、ヒント命令のアドレスに対してオフセットされた所定のアドレスの観点からのものであってもよく、これにより、アドレスがこのアドレス範囲内にあるいずれかの命令は、ヒント命令によって示されるように、安全である、又は危険であると見なされる。
【0053】
場合によっては、命令キャッシュ6又はマイクロ動作キャッシュ(若しくはトレース・キャッシュ)8は、ヒント命令から導出された情報で注釈を付けられることが可能である。例えば、読込み動作をトリガする命令は、この読込みに適用された先に発生したヒント命令があったかどうかを示す注釈で印を付けられることが可能である。これは、ヒント命令自体が命令キャッシュ6から省略されることを可能にすることができる。マイクロ動作キャッシュ6内のマイクロ動作に対して、類似のアプローチが使用されることが可能である。
【0054】
図6は、
図1に示したプロセッサを使用して命令を処理する方法を示す流れ図である。ステップ100において、メモリからフェッチされた命令に対応するマイクロ動作は、実行ステージ14によって処理する必要があるマイクロ動作にデコードされる。ステップ102において、命令デコーダは、処理されることになる命令のいずれかが、少なくとも1つの後続の読込み動作が投機的に処理される場合に情報漏洩のリスクがあるかどうかを示す投機的サイド・チャネル・ヒント命令であるかどうかを識別する。ステップ104において、プロセッサ2に関連付けられた制御回路は、投機的サイド・チャネル・ヒント命令が命令に含まれていたかどうかに応じて、投機的サイド・チャネル軽減措置をトリガするべきかどうかを決定する。この制御回路は、例えば、命令デコーダ12自体であることが可能であり、又は、所与の動作が非投機的に行われることを保証することが要求される場合、投機の範囲を制御するか、パイプラインの停止を制御する実行ステージ14に関連付けられたいくつかの回路であることが可能であり、又は、読込み動作の結果がどのようにキャッシュされるかを制御するデータ・キャッシュ20に関連付けられたいくつかの回路を含むことができる。したがって、ヒント命令が含まれるかどうかに応じて、投機的サイド・チャネル軽減措置が行われるかどうかを制御するように投機/キャッシュの態様を制御し得る全体的なデータ処理システムの種々の部分が広範囲にわたる可能性があるということが理解されよう。
【0055】
図7は、プロセッサによる実行のためにプログラム命令を用意する方法を示す流れ図である。ステップ150において、実行されることになる動作を識別する入力プログラム・コードが受け取られる。入力プログラム・コードは、プロセッサが実行することになる同じインストラクション・セット・アーキテクチャに従って書かれた命令のセットであることが可能である。しかし、入力プログラム・コードは、コードを実行することになるプロセッサによってサポートされたインストラクション・セット・アーキテクチャから命令にコンパイルされることになる高級プログラミング言語(例えばC)に従って書かれることも可能である。ステップ150において、入力プログラム・コードは、いずれかの投機的サイド・チャネル活性化パターンがあるかどうかを識別するために分析される。例えば、投機的サイド・チャネル活性化パターンは、
図2に示したものなどの一連の命令であることが可能であり、メモリから値を読み込むプロデューサ・ロード40、及び、プロデューサ・ロードによって読み込まれた値に基づいてアドレスを計算したコンシューマ・ロード42を含む。場合によっては、分析は、攻撃を起動する可能性のある疑わしいシーケンスに間違いなくマップするシーケンスをスポットしようとする代わりに、攻撃から安全であることが保証されることが可能な命令のシーケンスを代わりに探すことができる。例えば、任意のその後のロードのアドレスを生成するために、所与のロード命令によって読み込まれたデータ値が決して使用されることがないということを検出できる場合、安全であると印を付けられることが可能である。場合によっては、安全であると間違いなく決定できない動作のシーケンスは、情報漏洩のリスクを生じる可能性のある動作の投機的サイド・チャネル活性化パターンを含むものとデフォルトで想定されることが可能である。したがって、場合によっては、識別したパターンは、単に、動作の安全なパターンの性質に一致しない任意のパターンであることが可能である。
【0056】
ステップ152において、ステップ150で識別した投機的サイド・チャネル活性化パターンの存在又は欠如に基づいて、投機サイド・チャネル・ヒント命令を挿入するべきかどうかが選択される。命令の形について、投機的サイド・チャネル活性化パターンが検出されたときに挿入され得るヒント命令もあるが、このようなパターンがないときに挿入されることが可能なヒント命令もある。ステップ154において、いずれかの挿入されたヒント命令を含めた生成した命令は、その後出力され、ここで、生成した命令は、ターゲット・プロセッサによるその後の実行のために、メモリ又は記録媒体に保存することができる。生成した命令は、さらなるヒント命令を含めるように現在拡大された、入力プログラム・コードの同じ命令を含むことができ、又は、例えば、異なるプログラミング言語又は命令に翻訳又はコンパイルされた、命令の完全に異なるセットを含むことができる。
【0057】
図7の方法は、コンパイラ、又はジャスト・イン・タイム・トランスレータによって、ソフトウェアで実行されることが可能である。コンパイラ/トランスレータ・ソフトウェアは、記録媒体に記憶されてもよい。代替として、
図7の方法は、さらなるヒント・マイクロ動作を生成して、マイクロ動作キャッシュに挿入し、上記で論じられたヒント命令と同じように実行することができる回路の輪郭を描くことによって、例えば、実行された命令ストリームのトレースの分析によって、プログラム・コードを実行するプロセッサ内部のハードウェア・エレメントによって実行されることが可能である。
【0058】
要約すれば、サイド・チャネル軽減措置を実行することが必要であるかどうかを制御するために使用されることが可能なヒント命令をサポートすることによって、より積極的な投機及び/又はあまり制約されないキャッシングを行っても安全な場合に、より積極的な投機及び/又はあまり制約されないキャッシングを可能にすることによって、実行が承認されることが可能である。(そうでなければ、実際の処理動作を実行するために他の命令によって行われる可能性のあるパイプライン・スロットを時には占める可能性がある)いくつかのさらなるヒント命令の存在は、特に、比較的広いフェッチ幅を有する(いくつかの命令がサイクル毎にフェッチされる)現代のプロセッサでは、パイプラインのスループットを著しく低下させる可能性は低い。
【0059】
本出願では、単語「...ように構成される(configured to...)」は、装置の要素が、定義された動作を行うことができる構成を有することを意味するために使用される。この文脈では、「構成(configuration)」は、ハードウェア又はソフトウェアの相互接続の配列又は様式を意味する。例えば、装置は、定義された動作を行う専用ハードウェアを有してもよく、又は、プロセッサ若しくは他の処理デバイスが、関数を実行するようにプログラムされてもよい。「ように構成される(configured to)」は、定義された動作を行うために、装置の要素が任意の方式で変更される必要があることを意味しない。
【0060】
本発明の例証的な実施例が、添付の図面を参照しながら本明細書で詳細に説明されてきたが、本発明は、これらの正確な実施例に限定されないということ、並びに、添付の特許請求の範囲によって定義されるような、本発明の範囲及び精神から逸脱することなく、当業者によって様々な変更及び修正が本発明に行われることが可能であるということが理解されよう。