(57)【要約】【課題】攻撃者によるエクスプロイトからコンピュータアプリケーションを保護する方法およびコンピュータシステムを提供する。【解決手段】コンピュータに実装される方法は、（ｉ）投機的実行エンジンによるコンピュータアプリケーションの実行前に、前記コンピュータアプリケーションのうち、前記投機的実行エンジンが順序外で命令を実行する命令列を特定する過程と、前記命令列に対する処置であって、前記投機的実行エンジンに前記命令を順序どおり実行させる処置を決定する過程と、（ｉｉ）前記投機的実行エンジンによる前記コンピュータアプリケーションの実行中に、前記処置に基づいて前記命令列を変更する過程と、前記コンピュータアプリケーションへの攻撃を阻止するために、特定された前記命令列の代わりに、変更された前記命令列を実行する過程と、を備える。【選択図】図２Ａ
2021511571.tif 000002
【特許請求の範囲】
【請求項１】
（ｉ）投機的実行エンジンによるコンピュータアプリケーションの実行前に、
前記コンピュータアプリケーションのうち、前記投機的実行エンジンが順序外で命令を実行する命令列を特定する過程と、
前記命令列に対する処置であって、前記投機的実行エンジンに前記命令を順序どおり実行させる処置を決定する過程と、
（ｉｉ）前記投機的実行エンジンによる前記コンピュータアプリケーションの実行中に、
前記処置に基づいて前記命令列を変更する過程と、
前記コンピュータアプリケーションへの攻撃を阻止するために、特定された前記命令列の代わりに、変更された前記命令列を実行する過程と、
を備える、コンピュータに実装される方法。
【請求項２】
請求項１に記載の方法において、前記命令列が、リピートストリング処理を含む、方法。
【請求項３】
請求項２に記載の方法において、前記リピートストリング処理が、アセンブリコードリピート命令：ＲＥＰ、ＲＥＰＮＺまたはＲＥＰＺを有する、方法。
【請求項４】
請求項２に記載の方法において、前記リピートストリング処理が、ｉｆ−ｔｈｅｎ−ｅｌｓｅコードブロックを有する、方法。
【請求項５】
請求項１に記載の方法において、前記処置が、特定された前記命令列にメモリバリア命令を追加することを含み、当該メモリバリア命令は、前記投機的実行エンジンに、当該メモリバリア命令のアセンブリコードの前後に発行されるメモリ処理を順序どおり実行する制約を履行させる、方法。
【請求項６】
請求項５に記載の方法において、前記メモリバリア命令が、アセンブリコード命令：ＬＦＥＮＣＥ、ＭＦＥＮＣＥ、ＳＳＢＢまたはＣＳＤＢである、方法。
【請求項７】
請求項５に記載の方法において、さらに、
追加されたメモリバリア命令へのジャンプを、攻撃の可能性があるとしてユーザに報告する過程、
を備える、方法。
【請求項８】
請求項１に記載の方法において、さらに、
（ｉ）前記投機的実行エンジンによる前記コンピュータアプリケーションの実行前に、
間接分岐命令のエクスプロイトを可能にする不正確な分岐予測を算出するように誤訓練された、前記投機的実行エンジンの分岐予測器を検出する過程と、
誤訓練された前記分岐予測器の検出に基づいて、前記コンピュータアプリケーションの間接分岐命令を特定する過程と、
（ｉｉ）前記投機的実行エンジンによる前記コンピュータアプリケーションの実行中に、
特定された前記間接分岐命令を直接分岐命令に変更する過程と、
前記コンピュータアプリケーションへの攻撃を阻止するために、特定された前記間接分岐命令の代わりに、前記直接分岐命令を実行する過程と、
を備える、方法。
【請求項９】
請求項８に記載の方法において、さらに、
誤訓練された前記分岐予測器と並行して、正確な分岐予測を算出する過程と、
算出された前記正確な分岐予測を用いて、誤訓練された前記分岐予測器を再訓練する過程と、
を備える、方法。
【請求項１０】
コンピュータメモリに接続されたプロセッサを備える、コンピュータシステムであって、
前記プロセッサは、
（ｉ）投機的実行エンジンによるコンピュータアプリケーションの実行前に、
前記コンピュータアプリケーションのうち、前記投機的実行エンジンが順序外で命令を実行する命令列を特定し、
前記命令列に対する処置であって、前記投機的実行エンジンに前記命令を順序どおり実行させる処置を決定し、
（ｉｉ）前記投機的実行エンジンによる前記コンピュータアプリケーションの実行中に、
前記処置に基づいて前記命令列を変更し、
前記コンピュータアプリケーションへの攻撃を阻止するために、特定された前記命令列の代わりに、変更された前記命令列を実行する、
ように構成されている、システム。
【請求項１１】
請求項１０に記載のシステムにおいて、前記命令列が、リピートストリング処理を含む、システム。
【請求項１２】
請求項１１に記載のシステムにおいて、前記リピートストリング処理が、アセンブリコードリピート命令：ＲＥＰ、ＲＥＰＮＺまたはＲＥＰＺを有する、システム。
【請求項１３】
請求項１１に記載のシステムにおいて、前記リピートストリング処理が、ｉｆ−ｔｈｅｎ−ｅｌｓｅコードブロックを有する、システム。
【請求項１４】
請求項１０に記載のシステムにおいて、前記処置が、特定された前記命令列にメモリバリア命令を追加することを含み、当該メモリバリア命令は、前記投機的実行エンジンに、当該メモリバリア命令のアセンブリコードの前後に発行されるメモリ処理を順序どおり実行する制約を履行させる、システム。
【請求項１５】
請求項１４に記載のシステムにおいて、前記メモリバリア命令が、アセンブリコード命令：ＬＦＥＮＣＥ、ＭＦＥＮＣＥ、ＳＳＢＢまたはＣＳＤＢである、システム。
【請求項１６】
請求項１４に記載のシステムにおいて、前記プロセッサは、さらに、追加されたメモリバリア命令へのジャンプを、攻撃の可能性があるとしてユーザに報告するように構成されている、システム。
【請求項１７】
請求項１０に記載のシステムにおいて、前記プロセッサは、さらに、
（ｉ）前記投機的実行エンジンによる前記コンピュータアプリケーションの実行前に、
間接分岐命令のエクスプロイトを可能にする不正確な分岐予測を算出するように誤訓練された、前記投機的実行エンジンの分岐予測器を検出し、
誤訓練された前記分岐予測器の検出に基づいて、前記コンピュータアプリケーションの間接分岐命令を特定し、
（ｉｉ）前記投機的実行エンジンによる前記コンピュータアプリケーションの実行中に、
特定された前記間接分岐命令を直接分岐命令に変更し、
前記コンピュータアプリケーションへの攻撃を阻止するために、特定された前記間接分岐命令の代わりに、前記直接分岐命令を実行する、
ように構成されている、システム。
【請求項１８】
請求項１７に記載のシステムにおいて、前記プロセッサは、さらに、
誤訓練された前記分岐予測器と並行して、正確な分岐予測を算出し、
算出された前記正確な分岐予測を用いて、誤訓練された前記分岐予測器を再訓練する、
ように構成されている、システム。
【請求項１９】
（ｉ）プロセスの実行開始時に、
前記プロセスの実行を一時保留する過程と、
一時保留された前記プロセスがメモリのフラッシュ動作のシグネチャを含んでいるか否かを判定する過程と、
一時保留された前記プロセスの実行を続行する過程と、
（ｉｉ）前記プロセスがメモリのフラッシュ動作の前記シグネチャを含んでいる場合、前記実行中に、
前記プロセスがメモリのフラッシュ動作の前記シグネチャを定められたパターンに従って実行しているか否かを動的に検査する過程と、
前記実行が前記定められたパターンを満たした場合、前記プロセスの保護措置を実施する過程と、
を備える、コンピュータに実装される方法。
【請求項２０】
請求項１９に記載の方法において、メモリのフラッシュ動作の前記シグネチャが、ＣＬＦＬＵＳＨ、ＲＤＴＳＣおよびＭＣＲアセンブリ命令のうちの少なくとも１つのパターンを含む、方法。
【請求項２１】
請求項１９に記載の方法において、前記定められたパターンが、前記メモリの前記フラッシュ動作の頻度及びスピードの尺度を含む、方法。
【請求項２２】
請求項１９に記載の方法において、前記定められたパターンは、前記プロセスが前記ＣＬＦＬＵＳＨまたはＭＣＲ命令を実行する回数の閾値である、方法。
【請求項２３】
請求項１９に記載の方法において、さらに、
前記投機的実行エンジンのキャッシュにおける所与の変数のキャッシュラインが他のキャッシュラインよりも高速で繰返し前記プロセスにより読み出された場合に、前記プロセスを終了する過程、
を備える、方法。
【請求項２４】
請求項１９に記載の方法において、さらに、
前記プロセスが特権レベル命令をシステムレジスタで実行することを試みた場合に、前記プロセスを終了する過程、
を備える、方法。
【請求項２５】
請求項１９に記載の方法において、前記保護措置が、前記プロセスの終了、隔離領域への前記プロセスの移動、プロセスファイルを修正するための少なくとも１つのパッチのロード、および前記プロセスが悪意あるものであることのユーザへの報告のうちの少なくとも１つである、方法。
【請求項２６】
コンピュータメモリに接続されたプロセッサを備える、コンピュータシステムであって、
前記プロセッサは、
（ｉ）プロセスの実行開始時に、
前記プロセスの実行を一時保留し、
一時保留された前記プロセスがメモリのフラッシュ動作のシグネチャを含んでいるか否かを判定し、
一時保留された前記プロセスの実行を続行し、
（ｉｉ）前記プロセスがメモリのフラッシュ動作の前記シグネチャを含んでいる場合、前記実行中に、
前記プロセスがメモリのフラッシュ動作の前記シグネチャを定められたパターンに従って実行しているか否かを動的に検査し、
前記実行が前記定められたパターンを満たした場合、前記プロセスの保護措置を実施する、
ように構成されている、システム。
【請求項２７】
請求項２６に記載のシステムにおいて、メモリのフラッシュ動作の前記シグネチャが、ＣＬＦＬＵＳＨ、ＲＤＴＳＣおよびＭＣＲアセンブリ命令のうちの少なくとも１つのパターンを含む、システム。
【請求項２８】
請求項２６に記載のシステムにおいて、前記定められたパターンが、前記メモリの前記フラッシュ動作の頻度及びスピードの尺度を含む、システム。
【請求項２９】
請求項２６に記載のシステムにおいて、前記定められたパターンは、前記プロセスが前記ＣＬＦＬＵＳＨまたはＭＣＲ命令を実行する回数の閾値である、システム。
【請求項３０】
請求項２６に記載のシステムにおいて、前記プロセッサは、さらに、前記投機的実行エンジンのキャッシュにおける所与の変数のキャッシュラインが他のキャッシュラインよりも高速で繰返し前記プロセスにより読み出された場合に、前記プロセスを終了するように構成されている、システム。
【請求項３１】
請求項２６に記載のシステムにおいて、前記プロセッサは、さらに、前記プロセスが特権レベル命令をシステムレジスタで実行することを試みた場合に、前記プロセスを終了するように構成されている、システム。
【請求項３２】
請求項２６に記載のシステムにおいて、前記保護措置が、前記プロセスの終了、隔離領域への前記プロセスの移動、プロセスファイルを修正するための少なくとも１つのパッチのロード、および前記プロセスが悪意あるものであることのユーザへの報告のうちの少なくとも１つである、システム。
【発明の詳細な説明】
【関連出願】
【０００１】
本願は、2018年1月12日付出願の米国仮特許出願第62/616,786号および2018年1月17日付出願の米国仮特許出願第62/618,508号の利益を主張する。上記出願の全教示内容は、参照をもって本明細書に取り入れたものとする。
【背景技術】
【０００２】
ＣＰＵのデータキャッシュの時間計測によって、投機的実行時に情報が効率的に漏洩しうるということが最近分かった。このような脆弱性により、各種コンテキストのローカルセキュリティ境界を跨いだ任意の仮想メモリアクセスが、短時間といえども可能になり得る。悪意ある人物が、このような任意の仮想メモリアクセスを悪用する可能性がある。投機的実行を用いる今日の数多くのマイクロプロセッサに影響を及ぼすことが分かっているこれらの脆弱性には、様々な種類のものがある。そのようなマイクロプロセッサには、ＩｎｔｅｌやＡＭＤやＡＲＭによる一部のプロセッサが含まれる。これらの装置は、アプリケーションコードの条件付き実行に伴う遅延を軽減するために、２０年超ものあいだ投機的実行や分岐予測を利用してきた。しかし、上記の方法により、セキュリティ領域間の隔絶を打ち破るセキュリティ上の抜け道を通って秘匿のアプリケーションデータを流出させられるということが発見された。
【０００３】
判明した第１の攻撃型は、このようなプロセッサにおける、境界チェックバイパス（境界チェックのすり抜け）を背景とした脆弱性である。判明した第２の攻撃型は、このようなプロセッサにおける、分岐先インジェクション（分岐先の書換え）を背景とした脆弱性である。判明した第３の攻撃型は、このようなプロセッサにおける、不正なデータキャッシュロード（不正なデータキャッシュ読出し）を背景とした脆弱性をエクスプロイトするものである。判明した第４の攻撃型は、このようなプロセッサにおける、投機的ストアバイパスを背景とした脆弱性をエクスプロイトするものである。第１の攻撃型には、ストアの境界チェックバイパスを背景とした脆弱性の亜種、読取り専用保護バイパスを背景とした脆弱性の亜種、および不正なシステムレジスタ読取りを背景とした脆弱性の亜種が含まれる。第１、第２および第４の攻撃型はまとめて「Ｓｐｅｃｔｒｅ」と一般的に称され、第３の攻撃型は「Ｍｅｌｔｄｏｗｎ」と一般的に称される。Ｓｐｅｃｔｒｅには、さらに、このようなプロセッサにおける、中央演算処理装置（ＣＰＵ）のリターンスタックバッファを背景とした脆弱性をエクスプロイトするリターンスタックバッファ（ＲＳＢ）攻撃型が含まれる。Ｓｐｅｃｔｒｅには、さらに、このようなプロセッサにおける、レイジーｘ８７浮動小数点演算装置（ＦＰＵ）状態復元を背景とした脆弱性をエクスプロイトするＳｐｅｃｔｒｅ ＮＧＳ攻撃型が含まれる。別の攻撃型には、「Ｆｏｒｅｓｈａｄｏｗ」と一般的に称されるものもある。Ｆｏｒｅｓｈａｄｏｗ ＳＧＸエンクレーブ侵入型は、このようなプロセッサにおける、Ｉｎｔｅｌソフトウェアガードエクステンション（ＳＧＸ）エンクレーブの暗号化データを背景とした脆弱性である。Ｆｏｒｅｓｈａｄｏｗ−ＮＧ−１型およびＦｏｒｅｓｈａｄｏｗ−ＮＧ−２型は、このようなプロセッサにおける、クラウドサービス上で動作する仮想マシン（ＶＭ）やハイパーバイザーを背景とした脆弱性である。
【０００４】
Ｓｐｅｃｔｒｅ脆弱性、Ｍｅｌｔｄｏｗｎ脆弱性およびＦｏｒｅｓｈａｄｏｗ脆弱性は、データセンターやクラウドのほぼ全てのサーバやアプリケーションシステムに存在するマイクロプロセッサ欠陥であり、企業システムにとって近年見られたなかで最も大きい衝撃となっている。これらの欠陥は、プロセスの複数のスレッド間の隔絶や、複数のアプリケーションプロセス間の隔絶や、複数の仮想マシン間の隔絶を破壊すると同時に、ＣＰＵが処理するデータも流出させる。最も影響を受けるのは、共有環境やクラウドサービスである。というのも、これらのシステムは、ユーザ間の隔絶を保ちながらマルチテナント環境で動作するように設計されているからである。ＷａｎｎａｃｒｙやＥｑｕｉｆａｘと同様の影響を回避するため、これらの欠陥の修正は、ＩＴ担当者やセキュリティ担当者の最優先事項になっている。
【０００５】
ＳｐｅｃｔｒｅやＭｅｌｔｄｏｗｎやＦｏｒｅｓｈａｄｏｗが持つリスクに対する懸念は業界全体が共有しているものの、企業ＩＴチームはメーカーがリリースした利用可能なパッチをデプロイすることに慎重である。パッチのなかには、カーネルのクラッシュを引き起こしたものもある。ＣＰＵベンダーやＯＳベンダーがリリースしたパッチのなかには、３０％もの許容できないパフォーマンス低下を招いたものもある。これらのパッチは、マイクロコードの更新だけでなくＯＳの変更も要求する。ソフトウェアのパッチでは、問題に対処できない。というのも、アプリケーションの再コーディングや再コンパイルやマイクロコードの更新が大量に必要となるからである。このようなパッチのなかには、リブートをしばしば引き起こしたり、古いコンピュータを使えなくしたり、重要なメモリデータ構造の投機的実行やフラッシュ動作の無効化による許容できない程のパフォーマンス低下を招いたりしたものもある。そのほかにも、滅多に生じないエラーメッセージや、サーバへのログオンの困難化や、アドミンコンソールの問題が報告されている。
【発明の概要】
【発明が解決しようとする課題】
【０００６】
上記の攻撃型に対処する最新のマイクロコード再設計では、機能上の重大なアプリケーション異常や応答時間の低速化が生じた。チップのマイクロコードを更新しようとすると、意図しない結果を招く可能性がさらに高くなったり、多くの環境で過度の不安定性が発生したりする。チップレベルの脆弱性を修正することは、簡単なことではない。数多くのレベルで修正をインストールする必要があり、マイクロコードからカーネル、オペレーティングシステム、ハイパーバイザー、ライブラリなどといったあらゆる物を、影響を受ける全てのシステムについて更新するという膨大なＩＴ計画へ発展することになる。マイクロコードの更新は、しばしば高リスクである。一つの間違いで、コンピュータが使用不能になり得る。そのため、プロセッサ業界としては、これらの脆弱性を持たない新たなＣＰＵの開発を急ぐことを約束するほか選択肢がほぼない。これは長期的にみれば解決策になり得るが、数十億ものチップを交換するには何年もかかり、長期にわたって悪意ある人物達に好機を与えることになる。
【課題を解決するための手段】
【０００７】
本発明の実施形態は、過去のアプローチとは異なり、Ｓｐｅｃｔｒｅ、Ｍｅｌｔｄｏｗｎ、Ｆｏｒｅｓｈａｄｏｗなどの攻撃型によるエクスプロイトからのアプリケーションの保護を、これらの攻撃型に対する脆弱性を有する中央演算処理装置（ＣＰＵ）上でそのアプリケーションコードが実行されている最中に（リアルタイムで）即座に行う。実施形態は、アプリケーション空間と投機的実行エンジンの処理コンポーネントとの間に機能を実装し、動的バイナリ解析エンジンやプロセス生成通知インターフェースやプロセス終了通知インターフェースを用いるなどして当該機能を実行する。これらの機能は、アプリケーションコードがＣＰＵで実行されている最中に、Ｓｐｅｃｔｒｅ脆弱性やＭｅｌｔｄｏｗｎ脆弱性やＦｏｒｅｓｈａｄｏｗ脆弱性に関係した挙動をリアルタイムで決定論的に検出するように構成されている。例えば、これらの機能は、アプリケーションのうちの投機的実行の影響を受けるコードセグメントや、投機的実行の脆弱性をエクスプロイトするサイドチャネルの特徴を示すシグネチャパターンを検出するように、当該アプリケーションを（当該アプリケーションがＣＰＵで実行されている最中に）決定論的に監視し得る。実施形態は、その検出に基づき、このような脆弱性やアプリケーションへのエクスプロイト試行に対して先制的にリアルタイムで対応し得る。例えば、実施形態は、アプリケーションの実行中に、このような脆弱性をなくすように、あるいは、投機的実行エンジンの分岐予測を再訓練するように、あるいは、このような脆弱性のエクスプロイトのシグネチャを示すプロセスを終了させるように、アプリケーションコードを（ディスクではなくメモリに直接）バイナリレベルで修正し得る。
【０００８】
実施形態は、アプリケーションに対するソフトウェア、カーネル又はマイクロコードのパッチや、カーネル又はマイクロコードに対するその他の破壊的変更や、ＣＰＵをリセットさせるイベントを必要としないので、ＳｐｅｃｔｒｅやＭｅｌｔｄｏｗｎやＦｏｒｅｓｈａｄｏｗや他のそのような脆弱性からアプリケーションを保護する際にリスクが全く伴わない。また、実施形態は、アプリケーションを実行するシステムにその実行中のアプリケーションの脆弱性の修正をまかせないので、当該システムは、互換性や安定性を心配することなくパフォーマンスレベルを許容範囲内に維持することができる。また、実施形態は、ベンダーのパッチが一般的に存在しない部分や、実行する処理の目的重要度からみてベンダーのパッチがこれまでインストールされてこなかった又はインストール可能でない部分にも保護を拡げることにより、上記脆弱性によるデータ流出のリスクを軽減させることができる。
【０００９】
実施形態は、投機的実行エンジンにより実行されるコンピュータアプリケーションを脆弱性（例えば、Ｓｐｅｃｔｒｅ、Ｍｅｌｔｄｏｗｎ等）が原因でエクスプロイトされないよう保護するコンピュータシステム、方法およびプログラムプロダクトに向けられている。当該システム、方法およびプログラムプロダクトは、投機的実行エンジンによるコンピュータアプリケーションの実行前に、前記コンピュータアプリケーションのうち、前記投機的実行エンジンが順序外で命令を実行する命令列、あるいは、前記投機的実行エンジンが特権昇格を悪用する際の命令列を特定する。例的な一実施形態において、前記命令列は、配列からなるユーザ操作入力を処理するものである。例的な実施形態において、前記配列の処理は、アセンブリコードリピート命令：ＲＥＰ、ＲＥＰＮＺまたはＲＥＰＺを有する。例的な実施形態において、前記リピートストリング処理は、ｉｆ−ｔｈｅｎ−ｅｌｓｅコードブロックを有する。前記システム、方法およびプログラムプロダクトは、前記命令列に対する処置であって、前記投機的実行エンジンに前記命令を順序外で実行させないための処置を決定する。例的な一実施形態において、前記処置は、特定された前記命令列にメモリバリア命令を追加することを含み、当該メモリバリア命令は、前記投機的実行エンジンに、当該メモリバリア命令の前後に発行されるメモリ処理を順序どおり実行する制約を履行させる。例的な実施形態において、前記メモリバリア命令は、アセンブリコード命令：ＬＦＥＮＣＥ、ＭＦＥＮＣＥ、ＳＳＢＢまたはＣＳＤＢである。
【００１０】
前記システム、方法およびプログラムプロダクトは、前記投機的実行エンジンによる前記コンピュータアプリケーションの実行中に、前記処置に基づいて前記命令列を変更する。前記システム、方法およびプログラムプロダクトは、前記コンピュータアプリケーションへの攻撃を阻止するために、特定された前記命令列の代わりに、変更された前記命令列を実行する。一部の実施形態において、前記システム、方法およびプログラムプロダクトは、追加されたメモリバリア命令へのジャンプを、攻撃の可能性があるとしてユーザに報告する。
【００１１】
一部の実施形態において、前記システム、方法およびプログラムプロダクトは、投機的実行エンジンによるコンピュータアプリケーションの実行前に、当該投機的実行エンジンの間接分岐予測器の誤訓練の攻撃を受ける可能性がある命令のセットを検出する。誤訓練された前記分岐予測器は、間接分岐命令のエクスプロイトを可能にする不正確な分岐予測先を算出する。前記システム、方法およびプログラムプロダクトは、誤訓練された前記分岐予測器の検出に基づいて、前記コンピュータアプリケーションの間接分岐命令を特定する。前記システム、方法およびプログラムプロダクトは、前記投機的実行エンジンによる前記コンピュータアプリケーションの実行中に、特定された前記間接分岐命令を直接分岐命令に変更する。前記システム、方法およびプログラムプロダクトは、前記コンピュータアプリケーションへの攻撃を阻止するために、特定された前記間接分岐命令の代わりに、前記直接分岐命令を実行する。
【００１２】
一部の実施形態において、前記システム、方法およびプログラムプロダクトは、さらに、誤訓練された前記分岐予測器と並行して正確な分岐予測を算出し、算出された前記正確な分岐予測を用いて、誤訓練された前記分岐予測器を再訓練する。
【００１３】
実施形態は、投機的実行環境の脆弱性（例えば、Ｓｐｅｃｔｒｅ、Ｍｅｌｔｄｏｗｎ等）をプロセスがエクスプロイトしようと試みるのを検出するコンピュータシステム、方法およびプログラムプロダクトに向けられている。当該システム、方法およびプログラムプロダクトは、プロセスの実行開始時に、当該プロセスの実行を一時保留する。前記システム、方法およびプログラムプロダクトは、一時保留された前記プロセスがキャッシュメモリのフラッシュ動作のシグネチャを含んでいるか否かを判定する。例的な一実施形態において、キャッシュメモリのフラッシュ動作の前記シグネチャは、ＣＬＦＬＵＳＨやＭＣＲやＲＤＴＳＣアセンブリ命令のパターンを含む。例えば、前記システム、方法およびプログラムプロダクトは、一時保留された前記プロセスが、ＴＳＸ拡張の一部であるハードウェアロック省略（ＨＬＥ）や制限付きトランザクションメモリ（ＲＴＭ）などのトランザクション同期用の命令で指定されたコード領域のシグネチャを含んでいるか否かを判定する。
【００１４】
前記システム、方法およびプログラムプロダクトは、一時保留された前記プロセスの実行を続行する。前記システム、方法およびプログラムプロダクトは、前記プロセスがメモリのフラッシュ動作の前記シグネチャを含んでいる場合、前記実行中に、前記プロセスがメモリのフラッシュ動作の前記シグネチャを定められたパターンに従って実行しているか否かを動的に検査する。例的な実施形態において、前記定められたパターンは、前記メモリの前記フラッシュ動作の頻度及びスピードの尺度や、前記プロセスが前記ＣＬＦＬＵＳＨまたはＭＣＲ命令を実行する回数の閾値を含む。例的な実施形態では、前記定められたパターンが、ＴＳＸ拡張で指定されたコード領域のフラッシュ動作回数の頻度及びスピードの尺度や、ＴＳＸ指定領域後の一時的コードの実行回数の頻度及びスピードの尺度を含む。前記システム、方法およびプログラムプロダクトは、前記実行が前記定められたパターンを満たした場合、前記プロセスの保護措置を実施する。当該保護措置は、スレッドの終了、プロセスの終了、隔離領域へのプロセスの移動、プロセスファイルを修正するための少なくとも１つのパッチのロード、およびプロセスが悪意あるものであることのユーザへの報告のうちの任意のものを含み得る。
【００１５】
一部の実施形態において、前記システム、方法およびプログラムプロダクトは、前記投機的実行エンジンのキャッシュにおける所与の変数のキャッシュラインが他のキャッシュラインよりも高速で繰返し前記プロセスにより読み出された場合に、前記プロセスの保護措置を実施する。一部の実施形態において、前記システム、方法およびプログラムプロダクトは、前記プロセスが特権レベル命令をシステムレジスタで実行することを試みた場合に、前記プロセスの保護措置を実施する。
【００１６】
前述の内容は、添付の図面に示す例的な実施形態についての以下の詳細な説明から明らかになる。異なる図をとおして、同一の符号は同一の構成要素を指すものとする。図面は必ずしも縮尺どおりではなく、むしろ、実施形態を図示することに重点が置かれている。
【図面の簡単な説明】
【００１７】
【図１Ａ】本開示の一部の実施形態における、例的な投機的実行エンジンを示す図である。
【図１Ｂ】本開示の一部の実施形態における、脆弱性をエクスプロイトする際に用いられる例的なインフラストラクチャを示す図である。
【図１Ｃ】本開示の一部の実施形態における、投機的実行の脆弱性に対処する例的な方法の一つを示す図である。
【図１Ｄ】本開示の一部の実施形態における、投機的実行の脆弱性に対処する例的な他の方法を示す図である。
【図１Ｅ】本開示の一部の実施形態における、投機的実行の脆弱性に対処する例的なさらなる他の方法を示す図である。
【図１Ｆ】本開示の一部の実施形態における、投機的実行の脆弱性に対処する例的なさらなる他の方法を示す図である。
【図１Ｇ】本開示の一部の実施形態における、投機的実行の脆弱性に対処する例的なさらなる他の方法を示す図である。
【図１Ｈ】本開示の一部の実施形態において、リターンスタックバッファ（ＲＳＢ）がエクスプロイトされる様子の一例を示す図である。
【図１Ｉ】本開示の一部の実施形態において、アドレス変換の処理がエクスプロイトされる様子の一例を示す図である。
【図１Ｊ】本開示の一部の実施形態において、ＢｒａｎｃｈＳｃｏｐｅが分岐予測装置（ＢＰＵ）の分岐方向予測部を標的とする様子の一例を示す図である。
【図２Ａ】本開示の一部の実施形態における、アプリケーションを脆弱性から保護する例的なトラステッドエグゼキューションシステムを示す図である。
【図２Ｂ】本開示の一部の実施形態における、アプリケーションを脆弱性から保護する例的な他のトラステッドエグゼキューションシステムを示す図である。
【図３Ａ】本開示の一部の実施形態における、脆弱性を仮想修正する例的な方法を示す図である。
【図３Ｂ】本開示の一部の実施形態における、エクスプロイトを検出し阻止する例的な方法を示す図である。
【図４Ａ】攻撃者が投機的実行により生じる脆弱性をエクスプロイトする際の例的なシナリオを示す図である。
【図４Ｂ】本開示の一部の実施形態における、攻撃者が投機的実行により生じる脆弱性をエクスプロイトしないよう阻止する例的なシナリオを示す図である。
【図５】本開示の実施形態が実現され得るコンピュータネットワークまたは同様のデジタル処理環境を示す図である。
【図６】図５のコンピュータシステム内のコンピュータ（例えば、クライアントプロセッサ／装置、サーバコンピュータ等）の例的な内部構造の図である。
【発明を実施するための形態】
【００１８】
以下では、例的な実施形態について説明する。
【００１９】
本明細書で引用する全ての特許、特許出願公開公報及び刊行物の全教示内容は、参照をもって取り入れたものとする。
【００２０】
本発明の実施形態は、ＯＳやマイクロコードのパッチをインストールすることなく、投機的実行エンジンがアプリケーションを実行している最中に、Ｓｐｅｃｔｒｅ脆弱性やＭｅｌｔｄｏｗｎ脆弱性やＦｏｒｅｓｈａｄｏｗ脆弱性を動的に修正するフレームワークを実現する。実施形態は、ベンダーのパッチと同様のコードアップデートだけでなく、ベンダーのパッチで提供されないコードアップデートも動的に適用し得る。前記フレームワークは、前記アプリケーションの実行中に、当該アプリケーションの実行を監視して前記投機的実行エンジンの順序外実行時に危険となる（脆弱性を示す）コンストラクト（コードセグメント又はルーチン）を特定する。前記フレームワークは、特定された当該コンストラクトのバイナリコードがメインプロセッサメモリから前記投機的実行エンジンのＣＰＵキャッシュに向けて実行のためにフェッチされる際に、前記脆弱性を修正するための命令を当該バイナリコードに実装する。前記フレームワークは、当該フレームワークが特定したコンストラクトの特定の種類（例えば、ｉｆ−ｔｈｅｎ命令文、間接分岐命令等）に基づき、特定の命令を実装する。前記フレームワークは、前記アプリケーションを監視し脆弱性を当該特定の命令で修正するのに、セキュリティ技術導入ガイド（ＳＴＩＧ）やユーザ設定に基づくルールベースのポリシーを適用し得る。
【００２１】
前記フレームワークは、さらに、攻撃者が投機的実行サイクル中の間接ジャンプコール命令の宛先として特定の宛先を選択することを可能にする前記投機的実行エンジンの分岐予測器の誤訓練に対しても保護を行う。これを行うために、前記フレームワークは、前記分岐予測器と並行して正確な分岐予測を算出するスレッドを実行し、当該正確な分岐予測を用いて前記分岐予測器を、攻撃者の影響を受けないように再訓練する。これらの手法により、実施形態は、既存のコードを変更したりシステムパフォーマンスに多大な影響を及ぼしたりすることなく、Ｓｐｅｃｔｒｅ、Ｍｅｌｔｄｏｗｎ、Ｆｏｒｅｓｈａｄｏｗなどが持つ既知のリスクからアプリケーションを保護する。これらの実施形態は、脆弱性を有するアプリケーションをリアルタイムで保護し、脆弱性に対するパッチをソフトウェアベンダーが設計できるようになる遥か前から当該脆弱性を実質的に仮想修正する。
【００２２】
一部の実施形態では、ディスク上にある、ＯＳやユーザが能動的にインストールした既知のどのソフトウェアパッケージの一部でもない未確認ファイルについて、開始を行わない。未確認ファイルのこのような判定を行うために、前記フレームワークはプロセスの実行開始前に、各実行ファイルや各ライブラリのチェックサムを計算して当該チェックサムをこれらのファイルの有効なチェックサムを格納したシグネチャデータベースと照合する。チェックサムが一致しない場合、前記フレームワークは、プロセスを開始しないようにしたり、プロセスを隔離領域に移動させたり、プロセスファイルの正当なコピーを復元したり、実行ファイルやライブラリを修正するための少なくとも１つのパッチをロードしたり、プロセスが悪意あるものであることをユーザに報告したりし得る。
【００２３】
そのほか、前記フレームワークは、各プロセスの実行が開始されると、実行ファイルやライブラリのスキャンを引き続き行い、Ｓｐｅｃｔｒｅ脆弱性やＭｅｌｔｄｏｗｎ脆弱性をエクスプロイトする際に用いられる可能性がある、メモリのフラッシュ動作のシグネチャを当該プロセスが含んでいるか否かを特定する。前記フレームワークは、プロセスがそのようなシグネチャを含んでいることを特定すると、当該プロセスの実行中に当該プロセスを（例えば、動的バイナリ計装、関数フッキング技術などのメカニズムを用いる等して）リアルタイムで監視し当該プロセスが上記のような脆弱性のエクスプロイトの特徴となる定められたパターン（例えば、フラッシュ動作が特定の頻度やスピードで行われること、特定の変数のキャッシュラインが他のキャッシュラインよりも高速で読み出されること、ＴＳＸ指定領域内のフラッシュ命令等）に従って前記シグネチャを実行しているか否かを検出する。前記プロセスの実行中、前記フレームワークは、さらに、当該プロセスをリアルタイムで監視し当該プロセスが特権レベル命令でシステムレジスタ／カーネルレジスタ（例えば、Ｒｉｎｇ０内のＣＲ０、ＣＲ１、ＣＲ２、ＣＲ３等）を使用しているか否かを判定する。前記プロセスが定められたパターン閾値を満たした場合や、前記プロセスが特権レベル命令でシステムレジスタ／カーネルレジスタを使用している場合には、前記フレームワークが、プロセスを終了したり、プロセスを隔離領域に移動させたり、実行ファイルやライブラリファイルの正当なコピーを復元したり、プロセスファイルを修正するための少なくとも１つのパッチをロードしたり、プロセスが悪意あるものであることをユーザに報告したりし得る。実施形態は、ＳｐｅｃｔｒｅやＭｅｌｔｄｏｗｎや投機的実行により生じるその他の脆弱性を利用したエクスプロイトを阻止する技術を、このようなフレームワークを用いることによって実行する。
【００２４】
実施形態は、ユーザ操作によるメモリ読取りを実施する命令を確実に特定し、Ｓｐｅｃｔｒｅ １型の攻撃で見られるような、投機的実行時の境界外メモリへのアクセスを命令が実行することがないように阻止する。また、実施形態は、Ｓｐｅｃｔｒｅ ２型の攻撃で見られるような、分岐予測器の誤訓練を阻止する。また、実施形態は、サイドチャネル攻撃のコードを無効にし、攻撃者が立ち上げたプロセスを終了させることで、Ｍｅｌｔｄｏｗｎを利用したエクスプロイトを阻止する。例的な実施形態は、今日のＳｐｅｃｔｒｅエクスプロイトやＭｅｌｔｄｏｗｎエクスプロイトやＦｏｒｅｓｈａｄｏｗエクスプロイトを検出し阻止するだけでなく、間違いなく出現するであろう今後の攻撃型についても検出し阻止する。
【００２５】
実施形態は、最も高次のレベルにおいて下記の対処メカニズムを組み込むことにより、投機的実行環境で実行される被害者プロセスを検出し保護する。
【００２６】
【表１】
2021511571.tif 000003
【００２７】
実施形態は、サイドチャネル攻撃を下記の手法で検出し阻止する：
・ホワイトリストに照合して行うプロセス初期設定検査
・過剰なフラッシュ＆リロード傾向を示すプロセスの検出
・過剰なプライム＆リロード傾向を示すプロセスの検出
・システムレジスタへのアクセスを試みるユーザコードの検出
・特権命令の実行を試みるユーザコードの検出
・ＴＳＸ一時的命令を実行するプロセスの検出
・ＲＳＢスタックのフラッシュ動作を試みる命令の検出（１．８セクションを参照のこと）
・閾値を上回る過剰なＯＳコンテキスト切替えを行うプロセスの検出
・閾値を上回るｌｏｎｇｊｍｐｓ（）を行うプロセスの検出
・Ｃ６スリープステートをトリガするプロセスの検出
【００２８】
（投機的実行エンジン）
【００２９】
図１Ａに、本開示の一部の実施形態における、例的な投機的実行エンジン１００を示す。投機的実行は、順序外実行や分岐予測のような、ソフトウェア設計における非一般的な枠組みの概念を招き入れる。このような投機的実行は、アプリケーションの実行中に脆弱性（例えば、Ｓｐｅｃｔｒｅ、Ｍｅｌｔｄｏｗｎ、Ｆｏｒｅｓｈａｄｏｗ等）を生じさせる。悪意ある人物は、これらの脆弱性をエクスプロイトすることで、実行中のアプリケーションのデータに不正にアクセスし得る。
【００３０】
投機的実行エンジン１００は、フロントエンド１６０、実行エンジン１７０、およびメモリサブシステム１９０を備える。フロントエンド１６０は、アプリケーションの命令をアプリケーション空間から、命令トランスレーションルックアサイドバッファ（ＩＴＬＢ）１６２に接続されたＬ１命令キャッシュ１６１へ移動させる。フロントエンド１６０は、Ｌ１命令キャッシュ１６１から命令をフェッチして、当該命令をマイクロオペレーション（μＯＰ）にデコードする。フロントエンド１６０は、このデコードを、命令フェッチ＆プリデコード１６５、命令キュー１６６および４ウェイデコード１６７を用いて実行する。フロントエンド１６０の分岐予測器１６３は、過去の命令処理で培った訓練に基づき、デコードされた命令（μＯＰ）の実行順番を予測（予想）する。分岐予測器１６３により、μＯＰ実行順番の予測が（μＯＰキャッシュ２６４を介して）ＭＵＸ１６８へと供給される。フロントエンド１６０は、さらに、前記μＯＰもＭＵＸ１６８へと供給する。ＭＵＸ１６８は、アロケーションキュー１６９内に当該μＯＰを、予測された順番で並べる。
【００３１】
実行エンジン１７０は、リオーダバッファ１７１を含む。リオーダバッファ１７１は、アロケーションキュー１６９内における前記順番に並べられた未実行μＯＰに対してレジスタを割り当てたり、当該μＯＰをリネームしてリタイアさせたりする。実行エンジン１７０のスケジューラ１７２は、実行可能な状態になった未実行μＯＰを、レジスタの割当てに従って１７３，１７４，１７５，１７６，１７７，１７８，１７９，１８１を含む実行部１８２で実行する。スケジューラ１７２は、未実行μＯＰが必要とするデータが利用可能になったことが共通データバス（ＣＤＢ）１８３から判明した際に、当該未実行μＯＰが実行可能な状態になったと判断する。分岐予測器１６３が予測した順番が正確でないと実行エンジン１７０が判断すると、リオーダバッファ１７１がロールバックしてμＯＰをスケジューラ１７２からクリアする。
【００３２】
メモリサブシステム１９０は、Ｌ１データキャッシュ１９５を含む。μＯＰの実行に必要なデータは、（実行部１８２のロードデータ１７７，１７８やストアデータ１７９により）メインプロセッサメモリからロードバッファ１９３やストアバッファ１９４へと送られる。ロードバッファ１９３やストアバッファ１９４は、当該必要なデータを、デュアルトランスレーションルックアサイドバッファ（ＤＴＬＢ）１９５に接続された前記データキャッシュ１９５へ送る。データキャッシュ１９５は、当該必要なデータを処理するうえで、レベル２変換ルックアサイドバッファ（ＳＴＬＢ）１９７に接続された別のＬ２キャッシュ１９８と通信可能とされている。
【００３３】
攻撃者は、データキャッシュ１９５を（例えば、ＣＬＦＬＵＳＨのような非特権命令を用いる等して）連続的にクリアすることで、投機的実行の脆弱性（Ｓｐｅｃｔｒｅ、Ｍｅｌｔｄｏｗｎ、Ｆｏｒｅｓｈａｄｏｗなど）を悪用し得る。攻撃者は、フラッシュしたキャッシュラインに実行エンジン１７０がアクセスするまで十分待つ。その後、攻撃者は、フラッシュしたキャッシュラインに再度アクセスする。実行エンジン１７０がそのキャッシュラインを（例えば、他のμＯＰを処理する等のために）使用した場合は、実行エンジン１７０がそのキャッシュラインを使用しておらずキャッシュをメインプロセッサメモリからロードする必要がある場合に比べて、ロードが（Ｌ２キャッシュ１９８に残っているので）早くなる。Ｌ２データキャッシュ１９５をクリアすると、コードブロック内の特定の命令のμＯＰの実行に必要なデータが存在しなくなる。同じコードブロック内の後続の別の命令を含むμＯＰが当該必要なデータを要求するものでない場合、スケジューラ１７２が当該μＯＰを（同じコードブロック内の前記必要なデータを要求する先行の命令のμＯＰよりも先に）実行する。これに並行して、攻撃者は、当該μＯＰの実行に用いられる変数の値を操作（セット、クリア等）することにより、アプリケーション上で特定の重要な命令がトリガされたか否かを確認することができる。そして、攻撃者は、これらの重要な命令を操作することにより、当該命令で処理されるデータを盗み得る。
【００３４】
図１Ｂに、本発明の一部の実施形態における、Ｓｐｅｃｔｒｅ脆弱性／Ｍｅｌｔｄｏｗｎ脆弱性／Ｆｏｒｅｓｈａｄｏｗ脆弱性をエクスプロイトする際に用いられる例的なインフラストラクチャ１５０を示す。Ｓｐｅｃｔｒｅ脆弱性やＭｅｌｔｄｏｗｎ脆弱性やＦｏｒｅｓｈａｄｏｗ脆弱性のエクスプロイトは、セキュリティ領域間の隔絶を打ち破ることが可能な、巧妙に作り込まれた悪意あるプロセスを用いて計画されたものである。攻撃者は、投機的実行エンジンのハードウェア脆弱性により、個々のプロセス群１１６間の隔絶を（キャッシュサイドチャネル攻撃を用いて）打ち破ることができる。当該脆弱性により、ＣＰＵ１２８（マイクロコード＋投機的実行エンジン１００）により実行される所与のプロセス（攻撃者プロセス１２０）から、ＣＰＵ１２８又は分岐予測器１６３が処理する別のプロセス（被害者プロセス１２２）のデータを操作することが可能となる。被害者プロセス１２２は、投機的実行エンジン１００が実行しているアプリケーションの関数の一部を含んでいる。前記脆弱性により、攻撃者プロセス１２０は、ＣＰＵ１２８が実行するオペレーティングシステム１１８を、ユーザ空間コード１２４及びカーネル保護コード１２６のいずれでも操作することが可能となる。エラーのないアプリケーション（例えば、被害者プロセス１２２を含む）であっても、前記脆弱性に基づくと被害者になる可能性がある。エクスプロイトの手段は、極めて低次レベルな性質のものなので、どのログファイルにも痕跡が残らない。
【００３５】
キャッシュサイドチャネル攻撃を可能にする一部の投機的実行脆弱性（例えば、Ｍｅｌｔｄｏｗｎ等）は、ページファイルアクセスを条件とする。コンテナ同士は、カーネル（カーネル保護コード２２６）を共有する。そのため、コンテナで動作するアプリケーションは、カーネルを共有しない仮想マシン（ＶＭ）に比べて受ける影響が大きい。ＶＭＷａｒｅのようなハイパーバイザーは、ＶＭ間の拡張ページテーブルアクセスやページ共有アクセスの許可を典型的に推奨していないものの、プライベートクラウド環境では使用されることがある。前記攻撃を阻止する最も実用的な手立ては、内在する弱点を攻撃者がエクスプロイトし得る前、つまり、アプリケーションプロセスメモリにある。例えば、Ｇｏｏｇｌｅは、投機的実行時の間接分岐を標的としたキャッシュサイドチャネル攻撃の機会を閉じる「Ｒｅｔｐｏｌｉｎｅ」アプローチを採用した。
【００３６】
キャッシュサイドチャネル攻撃の種類の一つは、ラストレベルキャッシュに対するマルチコアサイドチャネル攻撃であるフラッシュ＆リロードである。この攻撃者プロセス１２０は、同じ物理メモリ（例えば、ｌｉｂｃ等）が複数のプロセスにマップされていることを悪用するものである。この攻撃は、まず、攻撃者プロセス１２０がＣＬＦＬＵＳＨのような非特権命令を用いてＬ１データキャッシュ１９５の内容を追い出すことで構成される。そして、攻撃者プロセス１２０は、フラッシュしたキャッシュラインに被害者プロセス１２２がアクセスするのを十分待つ。次に、攻撃者プロセス１２０は、フラッシュしたキャッシュラインに再度アクセスする。被害者プロセス１２２がそのキャッシュラインを使用した場合は、被害者プロセス１２２がそのキャッシュラインを使用しておらずキャッシュをメインメモリからロードする必要がある場合に比べて、ロードが（Ｌ２キャッシュ１９８に残っているので）早くなる。攻撃者プロセス２２０は、ＲＤＴＳＣ命令を用いて、フラッシュ動作の精密な時間計測を得る。これに並行して、攻撃者プロセス２２０は、被害者プロセス２２２で特定の重要な命令がトリガされたか否かを検出し得る。これにより、当該命令により処理されるデータを盗むことが攻撃者プロセス２２０にとって容易となる。
【００３７】
別の種類のキャッシュサイドチャネル攻撃は、ＶＭＷａｒｅがページテーブルアクセスを許可しない場合に用いられ得るプライム＆プローブである。この攻撃は、攻撃者プロセス１２０がＬ１データキャッシュ１９５にアクセスできること、さらに、大量のメモリをＶＭにマップ出来ることを条件とする。この攻撃は、攻撃者プロセス１２０が指定のデータ又は命令を用いて１つ以上のキャッシュ群を「プライム」することで構成される。そして、攻撃者プロセス１２０は、被害者プロセス１２２がＬ１データキャッシュ１９５を実行するのを待つ。被害者プロセス１２２が当該キャッシュを使用すると、攻撃者のコード又はデータの一部が被害者プロセス１２２によって取り除かれることになる。一定時間後、攻撃者プロセス１２０はプライム済みのＬ１データキャッシュ１９５をプローブすることで、被害者プロセス１２２がキャッシュラインを使用したか否かを確認する。この際、攻撃者プロセス１２０は、プライム対象の位置にあるデータが近隣レベルのキャッシュに由来するものであるのかメインメモリに由来するものであるのかを確認する。攻撃者プロセス１２０は、ＲＤＴＳＣ命令を用いて、キャッシュへのプローブ動作の精密な時間計測を得る。
【００３８】
カーネルページテーブルアイソレーション（ＫＰＴＩ）は、カーネルレベルアドレス空間ランダム化（ＫＡＳＬＲ）をバイパスするサイドチャネル攻撃からの保護を行う、ＫＡＩＳＥＲと称される保護技術を取り入れたものである。この保護は、ユーザモードの間はカーネルページを非マップ化する一方で、カーネルにモードが切り替わった際にはカーネルページを再度マップ化するということに基づいている。結果として、ユーザコードの投機失敗によるカーネルメモリへのアクセスが不可能となるため、Ｍｅｌｔｄｏｗｎが阻止される。本発明の実施形態は、ＣＰＵが被害者プロセス１２０を実行している最中の、ユーザ空間コードからカーネルコードへの、コンテキスト的に適切でないアプリケーションの移行を動的に検出し得る。なお、ＫＰＴＩにより、パフォーマンスの大幅なオーバーヘッドが生じ得ることが報告されている。ＫＰＴＩは、同じ特権モード内での（例えば、サンドボックス外のメモリにアクセスする等の）攻撃を阻止することができない。
【００３９】
別のサイドチャネル攻撃は、空のリターンスタックバッファ（ＲＳＢ）に対するものである。この問題の根本的原因は、ＲＳＢスタックが空になることである。次の少なくとも１つが、ＲＳＢスタックを空にし得る：過剰なＴＳＸアボート；ＷＲＭＳＲを０ｘ７９に書き込むこと（マイクロコードの更新）；０ｘ７Ａ（ＳＧＸ起動）；０ｘ８Ｃ〜０ｘ８Ｆに対するＷＲＭＳＲ／ＲＤＭＳＲ（ＳＧＸ起動エンクレーブパブリックキーハッシュ）；ＳＧＸ命令（ＥＮＣＬＳ，ＥＮＣＬＵ）及びＳＧＸ ＣＰＵＩＤ ｌｅａｆ；ＯＳコンテキストの過剰な切替え回数；ユーザ空間の過剰な例外回数；ｌｏｎｇｊｍｐ（）の過剰な呼出し；ならびにＣ６以上のスリープステートの過剰な呼出し。
【００４０】
前記投機的実行プロセッサでＲＳＢ「スタック」が空になると、ＲＥＴ命令は、間接分岐予測器の内容に基づいて投機的な推測を行い得る。この構造こそ、Ｒｅｔｐｏｌｉｎｅが阻止しようとするものである。つまり、「Ｒｅｔｐｏｌｉｎｅ」を中心とする防御が役に立たなくなることを意味する。次の条件下で、ＲＳＢが空になり得る：条件の一つは、コールスタックがＲＳＢの最小深度（１６）よりも深くなることである。このときにＲＥＴ命令を実行すると、ＲＳＢが空になり得る。これには、アボート時のＴＳＸトランザクション内におけるＣＡＬＬ命令及びＲＥＴ命令が含まれる。Ｉｎｔｅｌトランザクショナルシンクロナイゼーションエクステンション（ＴＳＸ）は、ハードウェアロック省略（ＨＬＥ）および制限付きトランザクションメモリ（ＲＴＭ）と称される、ｘ８６命令群の２種類の拡張の製品名である。ＲＴＭは、命令群に対し、ハードウェアトランザクションの一部として実行すべきコード領域を宣言するのに用いる幾つかの命令を追加する拡張である。別の条件として、間接分岐予測器バリア（ＩＢＰＢ）コマンドがＲＳＢを空にする可能性が挙げられる。なお、ＨＬＥは、特定の命令に追加されることが可能なプリフィックス群である。これらのプリフィックスは、当該プリフィックスを使用したコードが古いハードウェアでも動作するように後方互換性を有する。別の条件として、ＳＧＸ命令（ＥＮＣＬＳ、ＥＮＣＬＵ）およびＳＧＸ ＣＰＵＩＤ ｌｅａｆが挙げられる。さらなる別の条件は、ＯＳコンテキスト切替え、Ｃ＋＋例外、ｌｏｎｇｊｍｐのように、ＣＡＬＬ命令とＲＥＴ命令のバランスが崩れてＣＡＬＬ命令よりもＲＥＴ命令が多くなることである。さらなる別の条件として、Ｃ６以上のスリープステート（例えば、ＭＷＡＩＴ等）に移行することでＲＳＢが空になる可能性が挙げられる。
【００４１】
コールスタックの深度は実行時まで分からない数多くの要因に左右され得るので、コールスタックにソフトウェアで対処することは困難である。しかし、深いコールスタックのエクスプロイトでは、従来の分岐先インジェクション（Ｓｐｅｃｔｒｅ ２型）攻撃よりも遥かに徹底的にＣＰＵ及びプログラム状態の挙動を制御及び予測することが要求されると考えられる。攻撃者プロセスの目的は、ＲＳＢスタックを空にし、それ以降の投機的推測が間接分岐予測器に基づいて試みられるようにすることである。投機的実行エンジンが間接分岐予測器を使用するようになると、Ｓｐｅｃｔｒｅ ２攻撃が可能となる。
【００４２】
（Ｓｐｅｃｔｒｅ／Ｍｅｌｔｄｏｗｎ／Ｆｏｒｅｓｈａｄｏｗのエクスプロイトの阻止）
【００４３】
以下では、Ｓｐｅｃｔｒｅ／Ｍｅｌｔｄｏｗｎの様々な攻撃型、さらには、どのようにしてこれらの攻撃型によるエクスプロイトが本開示の実施形態により阻止されるのかについて説明する。
【００４４】
（Ｓｐｅｃｔｒｅ １型（ＣＶＥ−２０１７−５７５３））
【００４５】
Ｓｐｅｃｔｒｅ １型（Ｓｐｅｃｔｒｅ １）は、正当に実行されるコードであるにもかかわらず、攻撃者プロセスにより、通常露呈することのない情報を攻撃者へと露呈させることが可能になってしまう、マイクロプロセッサの脆弱性である。この攻撃型のさらなる詳細については、Paul Kocher達の“Spectre Attacks: Exploiting Speculative Execution,” arxiv:1801.01203 (https://arxiv.org/abs/1801.01203), 2018を参照されたい。
【００４６】
Ｓｐｅｃｔｒｅ １型は、ロードの境界チェックが一時的にバイパスされて、マイクロアーキテクチャのキャッシュ状態が変更されることにより、サイドチャネル時間計測解析を介して情報が漏洩することに起因するものである。Ｓｐｅｃｔｒｅ １型は、投機的実行ウィンドウ内において境界外メモリアクセスを可能にしてしまう、Ｉｎｔｅｌアーキテクチャの設計欠陥を悪用したものである。その間、分岐予測器１６３の条件分岐予測は、境界チェックを一時的にバイパスしメモリ上の任意アドレスにアクセスできる状態となる。このアドレスの内容は、プロセッサが予測失敗に追い付いてキャッシュからのその状態をフラッシュするまでの間、Ｌ１データキャッシュ１９５に保存される。このウィンドウ内では、サイドチャネル攻撃により、この情報をキャッシュ１９５から盗むことが可能となる。任意メモリへの境界外アクセスのこのサイクルがループ実行されることにより、キャッシュ１９５の内容（社会保障番号、クレジットカード番号、その他の極秘情報のような秘匿データ）が盗み出される。
【００４７】
境界チェックバイパスを用いた攻撃では、攻撃者プロセス（例えば、図１Ｂの攻撃者プロセス１２０等）がマイクロプロセッサの投機的実行挙動を利用し、所与のコードにより、意図されている以上の情報を流出させる。この攻撃では、コードのうちの、入力が境界内であるか否かを調べるのに用いられる「混乱した使節」の問題が起こりうるセグメントを、攻撃者プロセスが特定する必要がある。
【００４８】
If (input < array_size)                     //第１行//
val = data[array[input]];               //第２行//
【００４９】
上記のコードには、入力が境界外ではないことを確認する入力正当性検査（第１行）が設けられている。このようなコードセグメントを特定した攻撃者プロセスは、次に、プロセッサの分岐予測器１６３を訓練することにより、境界チェックが真になる可能性が高いと当該分岐予測器１６３が予測するように仕向け得る。これは、そのコードを、「ｉｎｐｕｔ（入力）」パラメータに有効な値を用いて何度も呼び出すことによって行われる。分岐予測器１６３を訓練した後、攻撃者プロセスはそれと同じコードを、「ｉｎｐｕｔ」パラメータに境界外の悪意ある値を用いて且つａｒｒａｙ＿ｓｉｚｅの値がキャッシュに格納されていない状態で呼び出し得る。呼出し時に分岐予測器１６３は「ｉｆ」命令文が（これまでと同じく）真であるだろうと予測するため、“ｖａｌ＝ｄａｔａ［ａｒｒａｙ［ｉｎｐｕｔ］］；”は、「ｉｎｐｕｔパラメータ」に悪意ある値が用いられたまま投機的に実行される。すなわち、プロセッサは、「ｉｎｐｕｔ」パラメータに有効でない値を用いて間違ったコード経路を実行するよう仕向けられる。そして、プロセッサは、「ｉｎｐｕｔ」パラメータに対する値として、攻撃者が操作したａｒｒａｙ［ｉｎｐｕｔ］により与えられるアドレスのデータをキャッシュにロードする。
【００５０】
ａｒｒａｙ＿ｓｉｚｅの値がキャッシュに格納されていないことで、プロセッサが“ｖａｌ＝ｄａｔａ［ａｒｒａｙ［ｉｎｐｕｔ］］；”を開始した時点から、ａｒｒａｙ＿ｓｉｚｅの値が返されてプロセッサの投機的推測が正確でなかったことが判明するまでの間、遅延が生じることになる。こうなると、プロセッサは、投機的に誤実行した命令（脆弱性により一時的命令が呼び出されてしまう）をキャッシュ１９５から廃棄するが、キャッシュ状態の変化は元に戻らされない。元に戻されていないキャッシュ状態を検出することで、攻撃者プロセスは、被害者のメモリのバイトを明らかにすることが可能となる。攻撃者プロセスは、この手順を繰返し用いることにより、同じ又は別の仮想マシン上の他のプロセスが使用するメモリの大部分を読み取ることが可能になる。
【００５１】
本発明の実施形態は、この攻撃型に対して２種類の異なる独立した対処策を行使する。これらの対処アプローチでは、アプリケーションに対する変更や、被害者プロセス１２２が使うカーネルやマイクロコードに対する破壊的変更が必要とならない。これらの対処アプローチは、上記のコードの第１行により生成される基本ブロックと第２行により生成される基本ブロックとの間にＦＥＮＣＥ（ｘ８６）命令やＣＳＤＢ（ＡＲＭ）命令を配置することにより、被害者プロセス（例えば、図１Ｂの被害者プロセス１２２等）を保護する。結果として、これらの２行は、一つのブロックと見なされるので互いに独立して実行出来ないようになる。実施形態は、デベロッパーが何ら負担を負わなくてよいように、ＦＥＮＣＥ命令又はＣＳＤＢ命令を動的に適用する。また、これらの対処アプローチは、オブジェクト形態のみで存在するサードパーティコードについても問題対処を支援する。
【００５２】
この攻撃型に対する、本発明の（被害者プロセスを保護する）この第１の対処アプローチを、図１Ｃの方法に示す。図１Ｃの方法１９１は、アプリケーション空間と投機的実行エンジンのＣＰＵとの間に監視命令を挿入する（５０１）。方法１９１は、アプリケーションの実行中に、ｉｆ−ｔｈｅｎコードブロックなどのリピート処理を実行するアプリケーション命令のセットを当該監視命令を用いて解析し特定する（５０２）。命令のこの特定のセットは、セキュリティ技術導入ガイド（ＳＴＩＧ）やユーザ設定に基づくルールベースのポリシーを適用することで設定され得る。実施形態は、コード内での位置を、コンパイラベースのアプローチ又は動的テイント解析ベースのアプローチを用いて特定した。例えば、Schwartz達の“All You Ever Wanted to Know about Dynamic Taint Analysis and Forward Symbolic Execution (but Might Have Been Afraid to Ask),” SP ’10 Proceedings of the 2010 IEEE Symposium on Security and Privacy, pages 317-331, 2010等を参照されたい。方法１９１は、前記監視命令を介してメモリバリア命令を命令の前記セットに追加する（５０３）。当該メモリバリア命令は、当該メモリバリア命令の前後に発行されるメモリ処理を順序どおり実行する制約を投機的実行エンジンに履行させる、ＦＥＮＣＥ（ｘ８６）命令、ＣＳＤＢ（ＡＲＭ）命令などのメモリバリア命令である。このようなバリア命令は、投機的実行時に境界外メモリにアクセスする命令を攻撃者が使用するのを阻止する。方法１９１は、前記メモリバリア命令を追加した状態で命令の前記セットを（投機的実行エンジンにより）実行する（５０４）。
【００５３】
この攻撃型に対する、本発明の第２の対処アプローチでは、実施形態が、攻撃者プロセス（サイドチャネル攻撃プロセス）を確実に検出し不能にするための手順を踏む。この攻撃型に対する、本発明の（被害者プロセスを保護する）この第２の対処アプローチを、図１Ｄの方法１９２に示す。方法１９２は、子プロセスを例えば当該子プロセスの実行開始時等にインターセプトする（５０６）。当該方法は、インターセプトしたプロセスのコード（実行ファイルおよびライブラリ）について、投機的実行で生じる脆弱性のエクスプロイト（当該エクスプロイトのシグネチャ）に関する動作を行うコードを有しているか否かを、静的又は動的に検査する（５０７）。このような動作（例えば、既知のカバートサイドチャネル等）は、セキュリティ技術導入ガイド（ＳＴＩＧ）やユーザ設定に基づいて設定されるルールベースのポリシーを適用することで特定され得る。言い換えれば、ＯＳやユーザが意図的にインストールした既知の他のパッケージの一部でない、あらゆる実行ファイル、ライブラリ又はその組合せが終了させられる。例えば、サイドチャネル攻撃は、ＣＬＦＬＵＳＨコード命令やＭＣＲコード命令やＲＤＴＳＣコード命令を繰返し実行するものであり得る。ポリシーは、このような動作の有無を検査するように設定かつ適用され得る。方法１９１は、このようなコード命令を含むプロセスを、攻撃者プロセスの可能性があるとして特定する（５０８）。
【００５４】
方法１９２は、投機的実行エンジンのデータキャッシュを監視する命令を挿入する（５０９）。方法１９２は、当該監視命令を用いて、攻撃者プロセスの可能性がある前記プロセスの動作を、リードタイムスタンプ技術を適用して検査する。この技術において、方法１９２は、実行中のコードの所与の変数のキャッシュラインであって、他のキャッシュラインよりも高速で前記特定したプロセスにより読み出されるキャッシュラインを、当該キャッシュラインに関するタイムスタンプを解析することに基づいて前記監視命令を用いて探し出す（５１０）。キャッシュラインがこのように高速で読み出されるということは、当該キャッシュラインのデータが現在データキャッシュに存在していることを示唆する。方法１９２は、特定した前記プロセスによるキャッシュラインのこのような読出しのカウントを保持する（５１１）。当該カウントが閾値を上回ると、方法１９２は、攻撃者プロセスの終了、隔離領域への攻撃者プロセスの移動、プロセスファイルの正当なコピーの復元、プロセスファイルを修正するための少なくとも１つのパッチのロード、プロセスが悪意あるものであることのユーザへの報告などといった保護措置を実施する（５１２）。
【００５５】
この攻撃型に対する、本発明の（被害者プロセスを保護する）第２の対処アプローチには、さらに、図１Ｆの方法１９４が含まれる。方法１９４は、子プロセスを例えば当該子プロセスの実行開始時等にインターセプトする（５３０）。当該方法は、インターセプトしたプロセスのプロセスファイルについて、投機的実行で生じる脆弱性のエクスプロイト（当該エクスプロイトのシグネチャ）に関する動作を行うコードを有しているか否かを、静的又は動的に検査する（５３１）。このような動作（例えば、既知のカバートサイドチャネル等）は、セキュリティ技術導入ガイド（ＳＴＩＧ）やユーザ設定に基づいて設定されるルールベースのポリシーを適用することで特定され得る。例えば、サイドチャネル攻撃は、ＣＬＦＬＵＳＨコード命令やＭＣＲコード命令やＲＤＴＳＣコード命令を繰返し実行するものであり得る。ポリシーは、このような動作の有無を検査するように設定かつ適用され得る。方法１９４は、このようなコード命令を含むプロセスを、攻撃者プロセスの可能性があるとして特定する（５３２）。
【００５６】
方法１９４は、特定した前記プロセスの処理を監視する命令を挿入する（５３３）。方法１９４は、当該監視命令を用いて、前記シグネチャ動作が実行された回数を検出しカウントする（５３４）。また、方法１９４は、当該カウントを決定するのに、前記シグネチャ動作が実行される頻度、順番等も考慮に入れ得る。前記カウントが閾値を上回ると、方法１９４は、攻撃者プロセスの終了、隔離領域への攻撃者プロセスの移動、プロセスファイルの正当なコピーの復元、プロセスファイルを修正するための少なくとも１つのパッチのロード、プロセスが悪意あるものであることのユーザへの報告などといった保護措置を実施する（５３５）。
【００５７】
図１Ｆの方法１９４は、さらに、特定した前記プロセスによる、システム／カーネルで使用されるレジスタ（例えば、Ｒｉｎｇ０等）を用いて特権レベル命令を実行しようとするあらゆる試みを監視する。これらのレジスタには、次のシステムレジスタ（Ｒｉｎｇ０）が含まれる：８個の３２ビットのプロセッサ制御レジスタＣＲ０，ＣＲ１，ＣＲ２，ＣＲ３，ＣＲ４，ＣＲ５，ＣＲ６，ＣＲ７；マシンステータスワード（ＭＳＷ）と称される、ＣＲ０の下位１６ビット；４個の１６ビットのテーブルレジスタＧＤＴＲ，ＩＤＴＲ，ＬＤＴＲ，ＴＲ；８個の３２ビットのデバッグレジスタＤＲ０，ＤＲ１，ＤＲ２，ＤＲ３，ＤＲ４，ＤＲ５，ＤＲ６，ＤＲ７；５個のテストレジスタＴＲ３，ＴＲ４，ＴＲ５，ＴＲ６，ＴＲ７；メモリタイプレンジレジスタ；マシン固有レジスタ；およびマシンチェックレジスタ。前記特権レベル命令には、次のものが含まれる：ＬＧＤＴ（ＧＤＴＲへのＧＤＴのアドレスのロード）；ＬＬＤＴ（ＬＤＴＲへのＬＤＴのアドレスのロード）；ＬＴＲ（ＴＲへのタスクレジスタのロード）；ＭＯＶ Ｃｏｎｔｒｏｌ Ｒｅｇｉｓｔｅｒ（データをコピーして制御レジスタに記憶する）；ＬＭＳＷ（新たなマシンステータスワードをロードする）；ＣＬＴＳ（制御レジスタＣＲ０のタスクスイッチフラグをクリアする）；ＭＯＶ Ｄｅｂｕｇ Ｒｅｇｉｓｔｅｒ（データをコピーしてデバッグレジスタに記憶する）；ＩＮＶＤ（キャッシュを書戻しなしで無効化する）；ＩＮＶＬＰＧ（ＴＬＢエントリを無効化する）；ＷＢＩＮＶＤ（キャッシュを書戻しありで無効化する）；ＨＬＴ（プロセッサをＨａｌｔ状態にする）；ＲＤＭＳＲ（モデル固有レジスタ（ＭＳＲ）を読み取る）；ＷＲＭＳＲ（モデル固有レジスタ（ＭＳＲ）に書き込む）；ＲＤＰＭＣ（パフォーマンス監視カウンタを読み取る）；およびＲＤＴＳＣ（タイムスタンプカウンタを読み取る）。特定した前記プロセスが上記のいずれかのレジスタを用いて上記のいずれかの特権レベル命令を実行していると検出すると、方法１９４は、攻撃者プロセスの終了、隔離領域への攻撃者プロセスの移動、プロセスファイルの正当なコピーの復元、プロセスファイルを修正するための少なくとも１つのパッチのロード、プロセスが悪意あるものであることのユーザへの報告などといった保護措置を実施する。
【００５８】
（Ｓｐｅｃｔｒｅ ２型（ＣＶＥ−２０１７−５７１５））
【００５９】
Ｓｐｅｃｔｒｅ ２型（Ｓｐｅｃｔｒｅ ２）は、正当に実行されるコードであるにもかかわらず、通常露呈することのない情報を攻撃者へと露呈させることが可能になってしまう、マイクロプロセッサの脆弱性である。この攻撃型のさらなる詳細については、Paul Kocher達の“Spectre Attacks: Exploiting Speculative Execution,” arxiv:1801.01203 (https://arxiv.org/abs/1801.01203), 2018を参照されたい。Ｓｐｅｃｔｒｅ ２は、間違った分岐先が一時的に選択されて、マイクロアーキテクチャのキャッシュ状態が変更されることにより、サイドチャネル時間計測解析を介して情報が漏洩することに起因するものである。この攻撃の実施に必要なのは投機的実行だけでよく、プロセッサは、命令を順序どおりに実行することが可能である。
【００６０】
この第２の攻撃型は、投機的実行エンジンがプロセス間のコード又はデータを十分に隔絶しないことに起因した、間接分岐汚染として知られる手法を利用し得る。すなわち、分岐予測器１６３がセキュリティ領域間で学習を区別しないことを利用することで、攻撃者プロセスは、被害者プロセスの分岐予測アルゴリズムを誤訓練することが可能である。間接分岐命令の分岐先アドレスが（キャッシュミスにより）メモリからの読み取りに遅延が生じ、かつ、分岐予測器１６３が既に誤訓練済みである場合には、攻撃者プロセスが、投機的実行サイクル時に、被害者プロセスの分岐先として特定の分岐先を選択することができる。そして、このエクスプロイトは、被害者プロセスのメモリにリターン指向プログラミング（ＲＯＰ）ガジェットを適用することで、秘密情報を漏洩させることが可能である。この攻撃型の攻撃では、攻撃者プロセスが分岐先インジェクションでマイクロプロセッサの投機的実行挙動を利用することにより、所与のコードによって、意図されている以上の情報が流出する。攻撃者プロセスは、悪意あるコードをマイクロプロセッサの間接分岐が投機的に実行するように仕向ける。当該悪意あるコードにより、マイクロアーキテクチャの状態は、攻撃者プロセスが当該状態を悪用することでデータ値を推測することのできるような状態となる。
【００６１】
条件直接分岐で投機的に実行される可能性がある経路は、２つだけである。対象となる分岐が成立するか又はその分岐実行が「非成立」に終わることで、後続の命令へと実行が移り得る。間接分岐では、直接分岐と異なり、マイクロプロセッサが極めて広範囲の分岐先を投機的に実行し得る。この攻撃は、直接分岐にコードのうちの所与のセグメントを投機的に実行させることで行われる。攻撃者は、Ｓｐｅｃｔｒｅ １型に効果的に繋がるようなコードを巧妙に選定することで、被害者プロセスのメモリ空間から秘匿のデータを推測することが可能となる。
【００６２】
以下の例のようなＣ＋＋の簡単なインヘリタンスについて考える：
【００６３】
class Shape {
public:
virtual void Draw() = 0;
};
class Circle : public Shape {
public:
void Draw() override { …}
};
【００６４】
Ｓｈａｐｅは基底クラスであり、Ｃｉｒｃｌｅは派生クラスである。次に、以下のコードセグメントについて考える。
【００６５】
Shape* obj = new Circle;
Obj->Draw();
【００６６】
上記の例のような典型的なポリモルフィックコードでは、仮想関数Ｄｒａｗ（）の対象アドレスがコンパイル時に決まらず、実行時に解決しなければならない間接分岐となり得る。実行時になってから、適合する関数を見つけ出すように動的ルックアップが実行される。これが行われている間、マイクロプロセッサは、対象アドレスを予想（予測）し、予想した対象アドレスで即座にコードを投機的に実行し始める。攻撃者プロセスは、Ｓｐｅｃｔｒｅ １型に繋がるコードをマイクロプロセッサに間接分岐予測器の操作次第で投機的に実行させることが可能な、上記の例のようなコードを見つけ出す必要がある。そして、攻撃者プロセスは、Ｓｐｅｃｔｒｅ 1型を用いることで、被害者のメモリ空間から秘匿のデータを推測することが可能となる。
【００６７】
この攻撃型に対する、本発明の（被害者プロセスを保護する）この第１の対処アプローチを、図１Ｅの方法１９３に示す。図１Ｅの方法１９３は、アプリケーション空間と投機的実行エンジンのＣＰＵとの間に監視命令を挿入する（５２０）。方法１９３は、アプリケーションの実行中に、不正確な分岐予測を算出するか又は投機的予測に失敗して遅延を発生させるよう誤訓練されているため間接分岐命令のエクスプロイトを可能にしてしまう分岐予測器を、前記監視命令を用いて解析し検出する（５２１）。当該誤訓練された分岐予測器は、セキュリティ技術導入ガイド（ＳＴＩＧ）やユーザ設定に基づくルールベースのポリシーを適用することで検出され得る。実施形態は、コード内での位置を、コンパイラベースのアプローチ又は動的テイント解析ベースのアプローチを用いて特定した。例えば、Schwartz達の“All You Ever Wanted to Know about Dynamic Taint Analysis and Forward Symbolic Execution (but Might Have Been Afraid to Ask),” SP ’10 Proceedings of the 2010 IEEE Symposium on Security and Privacy, pages 317-331, 2010等を参照されたい。方法１９３は、前記誤訓練された分岐予測器により処理される間接分岐命令を前記監視命令を用いて特定する（５２２）。方法１９３は、投機的実行ウィンドウ内で間接分岐命令が「バウンド」状に実行されるようになるｒｅｔｕｒｎ ｔｒａｍｐｏｌｉｎｅ（「Ｒｅｔｐｏｌｉｎｅ」）手法を用い得る。また、Ｒｅｔｐｏｌｉｎｅ手法は、分岐予測器の性質を利用し、ＲＥＴ命令の実行時に当該予測器に、分岐先バッファ（ＢＴＢ）ではなく攻撃者によって汚染され得ないリターンスタックバッファ（ＲＳＢ）を使用させるようにする。
【００６８】
方法１９３は、前記監視命令により、間接分岐命令（ＪＭＰ命令）を直接分岐命令（ＣＡＬＬ命令）に変更する（５２３）。これは、動的バイナリ計装技術を用いることによって達成され得る。方法１９３は、変更された分岐命令（間接分岐命令の代わりに直接分岐命令）を実行する（５２４）。方法１９３は、さらに、分岐予測器を再訓練する（５２５）。これを行うために、方法１９３は、誤訓練された分岐予測器と並行して正確な分岐予測を算出し、当該正確な予測を用いて当該分岐予測器の予測アルゴリズムを再訓練する。
【００６９】
この攻撃型に対する、本発明の第２の対処アプローチは、（前述した）図１Ｄの方法１９２や図１Ｆの方法１９４を用いることで、攻撃者プロセスが投機的実行エンジンの上記のような脆弱性をエクスプロイトするのを検出し阻止する。
【００７０】
（Ｍｅｌｔｄｏｗｎ ３型（ＣＶＥ−２０１７−５７５４））
【００７１】
Ｍｅｌｔｄｏｗｎ（３型）は、アクセスが許可されていない情報をロードするコードをマイクロプロセッサに投機的に順序外で実行させて、最終的にマイクロアーキテクチャのキャッシュ状態が変化した際に、サイドチャネル時間計測解析を介して情報を漏洩させることにより、マイクロプロセッサが提供するあらゆるメモリ隔絶メカニズムを攻撃者が打ち破るのを可能にしてしまう、マイクロプロセッサの脆弱性である。この攻撃型のさらなる情報については、Lipp達の“Meltdown: Reading Kernel Memory from User Space,” SEC ’18 Proceedings of the 27th USENIX Conference on Security Symposium, pages 973-990, 2018を参照されたい。
【００７２】
Ｍｅｌｔｄｏｗｎは、Ｓｐｅｃｔｒｅの双方の攻撃型とは異なり、被害者プロセスを必要としない。Ｍｅｌｔｄｏｗｎは、投機的実行時にページテーブルを悪用可能な状態にする、設計上のさらなる欠陥を使ったものである。この投機的実行ウィンドウにおいて、ユーザ空間コードは、特権アクセスチェックなしで、カーネルメモリへの完全なアクセスを得ることができる。結果として、攻撃者プロセスは、特権データにアクセスしてこれをキャッシュにロードした後、サイドチャネルメカニズムを用いてこれを盗み出すことができる。この過程を繰り返すことにより、攻撃者は、最終的にカーネルメモリ全体をマップすることが可能となる。カーネルメモリをマップしてしまえば、秘匿又は極秘のデータを盗み出すのに利用可能なＲＯＰガジェットを簡単に見つけ出すことができる。攻撃者プロセスは、不正なデータキャッシュロード攻撃時に、マイクロプロセッサの投機的な順序外実行挙動を利用する。これにより、所与のコードによって、意図されている以上の情報が流出する。具体的に述べると、Ｍｅｌｔｄｏｗｎは、各プロセス（被害者プロセスおよび攻撃者プロセス）の仮想メモリを管理するうえでオペレーティングシステムが基本前提としているメモリの隔絶を打ち壊す。悪意ある人物は、カーネルから極秘情報を盗み出すことでメモリのレイアウトのマッピングを行い、これを（例えば、ページテーブルを悪用する等の）なおいっそう悪質な攻撃を立ち上げるための下準備に用いる。
【００７３】
次のコード：“ｃｈａｒ  ｖａｌ＝＊（ｃｈａｒ＊）０ｘＡＡＡＡＡ；”について考える。
【００７４】
この行が実行されると、アクセス制限違反によるセグメンテーション違反が発生するはずである。しかし、マイクロプロセッサは、（必要に応じてＴＬＢルックアップやページテーブルウォークを含め）メモリ参照が解決されているあいだ後続の一時的命令を引き続き順序外で実行し得る。すなわち、マイクロプロセッサは、解決が完了するのを待たない。Ｍｅｌｔｄｏｗｎの影響を受けるプロセッサでは、データ参照が既存の特権メモリ領域に対するものである場合にも投機的実行が発生する。すなわち、後続の投機的命令において、上記の“ｖａｌ”の投機的利用が可能となる。
例：以下の（簡略化）コードについて考える。
【００７５】
char probeTable[256] = {0};    /*処理１*/
/* ... */
char val = *(char *)0xAAAAA;  /*処理２*/
char temp = probeTable[val];   /*処理３*/
【００７６】
処理２が実行されたときに何が起こるのかについて考える。マイクロプロセッサは、ロードを実行する。アドレス０ｘＡＡＡＡＡがＯＳカーネルデータを指し示している場合、アクセスは許可されない。しかし、０ｘＡＡＡＡＡがＯＳカーネルデータを指し示しているか否かは、ページテーブルを確認した後でしか分からない。この確認が行われている間、マイクロプロセッサは、処理２のメモリロードがリタイア段階に到達しない限り処理３を投機的に実行する。処理２がリタイアされると、例外が発生して投機的実行の結果が廃棄される。しかし、ｐｒｏｂｅＴａｂｌｅがキャッシュに格納されていない場合、処理３のコードはキャッシュミスを引き起こし、マイクロプロセッサがメインメモリからその値をわざわざ取り出してくることになる。攻撃者プロセスは、ｐｒｏｂｅＴａｂｌｅ［ｉ］の各要素を読み取る時間を計測することにより、どの要素が現在キャッシュに格納されているのかを判断することが可能になる。ここから、攻撃者プロセスは“ｖａｌ”の値を推測することができる。そして、ハッカーは、このアプローチを繰返し適用することにより、カーネルに関連付けられていると思われるメモリの大部分を読み取ることが可能となる。
【００７７】
マイクロコードから例外の命令がリタイアさせられることになる攻撃例では、攻撃者が親プロセスを用いて子プロセスを生成し、当該子プロセスに一時的命令のセットを実行させる。例外がリタイアさせられた際には、子プロセスが未処理の例外を引き取ったのち終了するが、終了するまでの間に特権カーネルデータがキャッシュへと引き出される。親プロセスは、この露呈したデータを、サイドチャネル攻撃を介して盗み出す。この過程は、カーネルメモリの全体がマップされるまで繰り返され得る。子プロセスの生成及び終了のこのサイクルは、投機的実行ウィンドウ外でも観測することができる。保護アドレスにアクセスしようと試みたことに起因する例外で子プロセスが繰返し終了した場合、ポリシーに基づいて親プロセスが終了され得る。
【００７８】
この攻撃型に対する、本発明の対処アプローチは、（前述した）図１Ｄの方法１９２や図１Ｆの方法１９４を用いることで、攻撃者プロセスが投機的実行エンジンの上記のような脆弱性をエクスプロイトするのを検出し阻止する。
【００７９】
（Ｓｐｅｃｔｒｅ １の亜種１（ＣＶＥ−２０１８−３６３９））
【００８０】
Ｓｐｅｃｔｒｅ １のこの亜種（Ｓｐｅｃｔｒｅ １．１）は、ストアの境界チェックをバイパスする（ＢＣＢＳ）。その名が示すとおり、パフォーマンスを向上させるためにプロセッサは、プログラムの今後の実行フローについて推測し（Ｌｉｎｕｘ（登録商標）カーネルはこの目的のための特殊なプログラムと見なすことができる）、投機的に推測した経路が正確又は不正確であるかが確定するまで、プログラム命令を当該推測した経路に沿って実行する。推測した経路が正確であった場合には、パフォーマンスの向上が得られる。推測した経路が不正確であった場合には、投機的処理から得られた全結果を注意深く辿り、マイクロプロセッサを正確な経路へと通常外から分からないかたちで戻す必要がある。この亜種のさらなる情報については、Vladimir Kiriansky達の“Speculative Buffer Overflows:  Attacks and Defenses,” arXiv:1807.03757 (https://arxiv.org/abs/1807.03757), 2018を参照されたい。
【００８１】
例について考える：
if (x < lenb)                 //第１行//
return a[b[x] * 512];   //第２行//
if (y < lenc)                 //第３行//
c[y] = z;              //第４行//
【００８２】
投機的実行時のプロセッサは、上記の第３行の境界チェックを無視し得る。これにより、攻撃者は、任意書換えの全権を得る。これは投機的書換えに過ぎず、アーキテクチャ的に明確な影響を残さない。しかし、投機的書換えでも、サイドチャネルを介した情報暴露に繋がり得る。簡単な概念実証攻撃として、“ｃ［ｙ］”がスタックのリターンアドレスを示し、“ｚ”が第２行のアドレスを含んでいると仮定する。関数リターンの投機的実行時には、前述したように実行が転送ガジェットに再移行する。なお、Ｓｐｅｃｔｒｅ １に対処するために第１行と第２行との間にフェンス命令（例えば、ＬＦＥＮＣＥ、ＣＳＤＢ等）が追加されていたとしても、攻撃者プロセスは単に“ｚ”を調節するだけで「フェンスを飛び越える」ことができる。また、リターン指向プログラミング（ＲＯＰ）手法を用いることにより、代替的な攻撃ペイロードを構築することも可能である。投機的データ攻撃では、攻撃者プロセスが、将来的なＳｐｅｃｔｒｅ １．０パッチで用いられるデータを（一時的に）書き換えることが可能である。しかも、パフォーマンスパッチ対処では、フェンス命令ではなくデータ依存型の切捨て処理（例えば、“ｘ＆＝（ｌｅｎｂ−１）”等）が使われる。攻撃者は、配列“ｂ”のベース（第２行）又はその長さ“ｌｅｎｂ”（第１行）を書き換えることにより、任意読取りアクセスを再び獲得する。
【００８３】
本発明の実施形態は、この攻撃型に対して２種類の異なる独立した対処策を行使する。この攻撃型に対する、本発明の第１の対処アプローチは、（前述した）図１Ｃの方法１９１を用いて被害者プロセスを保護する。（Ｓｐｅｃｔｒｅ １型に関して前述したように）第１行と第２行との間にメモリバリア命令（ＦＥＮＣＥ又はＣＳＤＢ命令）が設けられている場合には、第４行が第２行へとジャンプすると、本来の分岐ではなくＦＥＮＣＥが設けられた領域に制御が実質上転送されることになる。被害者プロセスがリアルタイムで実行されている最中、方法１９１は、第４行からの移動がＦＥＮＣＥ又はＣＳＤＢ命令へのジャンプを生じたことを検出する。これは、Ｓｐｅｃｒｅ １．１型の攻撃の兆候である。また、方法１９１は、前記監視命令を用いて、メモリバリア命令へのこのジャンプを攻撃の可能性があるとして検出しユーザに報告し得る。
【００８４】
この攻撃型に対する、本発明の第２の対処アプローチは、（前述した）図１Ｄの方法１９２や図１Ｆの方法１９４を用いることで、攻撃者プロセスが投機的実行エンジンの上記のような脆弱性をエクスプロイトするのを検出し阻止する。
【００８５】
（Ｓｐｅｃｔｒｅ １の亜種２（ＣＶＥ−２０１８−３６３９））
【００８６】
Ｍｅｌｔｄｏｗｎにおいて、攻撃者プロセスは、ページテーブルエントリ（ＰＴＥ）のユーザ保護フラグ／スーパーバイザー保護フラグのレイジー（遅延）施行を利用する。同じメカニズムを用いて、読取り／書込みＰＴＥフラグをバイパスすること（読取り専用保護バイパス）も可能である。Ｓｐｅｃｔｒｅのこの攻撃型（Ｓｐｅｃｔｒｅ １．２）は、Ｍｅｌｔｄｏｗｎと同じくレイジーＰＴＥ施行に依存して行われる、Ｓｐｅｃｔｒｅ １．１の副次的な攻撃型である。Ｓｐｅｃｔｒｅ １．２攻撃では、投機的ストアにより、読取り専用データ、コードポインタおよびコードメタデータ（ｖｔａｂｌｅやＧＯＴ／潜在連合テスト（ＩＡＴ）や制御フロー緩和メタデータを含む）を書き換えることができる。結果として、ハードウェアによる読取り専用メモリ強制に依存して行われるサンドボックスが役に立たなくなる。この亜種のさらなる情報については、Vladimir Kiriansky及びCarl Waldspurgerの“Speculative Buffer Overflows:  Attacks and Defenses,” arXiv:1807.03757  (https://arxiv.org/abs/1807.03757), 2018を参照されたい。
【００８７】
本発明の実施形態は、この攻撃型に対して２種類の異なる独立した対処策を行使する。この攻撃型に対する、本発明の第１の対処アプローチは、（前述した）図１Ｃの方法１９１を用いて被害者プロセスを保護する。（Ｓｐｅｃｔｒｅ １型に関して前述したように）第１行と第２行との間にメモリバリア命令（ＦＥＮＣＥ又はＣＳＤＢ命令）が設けられている場合には、第４行が第２行へとジャンプすると、本来の分岐ではなくＦＥＮＣＥが設けられた領域に制御が実質上転送されることになる。被害者プロセスがリアルタイムで実行されている最中、方法１９１は、第４行からの移動がＦＥＮＣＥ又はＣＳＤＢ命令へのジャンプを生じたことを検出する。これは、Ｓｐｅｃｒｅ １．１型の攻撃の兆候である。また、方法１９１は、前記監視命令を用いて、メモリバリア命令へのこのジャンプを攻撃の可能性があるとして検出しユーザに報告し得る。
【００８８】
この攻撃型に対する、本発明の第２の対処アプローチは、（前述した）図１Ｄの方法１９２や図１Ｆの方法１９４を用いることで、攻撃者プロセスが投機的実行エンジンの上記のような脆弱性をエクスプロイトするのを検出し阻止する。
【００８９】
（Ｓｐｅｃｔｒｅ ３ａ型（ＣＶＥ−２０１８−３６４０））
【００９０】
Variant 3a “Cache Speculation Side-channels” whitepaper, version 1.3, dated May 2018に記載されている不正なシステムレジスタ読取りは、投機的実行手法とサイドチャネルキャッシュ手法の両方を用いて、攻撃者のプロセッサがアーキテクチャ上アクセスすることのできない、所与のプロセッサシステムレジスタの状態の値を推測するというものである。不正なシステムレジスタ読取りは、システムレジスタの状態を読み取る命令を、当該状態の読取りがアーキテクチャ的に許可されていないモード又は特権レベルでプロセッサが動作している際に投機的に実行するものである。この攻撃で値を推測することが可能なシステムレジスタのセットは、その時々の実施によって異なる。これらの処理は、アーキテクチャ的にフォールトになる。あるいは、当該処理を実行する仮想マシン（ＶＭ）が終了させられることになる。しかし、場合によっては、当該処理によってデータが返されることがあり、投機的実行経路上の後続の命令が当該データにアクセスすることが可能となる。そして、当該後続の命令がサイドチャネルを生成することにより、システムレジスタの状態を推測することが可能になる。この攻撃型のさらなる情報については、“Intel Analysis of Speculative Execution Side Channels,” White Paper, Revision 3, Intel, Document Number: 336983-003, May 2018を参照されたい。
【００９１】
この攻撃型に対する、本発明の対処アプローチは、（前述した）図１Ｄの方法１９２や図１Ｆの方法１９４を用いることで、攻撃者プロセスが投機的実行エンジンの上記のような脆弱性をエクスプロイトするのを検出し阻止する。
【００９２】
（Ｓｐｅｃｔｒｅ ４型）
【００９３】
Ｍｉｃｒｏｓｏｆｔは、投機的実行のサイドチャネルハードウェア脆弱性への対処に関するブログ記事（https://blogs.technet.microsoft.com/srd/2018/05/21/analysis-and-mitigation-of-speculative-store-bypass-cve-2018-3639/）にて、投機的実行のサイドチャネルの条件となり得る３種類の投機的プリミティブについて説明している。これら３種類のプリミティブは、アーキテクチャ外の経路に沿った投機的実行へ移行するための基本的手法であり、条件分岐予測失敗、間接分岐予測失敗、および例外提供又は例外遅延からなる。投機的ストアバイパス（ＳＳＢ）は、ＭＳ（Ｍｉｃｒｏｓｏｆｔ）がメモリアクセス予測失敗と称する第４の新たなカテゴリーの投機的プリミティブに属する。
【００９４】
ＳＳＢは、先行するストアよりも先に、従属関係があり得るロード命令を投機的に実行することを可能にし得る、ＣＰＵ最適化に起因して発生する。具体的に述べると、先行するストアに対してロードが従属しないと予測されると、当該ロードはそのストアよりも先に投機的に実行され得る。この予測が正確でなかった場合には、ロードによって古いデータが読み取られるほか、場合によっては、従属関係がある別のマイクロオペレーションへと当該データが投機的処理中に受け渡され得る。これにより、投機的実行のサイドチャネルおよび秘匿の情報の暴露が生じる可能性がある。
【００９５】
これがどのようにして起こり得るのかを説明するために、次の簡単な例について考えるのが役立ち得る。この例では、ＲＤＩとＲＳＩが、アーキテクチャ上の経路の同一アドレスであると仮定する。
【００９６】
01: 88040F                  mov [rdi+rcx],al
02: 4C0FB6040E             movzx r8,byte [rsi+rcx]
03: 49C1E00C               shl r8,byte 0xc
04: 428B0402                mov eax,[rdx+r8]
【００９７】
この例では、第１行のＭＯＶ命令の実行に追加の時間がかかる場合（例えば、ＲＤＩ＋ＲＣＸのアドレス式の計算が先行の命令の実行を待つ場合等）がある。これが起こった場合、ＣＰＵは、第２行のＭＯＶＺＸがそのＭＯＶに対して従属関係を持たないと予測し、ストアを実行するそのＭＯＶよりも先に当該ＭＯＶＺＸを投機的に実行する可能性がある。これにより、メモリのＲＳＩ＋ＲＣＸの位置の古いデータがＲ８にロードされて、従属関係がある第４行のロードへ当該データが受け渡され得る。Ｒ８のバイト値が秘匿のものである場合には、フラッシュ＆リロード（ＲＤＸが共有メモリを参照するものである場合）、プライム＆プローブなどといったキャッシュベースの暴露プリミティブを用いることにより、サイドチャネルを介して当該バイト値が明らかになり得る。ＣＰＵは、最終的に予測が失敗したことを検出し、算出済みの状態を廃棄する。しかし、投機的処理時にアクセスされたデータは、この時点までにキャッシュ内に副次的影響を残している可能性があり、これを測定することにより、Ｒ８にロードされた値を推測することができる。
【００９８】
この例は、問題を説明するために簡略化しているが、ＳＳＢによって投機的な境界外読取り、タイプ混乱、間接分岐などを引き起こし得る同様の命令列がほかにも存在する可能性がある。実際、この攻撃型によるエクスプロイトが可能な部分を攻撃者プロセスが見つけるには、次に従って命令列を特定すればよい：当該命令列は、信頼境界線を跨ぐことが可能なものである（例えば、ユーザモードの攻撃者が、システムコールによってカーネルモードの命令列をトリガすることが可能である）。当該命令列は、先行するストア命令に対してアーキテクチャ的に従属関係を有するロード命令を含んでいる。当該ロード命令で読み取られる古いデータは、秘匿のものであり、かつ、アーキテクチャ外の経路においてサイドチャネルを生成できるよう利用される（例えば、当該データは、暴露ガジェットへ受け渡される）。ストア命令よりもロード命令のほうが先に実行されるほか、従属関係があり且つ前記暴露ガジェットを構成する命令が投機的に実行される。
【００９９】
この攻撃型に対する、本発明の（被害者プロセスを保護する）第１の対処アプローチは、（前述した）図１Ｃの方法１９１を用いて被害者プロセスを保護する。具体的に述べると、この対処アプローチでは、方法１９１が、以下の例で示すように、ストア命令とロード命令との間にＬＦＥＮＣＥ又はＳＳＢＢのメモリバリア命令を追加する。
【０１００】
01: 88040F                  mov [rdi+rcx],al
02: 0FAEE8                 LFENCE
02: 4C0FB6040E             movzx r8,byte [rsi+rcx]
03: 49C1E00C               shl r8,byte 0xc
04: 428B0402                mov eax,[rdx+r8]
【０１０１】
この攻撃型に対する対処アプローチは、（前述した）図１Ｄの方法１９２や図１Ｆの方法１９４を用いることで、攻撃者プロセスが投機的実行エンジンの上記のような脆弱性をエクスプロイトするのを検出し阻止する。
【０１０２】
（Ｓｐｅｃｔｒｅ ＲＳＢ）
【０１０３】
今日のプロセッサでは、洗練された分岐予測器１６３を用いて、条件分岐や間接分岐やコールの方向や宛先が予測される。リターン命令は、このような予測器にとって課題となる。というのも、リターンアドレスは関数を呼び出したコール位置に左右されるものであり、かつ、関数の多くは所与のプログラムのうちの様々な場所から呼び出されるため、それによって分岐予測器のパフォーマンスが低下し得るからである。例えば、プログラム内の数多くの様々な位置から呼び出され得るｐｒｉｎｔｆ（）のような関数が挙げられる。リターン先についての過去の履歴に頼ると、分岐予測器による予測パフォーマンスが極めて低くなり得る。この攻撃型のさらなる詳細については、Koruyeh達の“Spectre Returns! Speculation Attacks using the Return Stack Buffer” CCS ’18 Proceedings of the 2018 ACM SIGSAC Conference on Computer and Communication Security, pages 2109-2122, 2018を参照されたい。
【０１０４】
この問題を克服するため、リターンアドレスは、次のようにリターンスタックバッファ（ＲＳＢ）を用いて予測される。ＲＳＢは、コール命令が実行されるたびにプロセッサがリターンアドレスをプッシュするハードウェアスタックバッファであり、マッチするリターンに遭遇した際に、プロセッサはそれをリターン先予測として使用する。図１Ｈに、実行済みの２つの関数コール（Ｆ１およびＦ２）後のＲＳＢの状態の一例を示す。図１Ｈの（ａ）には、関数のスタックフレーム情報及びリターンアドレスが記憶される、プログラムのソフトウェアスタックの状態も描かれている。図１Ｈの（ｂ）には、関数Ｆ２のリターン命令が実行された際に、どのようにして双方のスタックの値が使用されるのかが示されている。このとき、高速シャドースタックのリターンアドレスが用いられることにより、リターンアドレスの位置が素早く推測される。この時点で実行されている命令は、投機的であると考えられる。一方で、ソフトウェアスタックからも、リターンアドレスが、関数フレームの分解物の一部としてフェッチされる。このリターンアドレスは、メインメモリ内にある（キャッシュに格納されていない）可能性があり、その場合には数百サイクル後に受け渡されることになる。ソフトウェアスタックのほうのリターンアドレスが解決することで、投機的処理の結果が確定する。当該リターンアドレスがＲＳＢのほうの値と一致した場合には、投機的に処理された命令がコミットされ得る。一致しなかった場合には、投機失敗が発生したことになり、投機的に実行した命令を無かったことにする必要がある。この挙動は、リターン命令によりトリガされるという点を除けば、分岐予測器による投機的処理に似ている。なお、リターンが順序外で発行され得て、しかも、その他の従属関係が解決しない限りリターンのコミットが行われないことから、投機失敗による時間窓は大幅に長くなり得る。
【０１０５】
Ｉｎｔｅｌのプロセッサは、ＲＳＢが空になってＲＳＢの充填不足状態が生じると、分岐予測器を代わりに使用してリターンアドレスを推測する。よって、この状況ではリターン命令によって分岐予測器が推測失敗を引き起こす可能性があるので、Ｓｐｅｃｔｒｅ ２から間接分岐を保護するために配備した防御策が役に立たなくなる。Ｓｋｙｌａｋｅ＋プロセッサでは、この状況に対処するために、ＲＳＢ再補充（ソフトウェアパッチ）を実装している。推測失敗の可能性を防ぐために、ＲＳＢには、カーネルへの切替えがあるたびに（Ｒｅｔｐｏｌｉｎｅと類似した）無害の遅延ガジェットのアドレスが意図的に補充される。つまり、ＲＳＢ再補充は、全く異なる目的に設計されたものであるがＳｐｅｃｔｒｅＲＳＢの妨げになる。ただし、Ｓｋｙｌａｋｅよりも前のＣｏｒｅｉ７プロセッサにはどれもＲＳＢ再補充のパッチが施されておらず、他のプロセッサライン（重要なところでは、Ｉｎｔｅｌベースのクラウドコンピューティングシステムやサーバで使用される主要プラットフォームであるＩｎｔｅｌ Ｘｅｏｎが含まれる）についてもパッチは施されていないため、これらはＳｐｅｃｔｒｅＲＳＢの攻撃を受け易くなる。
【０１０６】
これらのプロセッサでＲＳＢ「スタック」が空になると、ＲＥＴ命令は、間接分岐予測器の内容に基づいて投機的な推測を行い得る。この構造こそ、Ｒｅｔｐｏｌｉｎｅが阻止しようとするものである。つまり、「Ｒｅｔｐｏｌｉｎｅ」を中心とする防御が役に立たなくなることを意味する。次の条件下で、ＲＳＢが空になり得る：条件の一つは、コールスタックがＲＳＢの最小深度（１６）よりも深くなることである。このときにＲＥＴ命令を実行すると、ＲＳＢが空になり得る。これには、アボート時のＴＳＸトランザクション内におけるＣＡＬＬ命令及びＲＥＴ命令が含まれる。Ｉｎｔｅｌトランザクショナルシンクロナイゼーションエクステンション（ＴＳＸ）は、ハードウェアロック省略（ＨＬＥ）および制限付きトランザクションメモリ（ＲＴＭ）と称される、ｘ８６命令群の２種類の拡張の製品名である。ＲＴＭは、命令群に対し、ハードウェアトランザクションの一部として実行すべきコード領域を宣言するのに用いる幾つかの命令を追加する拡張である。別の条件として、間接分岐予測器バリア（ＩＢＰＢ）コマンドがＲＳＢを空にする可能性が挙げられる。なお、ＨＬＥは、特定の命令に追加されることが可能なプリフィックス群である。これらのプリフィックスは、当該プリフィックスを使用したコードが古いハードウェアでも動作するように後方互換性を有する。別の条件として、ＳＧＸ命令（ＥＮＣＬＳ、ＥＮＣＬＵ）およびＳＧＸ ＣＰＵＩＤ ｌｅａｆが挙げられる。さらなる別の条件は、ＯＳコンテキスト切替え、Ｃ＋＋例外、ｌｏｎｇｊｍｐのように、ＣＡＬＬ命令とＲＥＴ命令のバランスが崩れてＣＡＬＬ命令よりもＲＥＴ命令が多くなることである。さらなる別の条件として、Ｃ６以上のスリープステート（例えば、ＭＷＡＩＴ等）に移行することでＲＳＢが空になる可能性が挙げられる。
【０１０７】
コールスタックの深度は実行時まで分からない数多くの要因に左右され得るので、コールスタックにソフトウェアで対処することは困難である。しかし、深いコールスタックのエクスプロイトでは、従来の分岐先インジェクション（Ｓｐｅｃｔｒｅ ２型）攻撃よりも遥かに徹底的にＣＰＵ及びプログラム状態の挙動を制御及び予測することが要求されると考えられる。攻撃者プロセスの目的は、ＲＳＢスタックを空にし、それ以降の投機的推測が間接分岐予測器に基づいて試みられるようにすることである。投機的実行エンジンが間接分岐予測器を使用するようになると、Ｓｐｅｃｔｒｅ ２攻撃が可能となる。
【０１０８】
全てのサイドチャネル攻撃に共通する対処策の一つは、不正な実行ファイルやライブラリを実行させないことである。これにより、悪質なサイドチャネルプロセスは確実に実行できなくなる。
【０１０９】
この攻撃型に対する、本発明の（被害者プロセスを保護する）対処アプローチの一つは、（前述した）図１Ｅの方法１９３を用いて被害者プロセスを保護する。図１Ｅの方法１９３は、さらに、所与のスレッドで被害者プロセスに関する間接分岐移動が生じた回数に基づくカウントを追跡かつ保持し得る。これにより、方法１９３は、分岐移動が投機的に行われたものであるか否かを判定することができる。所与のスレッドでの間接分岐のカウントが閾値レベル（間接分岐の予測失敗を示す閾値レベル）を上回ると、方法１９１は被害者プロセス又は当該所与のスレッドを終了する。
【０１１０】
この攻撃型に対する、（被害者プロセスを保護する）第２の対処アプローチを、図１Ｇの方法１９５に示す。方法１９５は、アプリケーション空間とＣＰＵとの間に監視命令を挿入する（５４１）。方法１９５は、アプリケーションの実行中に、リターンスタックバッファが攻撃者プロセスにより攻撃されているという脆弱性を示唆する状態を、前記監視命令を用いて特定する（５４２）。当該状態は、コール深度を増やす割込み／ＮＭＩ／トラップ／アボート／例外、システム管理割込み（ＳＭＩ）、ホストのＶＭＥＸＩＴ／ＶＭＲＥＳＵＭＥ／ＶＭＥＮＴＥＲ、および同一コアの別の論理プロセッサのマイクロコード更新ロード（ＷＲＭＳＲ ０ｘ７９）のうちのいずれかを含む。これに応答して、方法１９５は、リターンスタックバッファが空にならないように、前記監視命令を介してＲＳＢ補充列（例えば、無害の遅延ガジェット／命令のアドレス等）をＲＳＢへと（例えば、アプリケーションコード内に）動的に挿入する（５４３）。
【０１１１】
方法１９５は、さらに、ＲＳＢが空になったか否か（およびアプリケーションが間接分岐予測器に頼っている否か）を前記監視命令を用いて監視する（５４４）。次の動作が原因で、ＲＳＢスタックは空になる：過剰なＴＳＸアボート；ＷＲＭＳＲを０ｘ７９に書き込むこと（マイクロコードの更新）；０ｘ７Ａ（ＳＧＸ起動）；０ｘ８Ｃ〜０ｘ８Ｆに対するＷＲＭＳＲ／ＲＤＭＳＲ（ＳＧＸ起動エンクレーブパブリックキーハッシュ）；ＳＧＸ命令（ＥＮＣＬＳ，ＥＮＣＬＵ）及びＳＧＸ ＣＰＵＩＤ ｌｅａｆ；ＯＳコンテキストの過剰な切替え回数；ユーザ空間の過剰な例外回数；ｌｏｎｇｊｍｐ（）の過剰な呼出し；ならびにＣ６以上のスリープステートの過剰な呼出し。リターンスタックバッファが空になると、方法１９５は、攻撃者プロセスの終了、隔離領域への攻撃者プロセスの移動、プロセスファイルの正当なコピーの復元、プロセスファイルを修正するための少なくとも１つのパッチのロード、プロセスが悪意あるものであることのユーザへの報告などといった保護措置を実施する（５４５）。
【０１１２】
この攻撃型に対する、本発明の別の対処アプローチは、（前述した）図１Ｅの方法１９３を用いて被害者プロセスを保護する。
【０１１３】
この攻撃型に対する、本発明のさらなる別の対処アプローチは、（前述した）図１Ｄの方法１９２や図１Ｆの方法１９４を用いることで、攻撃者プロセスが投機的実行エンジンの上記のような脆弱性をエクスプロイトするのを検出し阻止する。
【０１１４】
（Ｆｏｒｅｓｈａｄｏｗ Ｉｎｔｅｌソフトウェアガードエクステンション（ＳＧＸ）エンクレーブ侵入（ＣＶＥ−２０１８−３６１５））
【０１１５】
今日の広く普及しているオペレーティングシステムやアプリケーションに信頼を寄せることは、本質的に困難である。というのも、それらのサイズは何百万ものコードラインに容易に到達し得て、たった一つの脆弱性であらゆるセキュリティ保証が完全に崩壊することもしばしば起こり得るからである。最新の研究や業界の努力により、これらの課題に応えるかたちで、エンクレーブと称される隔絶されたアプリケーションコンパートメントの代替的非階層保護モデルを特徴とする、トラステッドエグゼキューション環境（ＴＥＥ）が開発された。この攻撃型のさらなる情報については、Bulck達の“FORESHADOW: Extracting the Keys to the Intel SGX Kingdom with Transient Out-of-Order Execution,” SEC ’18 Proceedings of the 27th USENIX Conference on Security Symposium, pages 991-1008, 2018を参照されたい。
【０１１６】
ＴＥＥは、プロセッサパッケージ及びマイクロコードのみを含む最小限のトラステッドコンピューティングベース（ＴＣＢ）により、相互に不信頼なエンクレーブの機密性及び完全性を強化する。エンクレーブのプライベートなＣＰＵ及びメモリ状態には、その内部で動作するコードのみがアクセス可能であり、それ以外のあらゆるエンクレーブや（悪意ある可能性があるオペレーティングシステム及び／又はハイパーバイザーも含め）任意の特権レベルで動作するソフトウェアが全く到達できない状態に維持されている。ＴＥＥは、強力なメモリ隔絶以外にも、ある特定のエンクレーブが純正の（つまり、セキュアと見なせる）ＴＥＥプロセッサにロードされていることをローカル又はリモートのステークホルダーが実行時に暗号を用いて確認するのを可能にする、アテステーションプリミティブを典型的に提供する。
【０１１７】
Ｆｏｒｅｓｈａｄｏｗ攻撃は、最新のＩｎｔｅｌｘ８６プロセッサの投機的実行バグを用いて、ＣＰＵキャッシュからエンクレーブのプレーンテキストの秘密情報を確実に漏洩させるものである。根本的には、Ｆｏｒｅｓｈａｄｏｗ攻撃は、Ｍｅｌｔｄｏｗｎ攻撃と同じプロセッサ脆弱性（すなわち、一時的な順序外命令での不正メモリアクセスの結果がロールバックされる前に当該結果を攻撃者が利用するのを可能にする、ＣＰＵのアクセス制御ロジックにおける巧妙な競合状態）を悪用する。ただし、重要なのは、Ｍｅｌｔｄｏｗｎは従来の階層型保護領域を標的とするのに対し、Ｆｏｒｅｓｈａｄｏｗ攻撃は全く異なる攻撃者モデルを想定しているという点である。敵の目標は、ユーザ空間からカーネルメモリを読み取ることではなく、近年配備されているカーネルページテーブル隔絶防御による対策が講じられていない、最新技術であるアドレス空間内エンクレーブ保護領域に侵入することである。Ｆｏｒｅｓｈａｄｏｗ攻撃は、被害者マシンへのルートアクセスを持たない非特権の敵側で全てが実施され得る。カーネルレベルの強力な敵に対して防御を講じるというＳＧＸの志しにもかかわらず、今日のＳＧＸプロセッサは、非特権ユーザ空間の攻撃者からエンクレーブの秘密情報を保護することすら出来ない。
【０１１８】
この攻撃型に対する、本発明の（被害者プロセスを保護する）対処アプローチの一つは、（前述した）図１Ｅの方法１９３を用いて被害者プロセスを保護する。図１Ｅの方法１９３は、さらに、所与のスレッドで被害者プロセスに関する間接分岐移動が生じた回数に基づくカウントを追跡かつ保持し得る。これにより、方法１９３は、分岐移動が投機的に行われたものであるか否かを判定することができる。所与のスレッドでの間接分岐のカウントが閾値レベル（間接分岐の予測失敗を示す閾値レベル）を上回ると、方法１９１は被害者プロセス又は当該所与のスレッドを終了する。
【０１１９】
この攻撃型に対する、本発明の（被害者プロセスを保護する）第２の対処アプローチを、図１Ｉの方法１９５に示す。方法１９５は、アプリケーション空間とＣＰＵとの間に監視命令を挿入する（５４１）。方法１９５は、アプリケーションの実行中に、リターンスタックバッファが攻撃者プロセスにより攻撃されているという脆弱性を示唆する状態を、前記監視命令を用いて特定する（５４２）。当該状態は、コール深度を増やす割込み／ＮＭＩ／トラップ／アボート／例外、システム管理割込み（ＳＭＩ）、ホストのＶＭＥＸＩＴ／ＶＭＲＥＳＵＭＥ／ＶＭＥＮＴＥＲ、および同一コアの別の論理プロセッサのマイクロコード更新ロード（ＷＲＭＳＲ ０ｘ７９）のうちのいずれかを含む。これに応答して、方法１９５は、リターンスタックバッファが空にならないように、前記監視命令を介して「ＲＳＢ補充」列をＲＳＢへと（例えば、アプリケーションコード内に）動的に挿入する（５４３）。
【０１２０】
方法１９５は、さらに、ＲＳＢが空になったか否か（およびアプリケーションが間接分岐予測器に頼っている否か）を前記監視命令を用いて監視する（５４４）。次の動作が原因で、ＲＳＢスタックは空になる：過剰なＴＳＸアボート；ＷＲＭＳＲを０ｘ７９に書き込むこと（マイクロコードの更新）；０ｘ７Ａ（ＳＧＸ起動）；０ｘ８Ｃ〜０ｘ８Ｆに対するＷＲＭＳＲ／ＲＤＭＳＲ（ＳＧＸ起動エンクレーブパブリックキーハッシュ）；ＳＧＸ命令（ＥＮＣＬＳ，ＥＮＣＬＵ）及びＳＧＸ ＣＰＵＩＤ ｌｅａｆ；ＯＳコンテキストの過剰な切替え回数；ユーザ空間の過剰な例外回数；ｌｏｎｇｊｍｐ（）の過剰な呼出し；ならびにＣ６以上のスリープステートの過剰な呼出し。リターンスタックバッファが空になると、方法１９５は、被害者プロセス又は攻撃者プロセスの終了、隔離領域へのプロセスの移動、プロセスファイルの正当なコピーの復元、プロセスファイルを修正するための少なくとも１つのパッチのロード、プロセスが悪意あるものであることのユーザへの報告などといった保護措置を実施する（５４５）。
【０１２１】
この攻撃型に対する別の対処アプローチは、（前述した）図１Ｄの方法１９２や図１Ｆの方法１９４を用いることで、攻撃者プロセスが投機的実行エンジンの上記のような脆弱性をエクスプロイトするのを検出し阻止する。
【０１２２】
（Ｆｏｒｅｓｈａｄｏｗ−ＮＧ−１（別名：Ｌ１ＴＦ−ＮＧ−１−ＩｎｔｒａＯＳ）（ＣＶＥ−２０１８−３６２０）およびＦｏｒｅｓｈａｄｏｗ−ＮＧ−２（別名：Ｌ１ＴＦ−ＮＧ−２−ＩｎｔｅｒＶＭ）（ＣＶＥ−２０１８−３６４６））
【０１２３】
次の各カテゴリーは、アーキテクチャ外の経路に沿った投機的実行へ移行するための基本的手法である。具体的には、条件分岐予測失敗、間接分岐予測失敗、例外提供又は例外遅延、およびメモリアクセス予測失敗である。Ｌ１ＴＦは、アーキテクチャ上の例外を発生させるロジックに関連した投機的（又は順序外）実行についてのものなので、（ＭｅｌｔｄｏｗｎやレイジーＦＰ状態復元と同じく）例外提供又は例外遅延の投機的プリミティブカテゴリーに属する。これらの攻撃型のさらなる情報については、“Resource And Response To Side Channel L1 Terminal Fault,” https://www.intel.com/content/www/us/en/architecture-and-technology/l1tf.html, pages 1-10, 2019を参照されたい。
【０１２４】
Ｌ１ＴＦは、ページテーブルウォークを実行する際のアドレス変換の処理に関連したＣＰＵ最適化が原因で生じるものである。線形アドレス変換時のＣＰＵは、仮想アドレスのページング構造エントリが存在しない（存在ビットが０である）か又は有効でない場合に発生するターミナルページフォールトに遭遇する可能性がある。これは、ページフォールトなどの例外や、アーキテクチャ上の経路に沿ったＴＳＸトランザクションのアボートに繋がる。しかし、Ｌ１ＴＦの攻撃対象となるＣＰＵは、これらのいずれかが起こる前に、変換中の線形アドレスでＬ１データキャッシュの読出しを開始する場合がある。投機的にのみ行われるこの読出しの際には、ターミナル（存在しない）ページテーブルエントリのページフレームビットが、ゲストページテーブルエントリであってもシステム物理アドレスと見なされる。この物理アドレスのキャッシュラインがＬ１データキャッシュに生じると、このラインのデータが、前記ターミナルページフォールトを招いた命令のリタイアまで投機的に実行され得る従属処理へと受け渡され得る。Ｌ１ＴＦ関連の挙動は、従来のページテーブルおよび拡張ページテーブル（後者は仮想化に用いられる）のいずれを伴うページテーブルウォークの場合にも起こり得る。
【０１２５】
これがどのようにして起こり得るのかを説明するために、次の簡単な例について考えるのが役立ち得る。この例では、攻撃者が操作する仮想マシン（ＶＭ）が、当該ＶＭ内に、希望のシステム（ホスト）物理アドレスを読み取ることを目的としたページテーブル階層構造を構築したとする。下記の図は、仮想アドレス０ｘ１２３４５０００の例的な階層構造として、ターミナルページテーブルエントリが存在しないものの図１Ｉに示すように０ｘ９ａ０のページフレームを含んでいる階層構造を示したものである。この階層構造をセットアップした後、前記ＶＭは、次のような命令列により［０ｘ９ａ００００〜０ｘ９ａ１０００）内のシステム物理アドレスからの読取りを試みたものとする：
【０１２６】
【表２】
2021511571.tif 000004
【０１２７】
ＶＭは、これらの命令をＴＳＸトランザクション内で実行したり、アーキテクチャ上のページフォールトを処理したりする際に、システム物理アドレス＝０ｘ９ａ００４０に関連付けられたＬ１データキャッシュラインから（当該Ｌ１内に存在していれば）投機的ロードを行って当該キャッシュラインの最初のバイトを、当該バイトを信号配列へのオフセットとして用いる順序外ロードに受け渡そうと試みると考えられる。これにより、フラッシュ＆リロードなどの暴露プリミティブを用いてそのバイト値を調べることが可能な状態が生じる。このシステム物理アドレスがＶＭに割り当てられていない場合には、セキュリティ境界を越えて情報が暴露されることになる。上記のシナリオは、（ＶＭがゲストページテーブルの完全な支配権を有している場合に）仮想マシンの境界を越えて物理メモリを推測するのにＬ１ＴＦが適用され得る様子を説明したものである。しかし、Ｌ１ＴＦは、それ以外のシナリオでも利用される可能性がある。例えば、ユーザモードのアプリケーションがＬ１ＴＦを用いて、当該ユーザモードのアドレス空間内に存在しないターミナルページテーブルエントリで参照される物理アドレスからの読取りを試みることも可能である。実際、存在しないページテーブルエントリフォーマットのソフトウェアビットを用いて、有効な物理ページフレームに相当し得るメタデータを記憶することは、オペレーティングシステムの常套手段である。これにより、プロセスは、当該プロセス（あるいは、仮想化シナリオであればＶＭ）に割り当てられていない物理メモリや、当該プロセス内でアクセス出来ないように意図されている物理メモリ（例えば、ＷｉｎｄｏｗｓのＰＡＧＥ＿ＮＯＡＣＣＥＳＳメモリ等）を読み取ることが可能になる。
【０１２８】
この攻撃型に対する、本発明の対処アプローチの一つは、次のようなものである。この攻撃型に対する、本発明の実施形態は、アプリケーション空間と投機的実行エンジンのＣＰＵとの間に監視命令を挿入する。実施形態は、当該監視命令を用いて、セキュリティ領域の移行（異なるプロセス間での動作のコンテキスト切替え）を検出し且つそれに応答してＬ１データキャッシュを動的にフラッシュし得る。前記監視命令は、さらに、過剰なＴＳＸアボートを監視（検出）し、過剰なＴＳＸアボートが検出された場合には被害者プロセスを終了する。実施形態は、セキュリティ技術導入ガイド（ＳＴＩＧ）やユーザ設定に基づくルールベースのポリシーを用いて、ＴＳＸアボートやプロセス間のコンテキスト切替えの監視や、キャッシュのクリア動作や、被害者プロセスの終了を行い得る。
【０１２９】
この攻撃型に対する、本発明の別の対処アプローチは、（前述した）図１Ｄの方法１９２や図１Ｆの方法１９４を用いることで、攻撃者プロセスが投機的実行エンジンの上記のような脆弱性をエクスプロイトするのを検出し阻止する。
【０１３０】
（Ｓｐｅｃｔｒｅ ＮＧ３（ＣＶＥ−２０１８−３６６５）レイジーＦＰＵ状態復元）
【０１３１】
今日のプロセッサでは、効率的な浮動小数点及びＳＭＩＤ演算を進めるために用いるレジスタのセットがますます大規模になってきている。この大規模なレジスタのセットは、オペレーティングシステムのコンテキストがタスク間で切り替わる際に内容を保存したり復元したりする必要があるためオペレーティングシステムにとって負担となる。最適化の一つとして、オペレーティングシステムは、ｘ８７浮動小数点演算装置（ＦＰＵ）及び単一命令複数データ（ＳＩＭＤ）レジスタのセットのコンテキスト切替えを、当該レジスタへのアクセスを必要とする最初の命令が実行されるまで遅らせ得る。その間、古い内容は、現在のタスクがこれらのレジスタを使用しないことを期待しながら保持される。この最適化は、レイジーＦＰＵコンテキスト切替えと一般的に称される。これを可能にするために、プロセッサは、浮動小数点レジスタやＳＭＩＤレジスタを用いる命令の存在をトグルで示すという機能をしばしば提供している。命令がオフにされていると、当該命令を実行しようとする試みはどれもフォールトを生じる。レイジーＦＰＵコンテキスト切替えを悪用することで、任意プロセスやＶＭのＦＰＵ及びＳＩＭＤレジスタのセットを復元することができる。この攻撃は、ＦＰＵ又はＳＩＭＤ命令の最初の使用を示すフォールトを生じさせる命令の後続に位置したＦＰＵ又はＳＩＭＤ命令を、プロセッサに一時的に実行させることで機能する。そして、オペレーティングシステムがレイジーＦＰＵコンテキスト切替えを用いた際のキャッシュの副作用を利用することで、別のプロセスや仮想マシンのＦＰＵ及びＳＭＩＤレジスタの内容を再構築することができる。この攻撃型のさらなる情報については、Stcklina達の“LazyFP: Leaking FPU Register State using Microarchitectural Side-Channels,” arXiv:1806.07480 ((https://arxiv.org/abs/1806. 07480), 2018を参照されたい。
【０１３２】
ＳＩＭＤレジスタは暗号計算だけでなくメモリのコピーなどといった簡単な演算にもますます使われてきているので、上記のようなレイジーＦＰＵコンテキスト切替えは、影響を受けるプロセッサで登用される可能性があるどのオペレーティングシステムにおいてもオフにされるべき危険な最適化である。Ｍｅｌｔｄｏｗｎとは異なり、研究者達は、ページフォールト（＃ＰＦ）例外ではなくデバイスノットアベイラブル（＃ＮＭ）例外に遭遇した場合の最新のＩｎｔｅｌプロセッサの挙動をエクスプロイト対象としている。この例外は、レイジーＦＰＵコンテキスト切替えと称されるコンテキスト切替え最適化を実現する際に使われるものである。この最適化と非特権ローカルコード実行とを組み合わせることで、投機的命令の実行により、被害者プロセスのＦＰＵレジスタ状態を完全に復元することが可能となる。
【０１３３】
例的な攻撃シナリオの一つは、１ビットリークの単純なｘ８６アセンブリプログラムである。ＳＳＥレジスタｘｍｍ０の下位半分が、ｒａｘ汎用レジスタに読み込まれる。次に、最下位ビットをマスクして、これを６ビットシフトして入力値に応じて０又は６４とする。計算後のこのオフセットが、メモリへの書込みに用いられる。６４ビットのキャッシュラインを有するシステムでは、書込み処理が、ｘｍｍ０レジスタのビット０に応じて２つのキャッシュラインのいずれかにタッチする。レイジーＦＰ攻撃の基本構成単位は以下のとおりである：
【０１３４】
movq rax , xmm0
and rax , 1
shl rax , 6
mov dword [mem + rax], 0
【０１３５】
ＦＰＵレジスタのアクセスは、前のプロセスのＦＰＵレジスタのセットを用いて投機的に実行される。この実行は、最初の命令で生じた＃ＮＭ例外をオペレーティングシステムのカーネルが処理した時点で、リタイアされる。ＦＰＵレジスタがレイジーＦＰＵコンテキスト切替えによって被害者プロセスに所有されていると仮定すると、ｍｏｖｑ命令によって＃ＮＭフォールトが生じ、ＦＰＵを使用できないことがオペレーティングシステムに伝えられる。オペレーティングシステムはこのフォールトをトランスペアレントに処理し、現在のプロセスのレジスタ状態を復元して実行を続行する。プロセッサがｍｏｖｑをリタイアして＃ＮＭフォールトを生成する前に、興味深いことが起こる。プロセッサは、後続の命令を既に投機的に実行しているのである。これらの命令で生じるアーキクチャ上の変化は廃棄されるものの、キャッシュ内のマイクロアーキテクチャ的な痕跡は残る。被害者のＦＰＵレジスタのセットを用いたコードの投機的実行と、攻撃者のレジスタのセットを用いた通常の実行とが行われる。攻撃者が、ｘｍｍ０をゼロにセットし且つプロセッサのキャッシュのｍｅｍ＋６４をフラッシュしたと仮定する。すると、攻撃者は、このメモリ位置のアクセスレイテンシをプローブすることにより、被害者のビットを復元することができる。この攻撃を繰り返すことで任意のレジスタから任意のビットを漏洩させることが可能であるが、このような単純形態のものは実用的でない。漏洩を試みるには、その前に被害者が必ず実行を行う必要がある。これは、ＦＰＵの所有権を被害者に戻すために必要である。しかし、これは、被害者によってレジスタの内容が変更される可能性が高く、結果の悪用が難しくなることも意味している。
【０１３６】
この攻撃型に対する、本発明の対処アプローチの一つは次のとおりである。この攻撃型に対する、本発明の実施形態は、アプリケーション空間と投機的実行エンジンのＣＰＵとの間に監視命令を挿入する。実施形態は、ＢＩＯＳ設定が“ｅａｇｅｒｆｐｕ＝ｏｎ”であることを前記監視命令を用いて確認する。これにより、ホストプラットフォームは、レイジーＦＰＵ状態復元の脆弱性の攻撃を確実に受けない。このＢＩＯＳ設定が“ｏｎ”に設定されていなければ、実施形態は、このＢＩＯＳ設定を“ｏｎ”へと前記監視命令を用いて動的に変更する。実施形態は、セキュリティ技術導入ガイド（ＳＴＩＧ）やユーザ設定に基づくルールベースのポリシーを用いて、ＢＩＯＳ設定を確認し変更し得る。
【０１３７】
この攻撃型に対する、本発明の別の対処アプローチは、（前述した）図１Ｄの方法１９２や図１Ｆの方法１９４を用いることで、攻撃者プロセスが投機的実行エンジンの上記のような脆弱性をエクスプロイトするのを検出し阻止する。
【０１３８】
（ＢｒａｎｃｈＳｃｏｐｅ（ＣＶＥ−２０１８−９０５６）パターン履歴テーブル攻撃）
【０１３９】
今日のマイクロプロセッサは、実行パイプラインへの命令提供を条件分岐間で途切れなく維持するのに、分岐予測装置（ＢＰＵ）を必要とする。複数のプロセスが同じ物理コアで実行される場合、当該複数のプロセスは一つのＢＰＵを共有する。この共有構成は、有用性や複雑性の観点からは魅力的である一方、攻撃者がその共有のＢＰＵ状態を操作してサイドチャネルを作り出し、被害者プロセスで実行される分岐命令の分岐方向や分岐先を導出するための機会を与える可能性がある。このような漏洩により、秘匿のデータが奪われ得る。例えば、分岐命令が秘密鍵のビットを条件としている場合には、その鍵のビットが直接漏洩してしまう。これは、今日の暗号方式の冪乗アルゴリズムやその他の重要な数学的演算の実装でも起こる。また、攻撃者が予測器の状態を変更し、被害者側での当該予測器の挙動を変えてしまうという可能性もある。この攻撃型のさらなる情報については、Evtyushkin達の“BranchScope: A New Side-Channel Attack on Directional Branch Predictor,” Proccedings of 2018 Architectural Support for Programming Languages and Operating Systems, ACM, New York, NY, 15 pages, 2018を参照されたい。
【０１４０】
今日のマイクロプロセッサにおいてＢＰＵは、分岐先バッファ（ＢＴＢ）と分岐方向予測器との２つの構造で構成される。過去の研究は、サイドチャネルの生成の標的としてＢＴＢに特化したものであった。ＢＴＢでは、分岐が成立した場合にのみ、条件分岐の分岐先が更新される。これを利用することで、特定の被害者分岐が成立したか否かを検出することが可能となる。この分野で最初に提案された攻撃は、攻撃者がＢＴＢに補充を行うことで被害者に属するエントリを追い出すことに基づいた幾つかのＢＴＢベースの攻撃である。以降のアクセスの時間計測を行うことにより、攻撃者は、被害者がどの分岐を新たに実行したのかを推測することができる。研究者達は、関連研究の欄でこれらの攻撃及び当該攻撃の限界について述べている。ＢＴＢに関して提案されたサイドチャネル攻撃は、被害者プロセスと攻撃者プロセスとの間でＢＴＢの衝突を生じさせることで、アドレス空間レイアウトランダム化をバイパスして攻撃者がアドレス空間における被害者の特定の分岐命令の位置を見つけ出すことを可能にするものである。別の研究者達（Lee達）はこの研究を基にして、ＢＴＢの衝突を用いることで、被害者の分岐命令の方向も明らかにした。彼らは、ＩｎｔｅｌのＳＧＸエンクレーブに対するカーネル空間の攻撃を立証した。
【０１４１】
研究者達は、分岐方向予測器を情報漏洩源の標的とする、ＢｒａｎｃｈＳｃｏｐｅと呼ばれるマイクロアーキテクチャ上の新たなサイドチャネル攻撃を提案する。ＢｒａｎｃｈＳｃｏｐｅは、分岐方向予測器の構造を利用した最初の攻撃であり、ＢＴＢが保護されていてもＢＰＵが攻撃を受ける可能性があることを示している。ＢｒａｎｃｈＳｃｏｐｅは、攻撃者側の分岐と被害者側の指定の分岐とを衝突させて、当該衝突を用いて被害者側の分岐についての情報を推測することで機能する。この攻撃には、ＢＴＢ攻撃にはない新たな課題がある。衝突を達成するには、今日のＣＰＵで使われているハイブリッド型の複雑な予測メカニズムの動作予測不能性を克服しなければならない。ＢｒａｎｃｈＳｃｏｐｅは、プロセッサに様々なレベルの複数個の複雑な予測器が存在している場合であっても分岐予測器がローカルの１レベル予測を選択するようにさせる分岐パターンを生成することにより、これを克服する。そして、衝突が確実に作り出されてしまえば、所定の結果を有する一対の分岐を攻撃者が実行し、これらの分岐の予測精度を測定し、この情報を予測器の状態、つまり、被害者側の分岐方向と関連付けることで、被害者側の分岐方向を手堅く暴露することが可能となる。
【０１４２】
今日の分岐予測器は、プログラムカウンタにより直接インデックスされる単純な１レベルｂｉｍｏｄａｌ予測器（１レベル予測器と一般的に称される）と、ｇｓｈａｒｅ型の２レベル予測器との組合せとして典型的に実装される。ｇｓｈａｒｅ型の予測器は、分岐結果が最近の分岐の結果だけでなく分岐のアドレスにも依存するという考えを利用したものである。
【０１４３】
分岐アドレスによりインデックスされたセレクタテーブルは、所与の分岐にとってどちらの予測器のほうが良好になる可能性が高いのかを、当該予測器同士の過去の挙動に基づいて特定する。この設計は、両コンポーネントの予測器における最良の特徴を組み合わせたものである。以下の図に、このようなハイブリッド型の予測器として考えられ得る設計の一つを示す。１レベル予測器は、パターン履歴テーブル（ＰＨＴ）の２ビット飽和カウンタの形態で自身の履歴を記憶する。ｇｓｈａｒｅ型の予測器は、プログラムカウンタとグローバル履歴レジスタ（ＧＨＲ）とを組み合わせたより複雑なインデックス方式を有する。ＧＨＲは、プログラムが実行した最近の幾つかの分岐の結果を記録する。分岐履歴情報は、さらに、２ビット飽和カウンタを用いてＰＨＴにも記憶される。これら２種類の予測器の唯一の違いは、ＰＨＴがインデックスされる方法である。分岐が成立すると予測されると、当該分岐の分岐先アドレスが、分岐先バッファ（ＢＴＢ）と称される構造から取得される。分岐先バッファ（ＢＴＢ）は、所与の分岐の最も新しい分岐先アドレスを各々のＢＴＢエントリにマップして記憶する、ダイレクトマップ方式の単純なアドレスキャッシュである。これまでに公開されているＢＰＵへのサイドチャネル攻撃は、いずれもＢＴＢを標的としたものであった。対照的に、ＢｒａｎｃｈＳｃｏｐｅは、図１Ｊに示すようにＢＰＵの方向予測部を標的とする。
【０１４４】
一般的に、この攻撃は次のようにして行われる。第１段階：ＰＨＴエントリのプライム：この段階では、攻撃者プロセスが、標的のＰＨＴエントリを所定の状態へとプライムする。このプライム動作は、巧妙に選択され且つランダム化してなる複数の分岐命令からなるブロックを実行することによって達成される。このブロックは、攻撃者により一回だけ推測的（ａ−ｐｒｉｏｒｉ）に生成される。第２段階：被害者側の実行：次に、攻撃者は、監視したい分岐を被害者プロセス内で実行開始し、そのＰＨＴ状態が被害者側の動作で変わるまで待つ。第３段階：ＰＨＴエントリのプローブ：最後に、攻撃者は、被害者と同じＰＨＴエントリをターゲットにした分岐命令をさらに実行すると共に、時間を計測することでそれらの予測結果を調べる。攻撃者は、当該予測結果をＰＨＴの状態と関連付けることにより、被害者側の分岐の方向を特定する。攻撃者は、自身の分岐と被害者プロセスの分岐とをＰＨＴで衝突させることが可能でなければならない。予測器の動作が分かっていれば、これらの衝突により（具体的には、第３段階で実行する攻撃者のプローブ用分岐の予測精度に対する（上記の第２段階で実行された）分岐の影響を調べることにより）、攻撃者は被害者側の分岐の方向を明らかにすることができる。ＰＨＴインデックスが（１レベル予測器のように）命令アドレスで厳密に決まるものであれば、２個のプロセスの分岐同士をＰＨＴで衝突させることは、被害者側のコードの仮想アドレスが典型的に秘密でないので単純明快である。アドレス空間レイアウトランダム化（ＡＳＬＲ）を用いてコードの場所がランダム化されている場合には、データ暴露やＡＳＬＲへのサイドチャネル攻撃を用いることにより、攻撃者は非ランダム化を実施することができる。
【０１４５】
この攻撃では、予測器内で衝突を生じさせることが必要となる。衝突の生成は、使用する予測器が複雑なｇｓｈａｒｅ型の予測器ではなく単純なインデックスの１レベル予測器であれば非常に簡単である。この攻撃では、攻撃者のコードと被害者のコードの双方に１レベル予測器を使用させる必要がある。これは、以下に述べるプライム＆プローブ戦略を用いて達成される。攻撃者のコードにおける新たな分岐に対し、１レベル予測器が直接使用されるようにすることで、１レベル予測器の使用を強制させる。分岐予測器にて被害者側の分岐（同じく１レベル予測器を使用すると仮定する）と衝突するアドレスに設けられた分岐を複数繰り返し、攻撃に使用された分岐が常にＢＰＵに存在しないようにすることで、当該ユニットに１レベル予測器を使用させることができる。
【０１４６】
それよりも難しいタスクは、被害者コードに１レベル予測器を使用させることである。被害者コードは、攻撃者の支配下にない。標的となる被害者側の分岐について１レベル予測器をＢＰＵに使用させるには、攻撃者が、次の２つの目標のいずれかを達成する必要がある：１）最近使われていなかった分岐を攻撃に使用することで、当該分岐の予測が確実に１レベルモードから始まるようにすること；および２）２レベル予測器を不正確なものにしてその訓練時間を長引かせることにより、少なくとも幾つかの分岐に関してセレクタに１レベルモードを選択させること。つまり、被害者コードに１レベル予測器を使用させるには、攻撃者が、これら２種類の特性のうちの（両方とは言わなくとも）少なくとも一方を確実に成立させなければならない。この目標は、分岐を大量に含むコードの命令列を攻撃者が作成してこれを実行することにより、ＢＰＵの状態を２レベル予測器の精度が下がった状態にする（場合によっては、被害者側の分岐に置き換わる）ことによって達成される。この命令列を実行した結果、被害者コードは分岐の実行時に１レベル予測器を使用するようになり、衝突の実現が可能となる。このコードは、別の重要な機能も果たす。当該コードにより、ＰＨＴエントリの状態が、（次の欄でリバースエンジニアリングで作成する）予測ＦＳＭの各処理毎の分岐結果を確実に検出できる所望の状態になる。この効率を最大化するには、ランダム化コードに２つの特性が備わっている必要がある。第一に、実行される分岐には、２レベル予測器で予測することが可能な規則的パターンが含まれていてはいけない。この目的のために、コード内の分岐方向は、分岐間で従属関係がないようにランダムに選ばれる。第二に、コードは、ＰＨＴ内部の多数のエントリに影響を及ぼすものでなければならない。これは、大量の分岐命令を実行すると共に、当該命令間にＮＯＰ命令を設けたりＮＯＰ命令を設けなかったりすることで当該命令のメモリ位置をランダム化することによって達成される。結果パターンは（当該ブロック生成時の）一度だけランダム化させるのであって、実行時に再ランダム化させないものとする。分岐予測器に対するこれらの操作は、被害者が対象の分岐を実行する前に（攻撃の第１段階で）実行される必要がある。このように実行される必要のある分岐命令の総数は、特定のＣＰＵにおけるＢＰＵの内部データ構造のサイズに依存する。大半のＰＨＴエントリの状態をランダム化し且つ２レベル予測器を実質的に不能化させるには、１００，０００個の分岐命令の実行で十分であることが実験で判明している。このようなコードの一例を、次のＬｉｓｔｉｎｇ１に示す。今後の研究の課題は、このコードのサイズを減らすことである。例えば、特定の分岐を追い出すことだけに集中するのであれば、同じＰＨＴにマップする（そのエントリに置き換わる）より短い分岐命令列を考え出すことが可能であり得る。
【０１４７】
randomize_pht: 
cmp %rcx, %rcx; 
je .L0; nop; .L0: jne .L1; nop; .L1: je .L2; 
............ 
.L99998: je .L99999; nop; .L99999: nop;
【０１４８】
ＰＨＴの衝突を強制的に引き起こした後、攻撃者は、さらに、ＰＨＴの状態を理解して被害者側の分岐の方向を把握することが可能でなければならない。そのため、第１段階にてＰＨＴエントリをどのような所望の開始時状態へとプライムしたのかが分かっていなければならない。この開始時状態により、第３段階における攻撃者のプローブ処理の所与の観測可能な挙動を被害者側の分岐の方向と関連付けることが可能にならなければならない。
【０１４９】
ＢｒａｎｃｈＳｃｏｐｅ攻撃で必要となる重要な機能は、分岐予測器のイベントを検出する能力である。アプローチの一つは、失敗した分岐を検出するハードウェアパフォーマンスカウンタを使用することである。このアプローチは、分岐予測の結果を明確に提供するハードウェアに頼るものである。しかし、攻撃者がこれを利用するには、少なくとも部分的に高い特権が必要となる。代替的なアプローチは、分岐関連のイベントを、当該イベントによるＣＰＵのパフォーマンスへの影響を調べることで検出することである。予測に失敗した分岐は、間違った経路の命令をフェッチすることになるので、パイプラインのリスタートで大幅な数のサイクルが失われてしまう。したがって、サイクル数を追跡することにより、攻撃者は、分岐が正確に予測されたか否かを判断することができる。Ｉｎｔｅｌのプロセッサにおいて、この時間計測（タイムキーピング）は、ｒｄｔｓｃ又はｒｄｔｓｃｐ命令で実現可能である。これらの命令により、ユーザプロセスは、システムソフトウェアレイヤをバイパスしてタイムキーピングハードウェアに直接アクセスすることができる。ＢｒａｎｃｈＳｃｏｐｅ攻撃では、総合的なＢＰＵパフォーマンスではなく、一つ一つの分岐実行の予測が正確であったのか又は不正確であったのかを攻撃者が検出する必要がある。攻撃目的での信頼性の高い測定メカニズムとしてのｒｄｔｓｃｐ命令の可用性を評価するために、一連の実験を実施する。まず、一つ一つの分岐命令について、分岐が成立した場合と分岐が成立しなかった場合との２種類の場合に関して、予測が正確であったときの時間測定と予測が不正確であったときの時間測定とを集める。それぞれの場合毎に、１００，０００個のサンプルを収集した。図７に、得られたデータを算出平均値と共に示す。実際の分岐結果を予測できなかった場合を図７ａに表し、予測結果どおりの場合を図７ｂに表す。これらの図から分かるように、分岐予測失敗によるパフォーマンスへの影響は顕著であり、しかも、その影響は実際の分岐方向にかかわらず存在する。個々のデータ点のみならず平均値においても、速度低下は明らかである。これらの測定値へのキャッシュ格納の影響をなくすため、各分岐を２回実行すると共に、命令がキャッシュに配された後となる２回目の実行時のレイテンシだけを記録した。
【０１５０】
ＢｒａｎｃｈＳｃｏｐｅは、ＩｎｔｅｌのＳＧＸのような隔絶型実行をサポートするシステムを標的にするよう直接用いられることも可能であるし、一般的な環境における汎用的なサイドチャネル攻撃として用いられることも可能である。この欄では、ＩｎｔｅｌのＳＧＸ、およびそのような環境での攻撃の考慮事項に関する概要を述べた後、ＳＧＸエンクレーブ内部で動作している被害者に対しても実施することが可能な一連の具体的な攻撃について説明する。ＳＧＸ環境でのＢｒａｎｃｈＳｃｏｐｅについて説明するため、研究者達は、ＳＧＸ外部の受信者へとＳＧＸエンクレーブ内部で動作している送信者からＢｒａｎｃｈＳｃｏｐｅを用いて通信を行うというカバートチャネルベンチマークを繰り返す。ノイズの存在下であっても、そのエラーレートは許容範囲に収まる。ただし、ＯＳが（他のプロセスが実行しないようにして）ノイズを制御すると、チャネルの品質は上がる。モンゴメリラダーは、冪剰余アルゴリズムやスカラ乗算アルゴリズムにおいて良く使われるアルゴリズムである。これらのいずれの数学的処理も、公開鍵暗号の伝統的なＲＳＡ及び楕円曲線（ＥＣＣ）実装の重要なコンポーネントを成している。モンゴメリラダーは、秘密鍵ｋのビット値ｋｉに関係なく演算を実行することに基づいたものである。この実装により、実行経路が等化されてタイミングサイドチャネルやパワーサイドチャネルが軽減される。しかし、これには、ｋｉの値に直接依存して動作する分岐が必要となる。Yarom達[55]は、ＥＣＤＳＡ暗号のＯｐｅｎＳＳＬ実装の脆弱性を、フラッシュ＆リロードのキャッシュサイドチャネル攻撃を用いて立証した。この攻撃は、ＣＰＵのキャッシュを用いて対象の分岐の方向を探るものであった。ＢｒａｎｃｈＳｃｏｐｅでは、このような分岐の方向を直接明らかにすることができる。最新の暗号ライブラリには、秘密鍵のビットに直接依存する結果を有する分岐が含まれていない。しかしながら、一部の限られた情報についてはしばしば復元できる場合がある[6,8]。また、旧式のライブラリも、未だに数多く使用されている。秘匿の情報を明らかにする攻撃の別の例として、よく使われるＪＰＥＧ符号化／復号化ライブラリであるｌｉｂｊｐｅｇに対する攻撃が挙げられる。この攻撃は、解凍時に実行される逆コサイン変換（ＩＤＣＴ）処理によって可能となる。この最適化では、係数行列中の行の要素及び列の要素を０と比較することにより、高負荷の演算を回避する。このような比較の各々が、個々の分岐命令として実現される。ＢｒａｎｃｈＳｃｏｐｅは、これらの分岐を探ることにより、復号化後の画素ブロック間の相対的な複雑性についての情報を取得することができる。ｌｉｂｊｐｅｇへの攻撃は、最適化が適用され得る回数をカウントしページフォールトサイドチャネル[27,54]を用いて元々の画像を復元することによって過去に立証された。ＢｒａｎｃｈＳｃｏｐｅ攻撃は、全ての行／列の要素がゼロとなる場合を識別できるだけでなく、どの要素がゼロでないのかも分かるので有利である。ＡＳＬＲ値の復元：ＢｒａｎｃｈＳｃｏｐｅを用いて、被害者エンクレーブ内の制御コードを推測することも可能である。攻撃者は、分岐同士の衝突を調べることにより、特定の分岐が成立したのか成立しなかったのかが分かるだけでなく、被害者の仮想メモリ内の分岐命令の位置も検出し得る。これにより、攻撃者は、アドレス空間レイアウトランダム化をバイパスすることができる。
【０１５１】
ＢｒａｎｃｈＳｃｏｐｅを用いて、被害者エンクレーブ内の制御コードを推測することも可能である。攻撃者は、分岐同士の衝突を調べることにより、特定の分岐が成立したのか成立しなかったのかが分かるだけでなく、被害者の仮想メモリ内の分岐命令の位置も検出し得る。これにより、攻撃者は、アドレス空間レイアウトランダム化（ＡＳＬＲ）保護をバイパスすることができる。同様の攻撃が、ＢＴＢを用いて過去に立証された[21,35]。Gruss[23]が示唆するように、Ｉｎｔｅｌの最新のプロセッサにはＢＴＢベースの攻撃が効かない。そのため、この種の攻撃では分岐方向予測器が唯一無二の候補となる。
【０１５２】
ＢｒａｎｃｈＳｃｏｐｅについても、２つの異なる対処アプローチが存在する。一方はアプリケーションに関するものであり、他方はサイドチャネル攻撃プロセスに関するものである。なお、間接分岐を有するプロセスは、ＢｒａｎｃｈＳｃｏｐｅ攻撃者プロセスの攻撃を受ける可能性がある。つまり、ＢｒａｎｃｈＳｃｏｐｅは、Ｓｐｅｃｔｒｅ ２型の攻撃と似ている。ＢｒａｎｃｈＳｃｏｐｅは間接分岐予測を条件としているので、Ｒｅｔｐｏｌｉｎｅベースのアプローチを用いることにより、間接分岐を完全に消失させることができる。この攻撃型に対する、本発明の第１の対処アプローチは、図１Ｅの方法１９３を用いて被害者プロセスを保護する。ＢｒａｎｃｈＳｃｏｐｅ型の攻撃者プロセスは、ＲＤＴＳＣ命令の悪用に主に依存して行われるプライム＆プローブアプローチやフラッシュ＆リロードアプローチの使用から検出することが可能である。
【０１５３】
ＢｒａｎｃｈＳｃｏｐｅは、プライム＆プローブサイドチャネルやフラッシュ＆リロードサイドチャネルに主に頼る。この攻撃型に対する本発明の第２の対処アプローチは、（前述した）図１Ｄの方法１９２や図１Ｆの方法１９４を用いることで、攻撃者プロセスが投機的実行エンジンの上記のような脆弱性をエクスプロイトするのを検出し阻止する。
【０１５４】
（投機的実行に対する防御のシステム）
【０１５５】
図２Ａに、脆弱性（Ｓｐｅｃｔｒｅ、Ｍｅｌｔｄｏｗｎ、Ｆｏｒｅｓｈａｄｏｗなど）からアプリケーションを保護する例的なトラステッドエグゼキューションプラットフォーム２００を示す。図２Ａは、図１Ａの投機的実行エンジンで脆弱性がエクスプロイトされることがないよう阻止するものである。図２Ａのプラットフォーム２５５では、ユーザ２０２が、クラウドコンピューティングプラットフォーム、ウェブサービスプラットフォーム（例えば、図２Ａのウェブインフラストラクチャ等）、仮想マシン（ＶＭ）プラットフォーム、その他のあらゆる無限数のコンピューティングプラットフォームなどといったコンピューティングプラットフォーム２５５でアプリケーションを開始する。コンピューティングプラットフォーム２５５は、当該コンピューティングプラットフォーム２００のアプリケーション（アプリケーション空間２０６にロードされたアプリケーション）を実行する投機的実行を実装した少なくとも１つのマイクロプロセッサ（又は別種のプロセッサ）を備える。攻撃者は、コンピューティングプラットフォーム２５５がアプリケーション処理を実行している最中に、投機的実行により生じる前記マイクロプロセッサの脆弱性（Ｓｐｅｃｔｒｅ、Ｍｅｌｔｄｏｗｎ、Ｆｏｒｅｓｈａｄｏｗなど）をエクスプロイトし得る。
【０１５６】
アプリケーションコードがコンピューティングプラットフォーム２５５のメモリで実行されている最中に、解析執行エンジン（アプリケーションランタイム監視解析（ＶＳＰ）アプライアンスとも称される）２３０が、前記脆弱性に対する仮想パッチを実施する。解析執行エンジン２３０は、コンピューティングプラットフォーム２００がアプリケーション空間２０６から当該コンピューティングプラットフォーム２５５の中央演算処理装置（ＣＰＵ）に向けてアプリケーションのコードをディスパッチする際に、ＡｐｐＳｅｎｓｏｒ（又は解析エンジン）２３９によって当該コード（例えば、コンパイラ型コード、インタプリタ型コード、バイナリ等）を解析する。これを行うために、解析執行エンジン２３０は、実行時にアプリケーションコードを取得する（ＡｐｐＭａｐデータベース２３１に設定された）命令２１０をコンピュータプラットフォーム２５５へと、インターネットプロトコル（ＩＰ）パケットをイーサネットバス２３２でインターフェース２１４を介して送信することによって実装する。実装される当該命令は、コンピュータプラットフォーム２５５にインストールされた、当該プラットフォーム２５５で実行されるプロセスの動作を監視するセキュリティ監視エージェントの一部として構成され得る。図２Ａでは、実装された命令２１０が、コンピューティングプラットフォーム２００において、アプリケーション空間２０６のランタイムサービス２０８とＣＰＵに通信可能に接続された実装パイプライン２１２との間に位置している。実装された命令２１０は、コンピューティングプラットフォーム２００に実装されたカーネル（システムコール）２１１にもアクセスする。前記解析執行エンジンは、実装された命令２１０（セキュリティ監視エージェント）で特定のデータ（アプリケーションコード）を取得したりＡｐｐＳｅｎｓｏｒ２３９でデータの解析やパッチの提供やその他の保護措置の実施を行ったりする際に、セキュリティ技術導入ガイド（ＳＴＩＧ）やユーザ設定に基づいたルールベースのポリシーを適用し得る。
【０１５７】
解析執行エンジン２３０は、取得したアプリケーションコードを、実装された命令２１０により（インターフェース２１４を介して）受け取る。ＡｐｐＳｅｎｓｏｒ２３９は、エンジン２３３，２３４，２３５，２３６，２３７と通信し、前記取得したアプリケーションコードの解析を実行する。これらのエンジンには、ユーザデータ検証２３４、インサイダー保護２３５、ファイルシステム監視２３６、および仮想保護２３７が含まれる。また、解析執行エンジン２３０は、実装された命令２１０により、アプリケーションコードの制御フロー２３３強化を実行し得る。例えば、解析執行エンジン２３０（例えば、インサイダー保護エンジン２３５、仮想保護エンジン２３７等）は、アプリケーションコードを（実装された命令２１０により）取得して受け取り、Ｓｐｅｃｔｒｅエクスプロイト／Ｍｅｌｔｄｏｗｎエクスプロイト／Ｆｏｒｅｓｈａｄｏｗエクスプロイトの攻撃を受け易い（例えば、境界外アクセスや分岐先インジェクションの攻撃を受け易い）命令列を有しているか否かについて（ＡｐｐＳｅｎｓｏｒ２１９で）解析し得る。
【０１５８】
このような命令列の検出に応答して、解析執行エンジン２３０（例えば、インサイダー保護エンジン２３５、仮想保護エンジン２３７等）は、脆弱性に対する処置を決定し得る。解析執行エンジン２３０は、ＡｐｐＭａｐデータベース２３１内の、前記脆弱性を有するアプリケーションコードを修正するための保護命令を、決定した前記処置に基づいて特定する。メインプロセッサメモリ２１３から（命令パイプライン２１２を介して）ＣＰＵのキャッシュへとアプリケーションコードが実行のためにフェッチされる際に、解析執行エンジン２３０は、実装された命令（セキュリティ監視エージェント）２１０により、当該アプリケーションコード（例えば、バイナリコード等）内に保護命令（パッチ）を配置し得る。例えば、境界外アクセス（Ｓｐｅｃｔｒｅ １型）の場合、実装された命令２１０は、アプリケーションが投機的実行エンジンにより順序外で実行されるのを阻止する保護フェンス命令を配置し得る。別の例として、分岐先インジェクション（Ｓｐｅｃｔｒｅ ２型）の場合、実装された命令２１０は、間接ジャンプ命令を直接コール命令へと変更し得る。また、解析執行エンジン２３０は、実装された命令２１０により、脆弱性のエクスプロイトを阻止するための別の動作を（インターフェース２１４を介して）実施するものであってもよい。さらなる別の例として、レイジーＦＰＵ状態復元の場合、実装された命令２１０は、ＢＩＯＳ設定を“ｅａｇｅｒｆｐｕ＝ｏｎ”に変更し得る。さらなる別の例として、実装された命令２１０は、投機的エンジンのデータキャッシュをセキュリティ領域の移行時にフラッシュし得る。
【０１５９】
プロセスの実行開始前に、解析執行エンジン２３０は、（ＡｐｐＳｅｎｓｏｒ２３９がファイルシステム監視エンジン２３６と通信することによって）各実行ファイルや各ライブラリのチェックサムを計算し、当該チェックサムを、プロセスファイルの有効なチェックサムを格納したシグネチャデータベースと照合する。チェックサムが一致しない場合、解析執行エンジン２３０は（インターフェース２１４を介して）、プロセスを終了させたり、プロセスを隔離領域に移動させたり、プロセスファイルの正当なコピーを復元したり、プロセスファイルを修正するための少なくとも１つのパッチをロードしたり、プロセスが悪意あるものであることをユーザに報告したりし得る。
【０１６０】
プロセスの実行開始時に、解析執行エンジン２３０は、（ＡｐｐＳｅｎｓｏｒ２３９がファイルシステム監視エンジン２３６と通信することによって）当該プロセスを一時保留し当該プロセスの各プロセスファイルをスキャンする。解析執行エンジン２３０は、スキャン対象のプロセスファイルについて、Ｓｐｅｃｔｒｅ／Ｍｅｌｔｄｏｗｎ／Ｆｏｒｅｓｈａｄｏｗなどの脆弱性のエクスプロイトで使われるシグネチャ（例えば、コンピューティングプラットフォーム２００でアプリケーションを処理するのに用いられるメモリ（例えば、データキャッシュ等）のフラッシュ動作等）をプロセスが含んでいるか否かを特定するための検査を行う。このようなシグネチャをプロセスが含んでいることが特定されると、解析執行エンジン２３０は、当該プロセスの実行中に、当該特定されたプロセスによるコールを取得解析する命令２１０を実装する。例えば、解析執行エンジン２３０は（例えば、ＡｐｐＳｅｎｓｏｒ２３９がファイルシステム監視エンジン２３６と通信する等によって）、当該取得したコールを当該実装された命令２１０により解析し、プロセスが前記シグネチャを定められたパターン（例えば、フラッシュ動作が特定の頻度又はスピードで行われること、特定の変数のキャッシュラインが他のキャッシュラインよりも高速で読み出されること等）に従って実行しているか否かを検出し得る。前記定められたパターンは、解析執行エンジン２３０により、ＡｐｐＭａｐ２３１データベースから取り出され得る。また、プロセスの実行中に、実装された命令２１０は、当該プロセスをリアルタイムで監視し当該プロセスが特権レベル命令でシステムレジスタ／カーネルレジスタ（例えば、Ｒｉｎｇ０内のＣＲ０、ＣＲ１、ＣＲ２、ＣＲ３等）を使用しているか否かを判定し得る。
【０１６１】
解析執行エンジン２３０は、プロセスの実行が前記定められたパターンを満たしているか又はシステムレジスタ／カーネルレジスタが特権レベル命令で使用されていると判断すると、（例えば、インターフェース２１４を介して制御フロー強化エンジン２３３等により）そのプロセスを終了させるか又は当該プロセスに関してその他の保護措置を実施する。解析執行エンジン２３０は、コンパイラ型コードに対する攻撃により生じた変化を確実に特定するための決定論的メカニズムを提供する。当該解析執行エンジン２３０は、バイナリコードや、インタプリタ型言語で記述されたコードも含め、アプリケーションスタック全体を保護する。解析執行エンジン２３０は、投機的実行により生じるＳｐｅｃｔｒｅ脆弱性やＭｅｌｔｄｏｗｎ脆弱性やＦｏｒｅｓｈａｄｏｗ脆弱性やその他の脆弱性を利用したエクスプロイトを阻止可能な技術を実行する。
【０１６２】
図２Ｂに、アプリケーションを実行する少なくとも１つのマイクロプロセッサに存在する脆弱性（Ｓｐｅｃｔｒｅ、Ｍｅｌｔｄｏｗｎ、Ｆｏｒｅｓｈａｄｏｗなど）からアプリケーションを保護する、例的な別のトラステッドエグゼキューションシステム２５０を示す。図２Ｂのシステム２５０は、解析執行エンジン（Ｖｉｒｓｅｃセキュリティプラットフォーム（ＶＳＰ）アプライアンスとも称される）２３０を実行して、前記少なくとも１つのマイクロプロセッサを含むウェブアプリケーションインフラストラクチャを保護する。図２Ｂのウェブアプリケーションインフラストラクチャ２０４では、ウェブサーバ２１６がユーザ２０２から（ウェブサービスクライアントを介して）ウェブ要求（例えば、ＨＴＴＰ要求等）を受信する。ウェブサーバ２１６は、ウェブ要求に含まれる情報（例えば、ＵＲＬ等）を用いてユーザ２０２を認証し、認証に成功すると、ユーザ２０２がウェブアプリケーションインフラストラクチャ２０４を介したサービスを享受するためのコネクション（又はセッション）を確立させる。アプリケーションサーバ２１８は、このコネクションを介したアプリケーション処理を処理することにより、データベースサーバと通信してデータ２２０にアクセスすることも含め、そのようなサービスをユーザ２０２に提供する。
【０１６３】
ウェブアプリケーションインフラストラクチャ２０４の少なくとも１つのコンポーネント（ウェブサーバ２１６、アプリケーションサーバ２１８およびデータベースサーバ２２０）は、投機的実行を用いる、脆弱性有りの前記少なくとも１つのマイクロプロセッサ上で実行され得る。ウェブアプリケーションインフラストラクチャ２０４がアプリケーション処理を実行している最中に、攻撃者は、投機的実行により生じる前記マイクロプロセッサの脆弱性（Ｓｐｅｃｔｒｅ、Ｍｅｌｔｄｏｗｎ、Ｆｏｒｅｓｈａｄｏｗなど）をエクスプロイトすることを試み得る。図２ＢのＶＳＰアプライアンス２３０は、コードがマイクロプロセッサのメモリで実行されている最中に、前記脆弱性に対する修正（パッチ）を実装する。このＶＳＰアプライアンスのさらなる情報については、“Systems and Methods for Remediating Memory Corruption in a Computer Application”（WO 2017/218872 A1）を参照されたい。これを行うために、ＶＳＰアプライアンス２３０は、ウェブサーバ２１６、アプリケーションサーバ２１８及びデータサーバ２２０の、前記脆弱性有りの少なくとも１つのマイクロプロセッサによってコードが実行されている最中に、当該コード（例えば、コンパイラ型コード、バイナリ等）をＡｐｐＳｅｎｓｏｒ（解析エンジン）により動的に解析する。一部の実施形態において、ＶＳＰアプライアンス２３０は、動的バイナリ解析エンジンを用いて、メインプロセッサメモリとマイクロプロセッサのＣＰＵとの間に関数又は命令を（ウェブインフラストラクチャ２０４にインストールされたセキュリティ監視エージェントの一部として）実装し得る。
【０１６４】
アプリケーションコードがマイクロプロセッサで実行されている際に、このような関数又は命令が実行されることで、アプリケーションのバイナリ（又はコンパイラ型コード）は、境界外アクセス、分岐先インジェクション、不正なデータキャッシュロードなどといったエクスプロイトの攻撃を受け易い命令を有しているか否かが決定論的に監視される。監視対象となる命令列は、ＶＳＰアプライアンス２３０の管理サーバ２４０のユーザインターフェース２４２を介してアドミニストレータにより設定されるＡｐｐＭａｐ２３１データベースなどから実装され得る。ＶＳＰアプライアンス２３０は、セキュリティ技術導入ガイド（ＳＴＩＧ）やユーザ設定に基づくルールベースのポリシーを用いて、アプリケーションを監視するための特定の命令を実装し得る。他の実施形態において、ＶＳＰアプライアンス２３０は、アプリケーションのコードの実行前に、当該コードがそのような命令を有しているか否かを（例えば、ＡｐｐＳｅｎｓｏｒ等により）静的に解析し得る。
【０１６５】
このようなエクスプロイトの攻撃を受け易い命令の検出に応答して、ＶＳＰアプライアンス２３０は（ＶＳＰの前記実装された命令又はセキュリティ監視エージェントを介して）、例えばセキュリティ監視エージェントにより実行される動的バイナリ計装エンジン等により、保護命令（パッチ）をリアルタイムでバイナリコードへと先制的に実装し得る。ＶＳＰアプライアンス２３０は、アプリケーションの実行中にメインプロセッサメモリからバイナリコードがフェッチされる際に、前記保護命令を実装する。例えば、ＶＳＰアプライアンス２３０は、前記命令列へとメモリバリア命令（例えば、フェンス命令等）を実装し得る。当該メモリバリア命令は、当該メモリバリア命令の前後に発行されるメモリ処理を順序どおり実行する制約を投機的実行エンジンに履行させることにより、境界外アクセスを阻止する。別の例として、ＶＳＰアプライアンス２３０は、間接ジャンプコールに代えて直接コール命令を実装し得る。これにより、投機的実行サイクル中の間接ジャンプコール命令の宛先として特定の宛先を選択することが可能になるように分岐予測器を攻撃者が誤訓練する、分岐先インジェクションが阻止される。また、ＶＳＰアプライアンス２３０は、投機的実行に用いられる分岐予測器と並行して正確な分岐予測を算出するスレッドを実行し、当該正確な分岐予測を用いて当該分岐予測器を、分岐先インジェクションエクスプロイトを受けないように再訓練し得る。
【０１６６】
攻撃者は、悪意あるプロセスを実行し、ウェブアプリケーションインフラストラクチャ２０４のアプリケーションに割り当てられたプロセスメモリのフラッシュ動作を連続的に実施することで、投機的実行により生じる脆弱性をエクスプロイトし得る。図２ＢのＶＳＰアプライアンス２３０は、ウェブアプリケーションインフラストラクチャ２０４におけるこのような悪意あるプロセスの有無を監視する。これを行うために、ＶＳＰアプライアンス２３０（例えば、ＡｐｐＳｅｎｓｏｒコンポーネント等）は、プロセスの実行開始時にプロセスファイルをスキャンし得る。ＶＳＰアプライアンス２３０は、各プロセスファイル（例えば、Ｍｉｃｒｏｓｏｆｔアプリケーションファイル等）のチェックサムを計算し、当該チェックサムを、プロセスファイルの有効なチェックサムを格納したシグネチャデータベースと照合する。チェックサムが一致しない場合、ＶＳＰアプライアンス２３０は、プロセスを終了させたり、プロセスを隔離領域に移動させたり、プロセスファイルの正当なコピーを復元したり、プロセスファイルを修正するための少なくとも１つのパッチをロードしたり、プロセスが悪意あるものであることをユーザに報告したりし得る。
【０１６７】
また、スキャン中に、ＶＳＰアプライアンス２３０は、プロセスがメモリのフラッシュ動作のシグネチャを含んでいるか否かを特定する。このようなシグネチャを当該プロセスが含んでいることが特定されると、当該プロセスの実行中にＶＳＰアプライアンス２３０の前記関数又は命令が実行されて、当該プロセスが前記シグネチャを定められたパターン（例えば、フラッシュ動作が特定の頻度又はスピードで行われること、特定の変数のキャッシュラインが他のキャッシュラインよりも高速で読み出されること等）に従って実行しているか否かを検出するよう当該プロセスのリアルタイムかつ決定論的な監視が行われる。前記定められたパターンは、ＶＳＰアプライアンス２３０の管理サーバ２４０のユーザインターフェース２４２を介してアドミニストレータにより設定されるＡｐｐＭａｐ２３１データベースなどから取り出され得る。また、プロセスの実行中に、ＶＳＰアプライアンス２３０は、当該プロセスをリアルタイムで監視し当該プロセスが特権レベル命令でシステムレジスタ／カーネルレジスタ（例えば、Ｒｉｎｇ０内のＣＲ０、ＣＲ１、ＣＲ２、ＣＲ３等）を使用しているか否かを判定する。
【０１６８】
プロセスが前記定められたパターンを満たしているか又は特権レベル命令がシステムレジスタ／カーネルレジスタで使用されている場合には、当該プロセスが投機的実行の脆弱性をエクスプロイトしようとしている悪意あるプロセスであるとＶＳＰアプライアンス２３０が判断し、前記ウェブアプリケーションインフラストラクチャの保護を実施する。他の実施形態において、当該保護措置は、プロセスを終了させることや、プロセスを隔離領域に移動させることや、プロセスファイルの正当なコピーを復元することや、プロセスファイルを修正するための少なくとも１つのパッチをロードすることや、プロセスが悪意あるものであることをユーザに報告することを含み得る。
【０１６９】
（悪意ある投機的実行に対する防御の方法）
【０１７０】
図３Ａに、コンピュータアプリケーションのＳｐｅｃｔｒｅ脆弱性／Ｍｅｌｔｄｏｗｎ脆弱性／Ｆｏｒｅｓｈａｄｏｗ脆弱性を仮想修正する例的な方法３００を示す。例的な実施形態では、図２Ａ及び図２Ｂの解析執行エンジン（ＶＳＰアプライアンス）２３０が方法３００を実行する。
【０１７１】
投機的実行エンジンによるコンピュータアプリケーションの実行前に、方法３００は、コンピュータアプリケーションのうち、投機的エンジンが順序外で実行する命令列を特定する（３０５）。一部の実施形態では、投機的実行エンジンがコンピュータアプリケーションのプロセスメモリまたは命令／コードキャッシュから中央演算処理装置（ＣＰＵ）に向けてアプリケーションコードを実行のためにディスパッチする際に、方法３００が、当該コードを（例えば、バイナリ解析エンジンを用いる等して）動的に解析することにより前記命令列を特定し得る。方法３００は、図２Ａ又は図２Ｂを参照しながら説明した動的解析を用い得る。他の実施形態において、方法３００は、アプリケーションの実行前に、当該アプリケーションのプロセスファイルをスキャンするなどして前記命令列を突き止め特定するものとされてもよい。
【０１７２】
前記投機的実行エンジンは、コンピュータアプリケーションのコードを実行するのに投機的実行を用いるマイクロプロセッサ（ＩｎｔｅｌやＡＭＤやＡＲＭによる一部のプロセッサを含む）であり得る。前記投機的実行エンジンは、図２Ａと同様のアーキテクチャで構成されたものであり得る。順序外実行により、Ｓｐｅｃｔｒｅ脆弱性や、Ｍｅｌｔｄｏｗｎ脆弱性や、Ｆｏｒｅｓｈａｄｏｗ脆弱性や、悪意ある攻撃者がセキュアなデータにアクセスするのにエクスプロイトし得るその他の脆弱性が生じ得る。一部の実施形態において、方法３００は、前記命令列が前記投機的実行エンジンにより順序外で実行される命令列であることを、このような命令列を規定したデータベース又はその他のメモリを参照することによって判断し得る。一部の実施形態において、方法３００は、前記投機的実行エンジンの実行パターンの機械学習により、前記命令列を判断し得る。例的な実施形態において、前記命令列は、アセンブリコードリピート命令：ＲＥＰ、ＲＥＰＮＺまたはＲＥＰＺを有するリピートストリング処理を含むものである。当該リピートストリング処理は、「ｉｆ−ｔｈｅｎ−ｅｌｓｅ」コードブロックを有し得る。また、前記方法は、コンピュータアプリケーションの間接分岐命令を特定し得る。
【０１７３】
方法３００は、前記命令列に対する処置であって、前記投機的実行エンジンに命令を順序どおり実行させる処置を決定する（３１０）。一部の実施形態において、方法３００は、前記投機的実行エンジンが命令キャッシュから中央演算処理装置（ＣＰＵ）に向けてコードを実行のためにディスパッチする際に、前記処置を決定し得る。他の実施形態において、方法３００は、アプリケーションの実行前に、当該アプリケーションのプロセスファイルをスキャンするなどして前記処置を突き止めて特定し得る。一部の実施形態において、方法３００は、順序外で実行されるその特定された命令列を当該特定された命令列に対する適切な処置へとマップするデータベース又はその他のメモリを参照することにより、前記処置を決定し得る。一部の実施形態において、方法３００は、前記投機的実行エンジンの実行パターンの機械学習により、命令列に対する前記処置を決定し得る。一部の実施形態において、前記処置は、前記命令列にメモリバリア命令を追加することを含み得て、当該メモリバリア命令は、前記投機的実行エンジンに、当該メモリバリア命令の前後に発行されるメモリ処理を順序どおり実行する制約を履行させる。このようなメモリバリア命令は、アセンブリコード命令：ＬＦＥＮＣＥ、ＭＦＥＮＣＥ、ＳＳＢＢまたはＣＳＤＢを有し得る。
【０１７４】
前記投機的実行エンジンによるコンピュータアプリケーションの実行中に、方法３００は、前記処置に基づいて前記命令列を変更する（例えば、仮想パッチを適用する）（３１５）。方法３００は、ステップ３２０にて、前記脆弱性のエクスプロイトによる前記コンピュータアプリケーションへの攻撃を阻止するために、元々特定された命令列の代わりに、変更された命令列を実行する。一部の実施形態において、方法３００（ステップ３１５，３２０）は、前記投機的実行エンジンが命令キャッシュから中央演算処理装置（ＣＰＵ）に向けてコードを実行のためにディスパッチする際に、前記命令列を変更し得る。例えば、方法３００は、バイナリ計装エンジンを用いて前記命令列を、ＣＰＵによる実行前に動的に変更し得る。方法３００は、図２Ａ又は図２Ｂを参照しながら説明した、命令の動的実装を用い得る。前記方法は、コンピュータアプリケーションへの攻撃を阻止するために、変更された前記命令列を実行する（３２０）。
【０１７５】
また、同様に、方法３００は、コンピュータアプリケーションの実行中に、特定された間接分岐命令を直接分岐命令に変更し得る。方法３００は、前記コンピュータアプリケーションへの攻撃を阻止するために、特定された間接分岐命令の代わりに、前記直接分岐命令を実行し得る。また、前記方法は、前記投機的実行エンジンの分岐予測器を再訓練することにより、間接分岐命令を用いた分岐先インジェクションを阻止し得る。
【０１７６】
図３Ｂに、本開示の一部の実施形態における、Ｓｐｅｃｔｒｅ／Ｍｅｌｔｄｏｗｎ／Ｆｏｒｅｓｈａｄｏｗのエクスプロイトを検出し阻止する例的な方法を示す。例的な実施形態では、図２ＡのＶＳＰアプライアンスまたは図２Ｂの解析執行エンジン２３０が方法３５０を実行する。
【０１７７】
方法３５０は、プロセスの実行開始時に、当該プロセスの実行を一時保留する（３５５）。次に、方法３５０は、一時保留されたプロセスが投機的実行攻撃の特徴を示すシグネチャを含んでいるか否かを判定する（３６０）。例えば、攻撃者は、コンピュータアプリケーションのコードの実行に用いられるプロセスメモリ（例えば、データキャッシュ等）の連続的なフラッシュ動作を実施する悪意あるプロセスを実行することにより、投機的実行の脆弱性（例えば、Ｓｐｅｃｔｒｅ、Ｍｅｌｔｄｏｗｎ、Ｆｏｒｅｓｈａｄｏｗ等）をエクスプロイトし得る。方法３５０は、プロセスファイルをスキャンし、一時保留されたプロセスがメモリのフラッシュ動作のそのようなシグネチャを含んでいると判断し得る。メモリのフラッシュ動作の前記シグネチャは、ＣＬＦＬＵＳＨアセンブリ命令や、ＭＣＲアセンブリ命令や、ＲＤＴＳＣアセンブリ命令を含み得る。そして、前記方法は、一時保留されたプロセスの実行を続行する（３６５）。プロセスが前記シグネチャを含んでいるとの判断に基づき、方法３５０は、当該プロセスを、投機的実行の脆弱性をエクスプロイトする挙動特徴を有しているか否か実行中に検査すべきプロセスであると特定する。
【０１７８】
実行中に、方法３５０は、プロセスが前記シグネチャを定められたパターンに従って実行しているか否かを検査する（３７０）。例えば、方法３５０は、プロセスがＣＬＦＬＵＳＨアセンブリ命令やＭＣＲアセンブリ命令やＲＤＴＳＣアセンブリ命令を呼び出し、実行中のアプリケーションに関連付けられたメモリ（例えば、データキャッシュ等）のフラッシュ動作を、投機的実行の脆弱性のエクスプロイトを示唆するような頻度、スピード、順番などで行っているか否かを検査し得る。一部の実施形態において、方法３５０は、このようなエクスプロイトの特徴を示すフラッシュ動作パターンを記憶したデータベース又はその他のメモリを参照することにより、前記定められたパターンを決定し得る。一部の実施形態において、方法３００は、投機的実行の脆弱性をエクスプロイトする悪意あるプロセスの実行パターンの機械学習により、前記定められたパターンを決定し得る。一部の実施形態において、方法３５０は、プロセスの実行中に、当該プロセスが前記シグネチャを前記定められたパターンに従って実行しているか否かを検査するように当該プロセスを動的に解析する。方法３５０は、図２Ａ又は図２Ｂを参照しながら説明した動的解析を用い得る。方法３５０は、実行が前記定められたパターンを満たした場合に前記プロセスを終了する（３７５）。
【０１７９】
（例的な保護シナリオ）
【０１８０】
図４Ａに、攻撃者が投機的実行により生じる脆弱性（Ｓｐｅｃｔｒｅ １型−境界チェックバイパス）をエクスプロイトする際の例的なシナリオ４００を示す。図４Ａでは、アプリケーションが、アプリケーションのファイル１０３と当該アプリケーションに割り当てられたプロセスメモリ４０６とを含むプラットフォーム上で実行される。当該プラットフォームは、さらに、投機的実行エンジンを含む。当該投機的実行エンジンは、コードキャッシュ２６１、データキャッシュ２９５、命令パイプライン１１２、およびプロセッサ（ＣＰＵ）４１４を有する。図４Ａの例的なシナリオ４００では、アプリケーションプロセスが、そのファイル１０３から実行されてプロセスメモリ４０６にロードされる。このアプリケーションプロセスは、「ｉｆ−ｔｈｅｎ」コードブロック４１８の命令を含む。このアプリケーションが前記投機的実行エンジンにより実行されると、「ｉｆ−ｔｈｅｎ」コードブロック４１８の命令がプロセスメモリ４０６から前記投機的実行エンジンのコードキャッシュ２６１に移動させられる。そして、前記投機的実行エンジンが、コードキャッシュ２６１からの各命令を、命令パイプライン１１２およびプロセッサ４１４へと実行のためにフェッチする。
【０１８１】
前記投機的実行エンジンは、後続の命令が先行する命令よりも先に順序外で実行されるように、命令パイプライン１１２内の命令の実行の順序を並び替える。例えば、「ｉｆ−ｔｈｅｎ」コードブロック１１８の「ｔｈｅｎ」命令（“ｙ＝ｒｅａｄ［ｘ］”）が、当該コードブロック１１８の「ｉｆ」命令（“ｉｆ（ｘ＜ａｒｒａｙ＿ｌｅｎ）”）よりも先に実行され得る。図４Ａにおいて前記投機的実行エンジンが前記先行する命令（例えば、“ｉｆ（ｘ＜ａｒｒａｙ＿ｌｅｎ）”等）の順番を変える理由は、当該先行する命令の実行に必要なデータが、前記投機的実行エンジンのメインメモリからデータキャッシュ２９５へと未だ供給されていないからである。例えば、“ａｒｒａｙ＿ｌｅｎ”の値がデータキャッシュ２９５に未だ存在していないのである。先行する命令（例えば、“ｉｆ（ｘ＜ａｒｒａｙ＿ｌｅｎ）”等）は、当該先行する命令を実行するためのそのデータ（例えば、“ａｒｒａｙ＿ｌｅｎ”の値等）が前記データキャッシュに供給されるまで、リオーダバッファ内に配置される。
【０１８２】
攻撃者４１６は、前記先行する命令（例えば、“ｉｆ（ｘ＜ａｒｒａｙ＿ｌｅｎ）”等）の実行を阻止し続けるために、キャッシュフラッシュ命令（ＣＬＦＬＵＳＨやＭＣＲ）や精密時間計測命令（ＲＤＴＳＣ）を用いるなどしてデータキャッシュからデータを繰返しクリアする。クリア動作が繰り返されることで、データ（例えば、“ａｒｒａｙ＿ｌｅｎ”等）が引き続き不在のままなので、前記先行する命令は前記リオーダバッファ内で待ち続ける。この間に、攻撃者２１６は、コードブロック４１８の後続の命令の変数（例えば、“ｘ”等）を特定して操作することにより、アプリケーションメモリのマッピング（例えば、“ｘ”のどの値が“ｙ”のどの値にマップしているか等）を不正に可視化させることが可能となる。この不正な可視化により、攻撃者２１６は、アプリケーションが処理するプライベートなデータ（例えば、クレジットカード番号）にアクセスすることが可能となる。
【０１８３】
図４Ｂに、本開示の一部の実施形態における、攻撃者が投機的実行により生じる脆弱性をエクスプロイトしないよう阻止する例的なシナリオを示す。図４Ｂにおいて、本発明の実施形態のセキュリティプラットフォーム１３０は、投機的実行エンジンにより順序が並び替えられるであろうコードブロック（例えば、コードブロック４１８等）の命令がプロセスメモリ４０６又はコードキャッシュ２６１から命令パイプライン１１２に向けてプロセッサ４１４へとディスパッチされる際に当該コードブロックを検出する命令を、当該プラットフォームに実装する。アプリケーションコードがプロセスメモリ４０６又はコードキャッシュ２６１からフェッチされて命令パイプライン１１２へと送信される際に、セキュリティプラットフォーム１３０は、その実装された命令を用いて、命令の実行の順序の並び替えを阻止する適切な命令を、そのコードブロック内に挿入する。例えば、「ｉｆ−ｔｈｅｎ」コードブロック４１８の場合、セキュリティプラットフォーム１３０は、メモリバリア命令（例えば、フェンス命令等）を命令列へと挿入する。当該メモリバリア命令は、前記投機的実行エンジンに、当該メモリバリア命令の前後に発行されるメモリ処理を順序どおり実行する制約を履行させる。追加されるこのようなメモリバリア命令の例には、アセンブリ命令：ＬＦＥＮＣＥ、ＭＦＥＮＣＥ、ＳＳＢＢ、ＣＳＤＢなどが含まれる。
【０１８４】
前記投機的実行エンジンは、この命令が挿入されると、命令パイプライン１１２内で命令の実行の順序を並び替えることができなくなる。そのため、前記投機的実行エンジンは、後続の命令の前にある先行する命令が実行されるまで、当該後続の命令の実行を待機させなければならない。よって、先行する命令（例えば、“ｉｆ（ｘ＜ａｒｒａｙ＿ｌｅｎ）”等）の実行に必要なデータが前記投機的実行エンジンのメインメモリからデータキャッシュ２９５へと未だ供給されていないのであれば、このデータが供給されるまで、後続の命令は前記パイプライン内に待機したままとなる。例えば、“ａｒｒａｙ＿ｌｅｎ”の値がデータキャッシュ２９５に未だ存在していないのである。したがって、この変数を含む命令（例えば、“ｉｆ（ｘ＜ａｒｒａｙ＿ｌｅｎ）”等）が命令パイプライン１１２内で実行を待つことになるだけでなく、コードブロックにおいて当該命令よりも後になる残りの命令（例えば、（“ｙ＝ｒｅａｄ［ｘ］”）等）も、当該命令以降での実行を命令パイプライン１１２内で待つことになる。
【０１８５】
攻撃者４１６がキャッシュフラッシュ命令（ＣＬＦＬＵＳＨ）や精密時間計測命令（ＲＤＴＳＣ）を用いるなどしてデータキャッシュからデータを繰返しクリアしたとしても、コードブロックの命令が順序外で実行されることはない。よって、攻撃者４１６は、コードブロック４１８の後続の命令の変数（例えば、“ｘ”等）を特定して操作しアプリケーションメモリのマッピング（例えば、“ｘ”のどの値が“ｙ”のどの値にマップしているか等）を不正に可視化させるための脆弱性をエクスプロイトする機会を失う。
【０１８６】
また、セキュリティプラットフォーム１３０は、キャッシュフラッシュ命令（ＣＬＦＬＵＳＨ）や精密時間計測命令（ＲＤＴＳＣ）を含んでいると判断されたプロセスの挙動を検査するための命令を実装し得る。セキュリティプラットフォーム１３０は、このようなプロセスを、当該プロセスの開始時に当該プロセスのファイルをスキャンすることによって判定し得る。アプリケーションの実行中に、このようなプロセスがデータキャッシュ２９５を定められたパターン（例えば、頻度、スピード等）に従ってフラッシュした場合には、セキュリティプラットフォーム１３０が、当該プロセスを攻撃者４１６の悪意あるプロセスであるとして特定し当該プロセスを終了し得る。
【０１８７】
図５に、本開示の実施形態が実現され得るコンピュータネットワーク又は同様のデジタル処理環境を示す。
【０１８８】
少なくとも１つのクライアントコンピュータ／装置５０および少なくとも１つのサーバコンピュータ６０は、アプリケーションプログラムなどを実行する処理装置、記憶装置および入出力装置を提供する。少なくとも１つのクライアントコンピュータ／装置５０は、さらに、他のコンピューティングデバイス（他のクライアント装置／プロセス５０および１つ以上のサーバコンピュータ６０を含む）へと通信ネットワーク７０を介して接続され得る。通信ネットワーク７０は、リモートアクセスネットワーク、グローバルネットワーク（例えば、インターネット等）、世界中のコンピュータの集まり、ローカルアエリア又はワイドエリアネットワーク、および現在それぞれのプロトコル（ＴＣＰ／ＩＰ、Ｂｌｕｅｔｏｏｔｈ（登録商標）など）を用いて互いに通信するゲートウェイの一部であり得る。それ以外の電子デバイス／コンピュータネットワークアーキテクチャも好適である。
【０１８９】
クライアントコンピュータ／装置５０は、ＶＳＰアプライアンスのうちの、セキュリティ監視エージェントとして構成され得る。サーバコンピュータ６０は、ＶＳＰアプライアンスのうちの、クライアント装置（すなわち、セキュリティ監視エージェント）５０と通信してデータベースインジェクション攻撃を検出する解析エンジンやＡｐｐＳｅｎｓｏｒとして構成され得る。サーバコンピュータ６０同士は、別々のサーバコンピュータではなくクラウドネットワーク７０の一部とされてもよい。一部の実施形態において、前記サーバコンピュータは、コンピュータ命令のセットを解析したり、適用すべき１つ以上の処置（パッチ）を特定したり、１つ以上のパッチをコンピュータ命令に適用したりし得る。クライアント（セキュリティ監視エージェント）５０は、サーバ（解析エンジン又はＡｐｐＳｅｎｓｏｒ）６０に対してパッチやパッチの要求を通信し得る。一部の実施形態において、クライアント５０は、要求やクエリを取得したりパッチが必要な投機的実行の脆弱性を検出したりパッチを提供したりする、当該クライアント（例えば、セキュリティ監視エージェント等）５０上で実行されるクライアントアプリケーション又はコンポーネントを含み得る。クライアント５０は、このような情報をサーバ（例えば、解析エンジン等）６０に通信し得る。
【０１９０】
図６は、図５のコンピュータシステムにおけるコンピュータ（例えば、クライアントプロセッサ／装置５０、サーバコンピュータ６０等）の例的な内部構造の図である。それぞれのコンピュータ５０，６０は、コンピュータ又は処理システムの構成要素間でのデータ伝送に利用される一連のハードウェアラインであるシステムバス７９を備える。システムバス７９は、本質的に、コンピュータシステムの相異なる構成要素（例えば、プロセッサ、ディスクストレージ、メモリ、入出力ポート、ネットワークポート等）同士を接続して当該構成要素間での情報の伝送を可能にする共有の導管である。システムバス７９には、様々な入出力装置（例えば、キーボード、マウス、ディスプレイ、プリンタ、スピーカ等）をコンピュータ５０，６０に接続するための入出力装置インターフェース８２が取り付けられている。ネットワークインターフェース８６は、コンピュータが、ネットワーク（例えば、図５のネットワーク７０等）に取り付けられた様々な他の装置へと接続することを可能にする。メモリ９０は、本開示の一実施形態を実現する（例えば、投機的実行による脆弱性を有するアプリケーションコードに対して処置やパッチを適用等する）のに用いられるコンピュータソフトウェア命令９２およびデータ９４を記憶する揮発性の記憶部である。ディスクストレージ９５は、本開示の一実施形態を実現するのに用いられるコンピュータソフトウェア命令９２およびデータ９４を記憶する不揮発性の記憶部である。システムバス７９には、さらに、コンピュータ命令を実行する中央演算処理装置８４が取り付けられている。
【０１９１】
本発明の実施形態または態様は、ハードウェア回路を含む（但し、これに限定されない）ハードウェアの形態でも、ファームウェアの形態でも、ソフトウェアの形態でも実現されてよい。ソフトウェアで実現された場合、当該ソフトウェアは、プロセッサに当該ソフトウェア又は当該ソフトウェアの命令の一部をロードさせることが可能であるように構成された任意の非過渡的なコンピュータ読取り可能媒体に記憶されたものとされ得る。そして、プロセッサがこれらの命令を実行することにより、本明細書で説明した様式で装置が動作することになるか又は装置をそのように動作させる構成となっている。
【０１９２】
また、本明細書では、ハードウェア、ファームウェア、ソフトウェア、ルーチンまたは命令が、データプロセッサの特定の動作および／または機能を実行するかの如く説明しているかもしれない。しかしながら、本明細書に含まれるこのような説明はあくまでも便宜上のものに過ぎず、実際には、コンピューティングデバイス、プロセッサ、コントローラまたはその他の装置が当該ファームウェア、ソフトウェア、ルーチン、命令などを実行することによってそのような動作が生じるという点を理解されたい。
【０１９３】
フロー図、ブロック図およびネットワーク図は、構成要素の数が増えても減ってもよいし、配置が異なってもよいし、表現が異なってもよいと理解されたい。ただし、実施の方法によってはブロック図やネットワーク図が決まっており、実施形態の実施を示すブロック図やネットワーク図の数も特定の数になり得るという点も理解されたい。
【０１９４】
つまり、様々なコンピュータアーキテクチャ及び／又は物理コンピュータ及び／又は仮想コンピュータ及び／又はクラウドコンピュータ及び／又はこれらの所与の組合せにより、さらなる実施形態が実現し得る。したがって、本明細書で説明したデータプロセッサは、あくまでも例示目的に意図されたものあり、実施形態を限定するものではない。
【０１９５】
例的な実施形態について具体的に図示説明したが、当業者であれば、添付の特許請求の範囲に包含された実施形態の範囲を逸脱しない範疇で形態や細部に様々な変更が施されてもよいことが分かるであろう。
【図１Ａ】
2021511571.tif 000005
【図１Ｂ】
2021511571.tif 000006
【図１Ｃ】
2021511571.tif 000007
【図１Ｄ】
2021511571.tif 000008
【図１Ｅ】
2021511571.tif 000009
【図１Ｆ】
2021511571.tif 000010
【図１Ｇ】
2021511571.tif 000011
【図１Ｈ】
2021511571.tif 000012
【図１Ｉ】
2021511571.tif 000013
【図１Ｊ】
2021511571.tif 000014
【図２Ａ】
2021511571.tif 000015
【図２Ｂ】
2021511571.tif 000016
【図３Ａ】
2021511571.tif 000017
【図３Ｂ】
2021511571.tif 000018
【図４Ａ】
2021511571.tif 000019
【図４Ｂ】
2021511571.tif 000020
【図５】
2021511571.tif 000021
【図６】
2021511571.tif 000022
【国際調査報告】
2021511571.tif 000023
2021511571.tif 000024
2021511571.tif 000025
2021511571.tif 000026
2021511571.tif 000027