(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2023-05-23
(45)【発行日】2023-05-31
(54)【発明の名称】投機的実行のエクスプロイトに対する防御
(51)【国際特許分類】
G06F 9/38 20180101AFI20230524BHJP
G06F 21/55 20130101ALI20230524BHJP
G06F 9/30 20180101ALI20230524BHJP
G06F 9/318 20180101ALI20230524BHJP
G06F 9/32 20180101ALI20230524BHJP
G06F 12/0862 20160101ALI20230524BHJP
【FI】
G06F9/38 310F
G06F21/55 360
G06F9/38 330A
G06F9/30 380Z
G06F9/318 C
G06F9/32 320C
G06F9/32 330A
G06F12/0862 110
(21)【出願番号】P 2020538703
(86)(22)【出願日】2019-01-11
(86)【国際出願番号】 US2019013318
(87)【国際公開番号】W WO2019140274
(87)【国際公開日】2019-07-18
【審査請求日】2021-12-27
(32)【優先日】2018-01-17
(33)【優先権主張国・地域又は機関】US
(32)【優先日】2018-01-12
(33)【優先権主張国・地域又は機関】US
(73)【特許権者】
【識別番号】516074252
【氏名又は名称】ヴァーセック・システムズ・インコーポレーテッド
【氏名又は名称原語表記】VIRSEC SYSTEMS,INC.
(74)【代理人】
【識別番号】100087941
【氏名又は名称】杉本 修司
(74)【代理人】
【識別番号】100112829
【氏名又は名称】堤 健郎
(74)【代理人】
【識別番号】100142608
【氏名又は名称】小林 由佳
(74)【代理人】
【識別番号】100154771
【氏名又は名称】中田 健一
(74)【代理人】
【識別番号】100155963
【氏名又は名称】金子 大輔
(74)【代理人】
【識別番号】100150566
【氏名又は名称】谷口 洋樹
(74)【代理人】
【識別番号】100213470
【氏名又は名称】中尾 真二
(74)【代理人】
【識別番号】100220489
【氏名又は名称】笹沼 崇
(72)【発明者】
【氏名】グプタ・サチャ・ヴイ
【審査官】漆原 孝治
(56)【参考文献】
【文献】米国特許第09058492(US,B1)
【文献】米国特許出願公開第2009/0089564(US,A1)
【文献】米国特許出願公開第2011/0289300(US,A1)
【文献】米国特許第09436603(US,B1)
【文献】特表2017-522641(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 9/38
G06F 21/55
G06F 9/30
G06F 9/318
G06F 9/32
G06F 12/0862
(57)【特許請求の範囲】
【請求項1】
(i)投機的実行エンジンによるコンピュータアプリケーションの実行前に、
前記コンピュータアプリケーションのうち、前記投機的実行エンジンが順序外で命令を実行する命令列を特定する過程と、
前記命令列に対する処置であって、前記投機的実行エンジンに前記命令を順序どおり実行させる処置を決定する過程と、
(ii)前記投機的実行エンジンによる前記コンピュータアプリケーションの実行中に、
前記処置に基づいて前記命令列を変更する過程と、
前記コンピュータアプリケーションへの攻撃を阻止するために、特定された前記命令列の代わりに、変更された前記命令列を実行する過程と、
を備える、コンピュータに実装される方法。
【請求項2】
請求項1に記載の方法において、前記命令列が、リピートストリング処理を含む、方法。
【請求項3】
請求項2に記載の方法において、前記リピートストリング処理が、アセンブリコードリピート命令:REP、REPNZまたはREPZを有する、方法。
【請求項4】
請求項2に記載の方法において、前記リピートストリング処理が、if-then-elseコードブロックを有する、方法。
【請求項5】
請求項1に記載の方法において、前記処置が、特定された前記命令列にメモリバリア命令を追加することを含み、当該メモリバリア命令は、前記投機的実行エンジンに、当該メモリバリア命令
の前後に発行されるメモリ処理を順序どおり実行する制約を履行させる、方法。
【請求項6】
請求項5に記載の方法において、前記メモリバリア命令が、アセンブリコード命令:LFENCE、MFENCE、SSBBまたはCSDBである、方法。
【請求項7】
請求項5に記載の方法において、さらに、
追加されたメモリバリア命令へのジャンプを、攻撃の可能性があるとしてユーザに報告する過程、
を備える、方法。
【請求項8】
請求項1に記載の方法において、さらに、
(i)前記投機的実行エンジンによる前記コンピュータアプリケーションの実行前に、
間接分岐命令のエクスプロイトを可能にする不正確な分岐予測を算出するように誤訓練された、前記投機的実行エンジンの分岐予測器を検出する過程と、
誤訓練された前記分岐予測器の検出に基づいて、前記コンピュータアプリケーションの間接分岐命令を特定する過程と、
(ii)前記投機的実行エンジンによる前記コンピュータアプリケーションの実行中に、
特定された前記間接分岐命令を直接分岐命令に変更する過程と、
前記コンピュータアプリケーションへの攻撃を阻止するために、特定された前記間接分岐命令の代わりに、前記直接分岐命令を実行する過程と、
を備える、方法。
【請求項9】
請求項8に記載の方法において、さらに、
誤訓練された前記分岐予測器と並行して、正確な分岐予測を算出する過程と、
算出された前記正確な分岐予測を用いて、誤訓練された前記分岐予測器を再訓練する過程と、
を備える、方法。
【請求項10】
コンピュータメモリに接続されたプロセッサを備える、コンピュータシステムであって、
前記プロセッサは、
(i)投機的実行エンジンによるコンピュータアプリケーションの実行前に、
前記コンピュータアプリケーションのうち、前記投機的実行エンジンが順序外で命令を実行する命令列を特定し、
前記命令列に対する処置であって、前記投機的実行エンジンに前記命令を順序どおり実行させる処置を決定し、
(ii)前記投機的実行エンジンによる前記コンピュータアプリケーションの実行中に、
前記処置に基づいて前記命令列を変更し、
前記コンピュータアプリケーションへの攻撃を阻止するために、特定された前記命令列の代わりに、変更された前記命令列を実行する、
ように構成されている、システム。
【請求項11】
請求項10に記載のシステムにおいて、前記命令列が、リピートストリング処理を含む、システム。
【請求項12】
請求項11に記載のシステムにおいて、前記リピートストリング処理が、アセンブリコードリピート命令:REP、REPNZまたはREPZを有する、システム。
【請求項13】
請求項11に記載のシステムにおいて、前記リピートストリング処理が、if-then-elseコードブロックを有する、システム。
【請求項14】
請求項10に記載のシステムにおいて、前記処置が、特定された前記命令列にメモリバリア命令を追加することを含み、当該メモリバリア命令は、前記投機的実行エンジンに、当該メモリバリア命令
の前後に発行されるメモリ処理を順序どおり実行する制約を履行させる、システム。
【請求項15】
請求項14に記載のシステムにおいて、前記メモリバリア命令が、アセンブリコード命令:LFENCE、MFENCE、SSBBまたはCSDBである、システム。
【請求項16】
請求項14に記載のシステムにおいて、前記プロセッサは、さらに、追加されたメモリバリア命令へのジャンプを、攻撃の可能性があるとしてユーザに報告するように構成されている、システム。
【請求項17】
請求項10に記載のシステムにおいて、前記プロセッサは、さらに、
(i)前記投機的実行エンジンによる前記コンピュータアプリケーションの実行前に、
間接分岐命令のエクスプロイトを可能にする不正確な分岐予測を算出するように誤訓練された、前記投機的実行エンジンの分岐予測器を検出し、
誤訓練された前記分岐予測器の検出に基づいて、前記コンピュータアプリケーションの間接分岐命令を特定し、
(ii)前記投機的実行エンジンによる前記コンピュータアプリケーションの実行中に、
特定された前記間接分岐命令を直接分岐命令に変更し、
前記コンピュータアプリケーションへの攻撃を阻止するために、特定された前記間接分岐命令の代わりに、前記直接分岐命令を実行する、
ように構成されている、システム。
【請求項18】
請求項17に記載のシステムにおいて、前記プロセッサは、さらに、
誤訓練された前記分岐予測器と並行して、正確な分岐予測を算出し、
算出された前記正確な分岐予測を用いて、誤訓練された前記分岐予測器を再訓練する、
ように構成されている、システム。
【請求項19】
(i)プロセスの実行開始時に、
前記プロセスの実行を一時保留する過程と、
一時保留された前記プロセスがメモリのフラッシュ動作のシグネチャを含んでいるか否かを判定する過程と、
一時保留された前記プロセスの実行を続行する過程と、
(ii)前記プロセスがメモリのフラッシュ動作の前記シグネチャを含んでいる場合、前記実行中に、
前記プロセスがメモリのフラッシュ動作の前記シグネチャを定められたパターンに従って実行しているか否かを動的に検査する過程と、
前記実行が前記定められたパターンを満たした場合、前記プロセスの保護措置を実施する過程と、
を備える、コンピュータに実装される方法。
【請求項20】
請求項19に記載の方法において、メモリのフラッシュ動作の前記シグネチャが、CLFLUSH、RDTSCおよびMCRアセンブリ命令のうちの少なくとも1つのパターンを含む、方法。
【請求項21】
請求項19に記載の方法において、前記定められたパターンが、前記メモリの前記フラッシュ動作の頻度及びスピードの尺度を含む、方法。
【請求項22】
請求項19に記載の方法において、前記定められたパターンは、前記プロセス
がCLFLUSHまたはMCR命令を実行する回数の閾値である、方法。
【請求項23】
請求項19に記載の方法において、さらに、
キャッシュにおける所与の変数のキャッシュラインが他のキャッシュラインよりも高速で繰返し前記プロセスにより読み出された場合に、前記プロセスを終了する過程、
を備える、方法。
【請求項24】
請求項19に記載の方法において、さらに、
前記プロセスが特権レベル命令をシステムレジスタで実行することを試みた場合に、前記プロセスを終了する過程、
を備える、方法。
【請求項25】
請求項19に記載の方法において、前記保護措置が、前記プロセスの終了、隔離領域への前記プロセスの移動、
前記プロセス
のファイルを修正するための少なくとも1つのパッチのロード、および前記プロセスが悪意あるものであることのユーザへの報告のうちの少なくとも1つである、方法。
【請求項26】
コンピュータメモリに接続されたプロセッサを備える、コンピュータシステムであって、
前記プロセッサは、
(i)プロセスの実行開始時に、
前記プロセスの実行を一時保留し、
一時保留された前記プロセスがメモリのフラッシュ動作のシグネチャを含んでいるか否かを判定し、
一時保留された前記プロセスの実行を続行し、
(ii)前記プロセスがメモリのフラッシュ動作の前記シグネチャを含んでいる場合、前記実行中に、
前記プロセスがメモリのフラッシュ動作の前記シグネチャを定められたパターンに従って実行しているか否かを動的に検査し、
前記実行が前記定められたパターンを満たした場合、前記プロセスの保護措置を実施する、
ように構成されている、システム。
【請求項27】
請求項26に記載のシステムにおいて、メモリのフラッシュ動作の前記シグネチャが、CLFLUSH、RDTSCおよびMCRアセンブリ命令のうちの少なくとも1つのパターンを含む、システム。
【請求項28】
請求項26に記載のシステムにおいて、前記定められたパターンが、前記メモリの前記フラッシュ動作の頻度及びスピードの尺度を含む、システム。
【請求項29】
請求項26に記載のシステムにおいて、前記定められたパターンは、前記プロセス
がCLFLUSHまたはMCR命令を実行する回数の閾値である、システム。
【請求項30】
請求項26に記載のシステムにおいて、前記プロセッサは、さらに
、キャッシュにおける所与の変数のキャッシュラインが他のキャッシュラインよりも高速で繰返し前記プロセスにより読み出された場合に、前記プロセスを終了するように構成されている、システム。
【請求項31】
請求項26に記載のシステムにおいて、前記プロセッサは、さらに、前記プロセスが特権レベル命令をシステムレジスタで実行することを試みた場合に、前記プロセスを終了するように構成されている、システム。
【請求項32】
請求項26に記載のシステムにおいて、前記保護措置が、前記プロセスの終了、隔離領域への前記プロセスの移動、
前記プロセス
のファイルを修正するための少なくとも1つのパッチのロード、および前記プロセスが悪意あるものであることのユーザへの報告のうちの少なくとも1つである、システム。
【発明の詳細な説明】
【関連出願】
【0001】
本願は、2018年1月12日付出願の米国仮特許出願第62/616,786号および2018年1月17日付出願の米国仮特許出願第62/618,508号の利益を主張する。上記出願の全教示内容は、参照をもって本明細書に取り入れたものとする。
【背景技術】
【0002】
CPUのデータキャッシュの時間計測によって、投機的実行時に情報が効率的に漏洩しうるということが最近分かった。このような脆弱性により、各種コンテキストのローカルセキュリティ境界を跨いだ任意の仮想メモリアクセスが、短時間といえども可能になり得る。悪意ある人物が、このような任意の仮想メモリアクセスを悪用する可能性がある。投機的実行を用いる今日の数多くのマイクロプロセッサに影響を及ぼすことが分かっているこれらの脆弱性には、様々な種類のものがある。そのようなマイクロプロセッサには、IntelやAMDやARMによる一部のプロセッサが含まれる。これらの装置は、アプリケーションコードの条件付き実行に伴う遅延を軽減するために、20年超ものあいだ投機的実行や分岐予測を利用してきた。しかし、上記の方法により、セキュリティ領域間の隔絶を打ち破るセキュリティ上の抜け道を通って秘匿のアプリケーションデータを流出させられるということが発見された。
【0003】
判明した第1の攻撃型は、このようなプロセッサにおける、境界チェックバイパス(境界チェックのすり抜け)を背景とした脆弱性である。判明した第2の攻撃型は、このようなプロセッサにおける、分岐先インジェクション(分岐先の書換え)を背景とした脆弱性である。判明した第3の攻撃型は、このようなプロセッサにおける、不正なデータキャッシュロード(不正なデータキャッシュ読出し)を背景とした脆弱性をエクスプロイトするものである。判明した第4の攻撃型は、このようなプロセッサにおける、投機的ストアバイパスを背景とした脆弱性をエクスプロイトするものである。第1の攻撃型には、ストアの境界チェックバイパスを背景とした脆弱性の亜種、読取り専用保護バイパスを背景とした脆弱性の亜種、および不正なシステムレジスタ読取りを背景とした脆弱性の亜種が含まれる。第1、第2および第4の攻撃型はまとめて「Spectre」と一般的に称され、第3の攻撃型は「Meltdown」と一般的に称される。Spectreには、さらに、このようなプロセッサにおける、中央演算処理装置(CPU)のリターンスタックバッファを背景とした脆弱性をエクスプロイトするリターンスタックバッファ(RSB)攻撃型が含まれる。Spectreには、さらに、このようなプロセッサにおける、レイジーx87浮動小数点演算装置(FPU)状態復元を背景とした脆弱性をエクスプロイトするSpectre NGS攻撃型が含まれる。別の攻撃型には、「Foreshadow」と一般的に称されるものもある。Foreshadow SGXエンクレーブ侵入型は、このようなプロセッサにおける、Intelソフトウェアガードエクステンション(SGX)エンクレーブの暗号化データを背景とした脆弱性である。Foreshadow-NG-1型およびForeshadow-NG-2型は、このようなプロセッサにおける、クラウドサービス上で動作する仮想マシン(VM)やハイパーバイザーを背景とした脆弱性である。
【0004】
Spectre脆弱性、Meltdown脆弱性およびForeshadow脆弱性は、データセンターやクラウドのほぼ全てのサーバやアプリケーションシステムに存在するマイクロプロセッサ欠陥であり、企業システムにとって近年見られたなかで最も大きい衝撃となっている。これらの欠陥は、プロセスの複数のスレッド間の隔絶や、複数のアプリケーションプロセス間の隔絶や、複数の仮想マシン間の隔絶を破壊すると同時に、CPUが処理するデータも流出させる。最も影響を受けるのは、共有環境やクラウドサービスである。というのも、これらのシステムは、ユーザ間の隔絶を保ちながらマルチテナント環境で動作するように設計されているからである。WannacryやEquifaxと同様の影響を回避するため、これらの欠陥の修正は、IT担当者やセキュリティ担当者の最優先事項になっている。
【0005】
SpectreやMeltdownやForeshadowが持つリスクに対する懸念は業界全体が共有しているものの、企業ITチームはメーカーがリリースした利用可能なパッチをデプロイすることに慎重である。パッチのなかには、カーネルのクラッシュを引き起こしたものもある。CPUベンダーやOSベンダーがリリースしたパッチのなかには、30%もの許容できないパフォーマンス低下を招いたものもある。これらのパッチは、マイクロコードの更新だけでなくOSの変更も要求する。ソフトウェアのパッチでは、問題に対処できない。というのも、アプリケーションの再コーディングや再コンパイルやマイクロコードの更新が大量に必要となるからである。このようなパッチのなかには、リブートをしばしば引き起こしたり、古いコンピュータを使えなくしたり、重要なメモリデータ構造の投機的実行やフラッシュ動作の無効化による許容できない程のパフォーマンス低下を招いたりしたものもある。そのほかにも、滅多に生じないエラーメッセージや、サーバへのログオンの困難化や、アドミンコンソールの問題が報告されている。
【発明の概要】
【発明が解決しようとする課題】
【0006】
上記の攻撃型に対処する最新のマイクロコード再設計では、機能上の重大なアプリケーション異常や応答時間の低速化が生じた。チップのマイクロコードを更新しようとすると、意図しない結果を招く可能性がさらに高くなったり、多くの環境で過度の不安定性が発生したりする。チップレベルの脆弱性を修正することは、簡単なことではない。数多くのレベルで修正をインストールする必要があり、マイクロコードからカーネル、オペレーティングシステム、ハイパーバイザー、ライブラリなどといったあらゆる物を、影響を受ける全てのシステムについて更新するという膨大なIT計画へ発展することになる。マイクロコードの更新は、しばしば高リスクである。一つの間違いで、コンピュータが使用不能になり得る。そのため、プロセッサ業界としては、これらの脆弱性を持たない新たなCPUの開発を急ぐことを約束するほか選択肢がほぼない。これは長期的にみれば解決策になり得るが、数十億ものチップを交換するには何年もかかり、長期にわたって悪意ある人物達に好機を与えることになる。
【課題を解決するための手段】
【0007】
本発明の実施形態は、過去のアプローチとは異なり、Spectre、Meltdown、Foreshadowなどの攻撃型によるエクスプロイトからのアプリケーションの保護を、これらの攻撃型に対する脆弱性を有する中央演算処理装置(CPU)上でそのアプリケーションコードが実行されている最中に(リアルタイムで)即座に行う。実施形態は、アプリケーション空間と投機的実行エンジンの処理コンポーネントとの間に機能を実装し、動的バイナリ解析エンジンやプロセス生成通知インターフェースやプロセス終了通知インターフェースを用いるなどして当該機能を実行する。これらの機能は、アプリケーションコードがCPUで実行されている最中に、Spectre脆弱性やMeltdown脆弱性やForeshadow脆弱性に関係した挙動をリアルタイムで決定論的に検出するように構成されている。例えば、これらの機能は、アプリケーションのうちの投機的実行の影響を受けるコードセグメントや、投機的実行の脆弱性をエクスプロイトするサイドチャネルの特徴を示すシグネチャパターンを検出するように、当該アプリケーションを(当該アプリケーションがCPUで実行されている最中に)決定論的に監視し得る。実施形態は、その検出に基づき、このような脆弱性やアプリケーションへのエクスプロイト試行に対して先制的にリアルタイムで対応し得る。例えば、実施形態は、アプリケーションの実行中に、このような脆弱性をなくすように、あるいは、投機的実行エンジンの分岐予測を再訓練するように、あるいは、このような脆弱性のエクスプロイトのシグネチャを示すプロセスを終了させるように、アプリケーションコードを(ディスクではなくメモリに直接)バイナリレベルで修正し得る。
【0008】
実施形態は、アプリケーションに対するソフトウェア、カーネル又はマイクロコードのパッチや、カーネル又はマイクロコードに対するその他の破壊的変更や、CPUをリセットさせるイベントを必要としないので、SpectreやMeltdownやForeshadowや他のそのような脆弱性からアプリケーションを保護する際にリスクが全く伴わない。また、実施形態は、アプリケーションを実行するシステムにその実行中のアプリケーションの脆弱性の修正をまかせないので、当該システムは、互換性や安定性を心配することなくパフォーマンスレベルを許容範囲内に維持することができる。また、実施形態は、ベンダーのパッチが一般的に存在しない部分や、実行する処理の目的重要度からみてベンダーのパッチがこれまでインストールされてこなかった又はインストール可能でない部分にも保護を拡げることにより、上記脆弱性によるデータ流出のリスクを軽減させることができる。
【0009】
実施形態は、投機的実行エンジンにより実行されるコンピュータアプリケーションを脆弱性(例えば、Spectre、Meltdown等)が原因でエクスプロイトされないよう保護するコンピュータシステム、方法およびプログラムプロダクトに向けられている。当該システム、方法およびプログラムプロダクトは、投機的実行エンジンによるコンピュータアプリケーションの実行前に、前記コンピュータアプリケーションのうち、前記投機的実行エンジンが順序外で命令を実行する命令列、あるいは、前記投機的実行エンジンが特権昇格を悪用する際の命令列を特定する。例的な一実施形態において、前記命令列は、配列からなるユーザ操作入力を処理するものである。例的な実施形態において、前記配列の処理は、アセンブリコードリピート命令:REP、REPNZまたはREPZを有する。例的な実施形態において、前記リピートストリング処理は、if-then-elseコードブロックを有する。前記システム、方法およびプログラムプロダクトは、前記命令列に対する処置であって、前記投機的実行エンジンに前記命令を順序外で実行させないための処置を決定する。例的な一実施形態において、前記処置は、特定された前記命令列にメモリバリア命令を追加することを含み、当該メモリバリア命令は、前記投機的実行エンジンに、当該メモリバリア命令の前後に発行されるメモリ処理を順序どおり実行する制約を履行させる。例的な実施形態において、前記メモリバリア命令は、アセンブリコード命令:LFENCE、MFENCE、SSBBまたはCSDBである。
【0010】
前記システム、方法およびプログラムプロダクトは、前記投機的実行エンジンによる前記コンピュータアプリケーションの実行中に、前記処置に基づいて前記命令列を変更する。前記システム、方法およびプログラムプロダクトは、前記コンピュータアプリケーションへの攻撃を阻止するために、特定された前記命令列の代わりに、変更された前記命令列を実行する。一部の実施形態において、前記システム、方法およびプログラムプロダクトは、追加されたメモリバリア命令へのジャンプを、攻撃の可能性があるとしてユーザに報告する。
【0011】
一部の実施形態において、前記システム、方法およびプログラムプロダクトは、投機的実行エンジンによるコンピュータアプリケーションの実行前に、当該投機的実行エンジンの間接分岐予測器の誤訓練の攻撃を受ける可能性がある命令のセットを検出する。誤訓練された前記分岐予測器は、間接分岐命令のエクスプロイトを可能にする不正確な分岐予測先を算出する。前記システム、方法およびプログラムプロダクトは、誤訓練された前記分岐予測器の検出に基づいて、前記コンピュータアプリケーションの間接分岐命令を特定する。前記システム、方法およびプログラムプロダクトは、前記投機的実行エンジンによる前記コンピュータアプリケーションの実行中に、特定された前記間接分岐命令を直接分岐命令に変更する。前記システム、方法およびプログラムプロダクトは、前記コンピュータアプリケーションへの攻撃を阻止するために、特定された前記間接分岐命令の代わりに、前記直接分岐命令を実行する。
【0012】
一部の実施形態において、前記システム、方法およびプログラムプロダクトは、さらに、誤訓練された前記分岐予測器と並行して正確な分岐予測を算出し、算出された前記正確な分岐予測を用いて、誤訓練された前記分岐予測器を再訓練する。
【0013】
実施形態は、投機的実行環境の脆弱性(例えば、Spectre、Meltdown等)をプロセスがエクスプロイトしようと試みるのを検出するコンピュータシステム、方法およびプログラムプロダクトに向けられている。当該システム、方法およびプログラムプロダクトは、プロセスの実行開始時に、当該プロセスの実行を一時保留する。前記システム、方法およびプログラムプロダクトは、一時保留された前記プロセスがキャッシュメモリのフラッシュ動作のシグネチャを含んでいるか否かを判定する。例的な一実施形態において、キャッシュメモリのフラッシュ動作の前記シグネチャは、CLFLUSHやMCRやRDTSCアセンブリ命令のパターンを含む。例えば、前記システム、方法およびプログラムプロダクトは、一時保留された前記プロセスが、TSX拡張の一部であるハードウェアロック省略(HLE)や制限付きトランザクションメモリ(RTM)などのトランザクション同期用の命令で指定されたコード領域のシグネチャを含んでいるか否かを判定する。
【0014】
前記システム、方法およびプログラムプロダクトは、一時保留された前記プロセスの実行を続行する。前記システム、方法およびプログラムプロダクトは、前記プロセスがメモリのフラッシュ動作の前記シグネチャを含んでいる場合、前記実行中に、前記プロセスがメモリのフラッシュ動作の前記シグネチャを定められたパターンに従って実行しているか否かを動的に検査する。例的な実施形態において、前記定められたパターンは、前記メモリの前記フラッシュ動作の頻度及びスピードの尺度や、前記プロセスが前記CLFLUSHまたはMCR命令を実行する回数の閾値を含む。例的な実施形態では、前記定められたパターンが、TSX拡張で指定されたコード領域のフラッシュ動作回数の頻度及びスピードの尺度や、TSX指定領域後の一時的コードの実行回数の頻度及びスピードの尺度を含む。前記システム、方法およびプログラムプロダクトは、前記実行が前記定められたパターンを満たした場合、前記プロセスの保護措置を実施する。当該保護措置は、スレッドの終了、プロセスの終了、隔離領域へのプロセスの移動、プロセスファイルを修正するための少なくとも1つのパッチのロード、およびプロセスが悪意あるものであることのユーザへの報告のうちの任意のものを含み得る。
【0015】
一部の実施形態において、前記システム、方法およびプログラムプロダクトは、前記投機的実行エンジンのキャッシュにおける所与の変数のキャッシュラインが他のキャッシュラインよりも高速で繰返し前記プロセスにより読み出された場合に、前記プロセスの保護措置を実施する。一部の実施形態において、前記システム、方法およびプログラムプロダクトは、前記プロセスが特権レベル命令をシステムレジスタで実行することを試みた場合に、前記プロセスの保護措置を実施する。
【0016】
前述の内容は、添付の図面に示す例的な実施形態についての以下の詳細な説明から明らかになる。異なる図をとおして、同一の符号は同一の構成要素を指すものとする。図面は必ずしも縮尺どおりではなく、むしろ、実施形態を図示することに重点が置かれている。
【図面の簡単な説明】
【0017】
【
図1A】本開示の一部の実施形態における、例的な投機的実行エンジンを示す図である。
【
図1B】本開示の一部の実施形態における、脆弱性をエクスプロイトする際に用いられる例的なインフラストラクチャを示す図である。
【
図1C】本開示の一部の実施形態における、投機的実行の脆弱性に対処する例的な方法の一つを示す図である。
【
図1D】本開示の一部の実施形態における、投機的実行の脆弱性に対処する例的な他の方法を示す図である。
【
図1E】本開示の一部の実施形態における、投機的実行の脆弱性に対処する例的なさらなる他の方法を示す図である。
【
図1F】本開示の一部の実施形態における、投機的実行の脆弱性に対処する例的なさらなる他の方法を示す図である。
【
図1G】本開示の一部の実施形態における、投機的実行の脆弱性に対処する例的なさらなる他の方法を示す図である。
【
図1H】本開示の一部の実施形態において、リターンスタックバッファ(RSB)がエクスプロイトされる様子の一例を示す図である。
【
図1I】本開示の一部の実施形態において、アドレス変換の処理がエクスプロイトされる様子の一例を示す図である。
【
図1J】本開示の一部の実施形態において、BranchScopeが分岐予測装置(BPU)の分岐方向予測部を標的とする様子の一例を示す図である。
【
図2A】本開示の一部の実施形態における、アプリケーションを脆弱性から保護する例的なトラステッドエグゼキューションシステムを示す図である。
【
図2B】本開示の一部の実施形態における、アプリケーションを脆弱性から保護する例的な他のトラステッドエグゼキューションシステムを示す図である。
【
図3A】本開示の一部の実施形態における、脆弱性を仮想修正する例的な方法を示す図である。
【
図3B】本開示の一部の実施形態における、エクスプロイトを検出し阻止する例的な方法を示す図である。
【
図4A】攻撃者が投機的実行により生じる脆弱性をエクスプロイトする際の例的なシナリオを示す図である。
【
図4B】本開示の一部の実施形態における、攻撃者が投機的実行により生じる脆弱性をエクスプロイトしないよう阻止する例的なシナリオを示す図である。
【
図5】本開示の実施形態が実現され得るコンピュータネットワークまたは同様のデジタル処理環境を示す図である。
【
図6】
図5のコンピュータシステム内のコンピュータ(例えば、クライアントプロセッサ/装置、サーバコンピュータ等)の例的な内部構造の図である。
【発明を実施するための形態】
【0018】
以下では、例的な実施形態について説明する。
【0019】
本明細書で引用する全ての特許、特許出願公開公報及び刊行物の全教示内容は、参照をもって取り入れたものとする。
【0020】
本発明の実施形態は、OSやマイクロコードのパッチをインストールすることなく、投機的実行エンジンがアプリケーションを実行している最中に、Spectre脆弱性やMeltdown脆弱性やForeshadow脆弱性を動的に修正するフレームワークを実現する。実施形態は、ベンダーのパッチと同様のコードアップデートだけでなく、ベンダーのパッチで提供されないコードアップデートも動的に適用し得る。前記フレームワークは、前記アプリケーションの実行中に、当該アプリケーションの実行を監視して前記投機的実行エンジンの順序外実行時に危険となる(脆弱性を示す)コンストラクト(コードセグメント又はルーチン)を特定する。前記フレームワークは、特定された当該コンストラクトのバイナリコードがメインプロセッサメモリから前記投機的実行エンジンのCPUキャッシュに向けて実行のためにフェッチされる際に、前記脆弱性を修正するための命令を当該バイナリコードに実装する。前記フレームワークは、当該フレームワークが特定したコンストラクトの特定の種類(例えば、if-then命令文、間接分岐命令等)に基づき、特定の命令を実装する。前記フレームワークは、前記アプリケーションを監視し脆弱性を当該特定の命令で修正するのに、セキュリティ技術導入ガイド(STIG)やユーザ設定に基づくルールベースのポリシーを適用し得る。
【0021】
前記フレームワークは、さらに、攻撃者が投機的実行サイクル中の間接ジャンプコール命令の宛先として特定の宛先を選択することを可能にする前記投機的実行エンジンの分岐予測器の誤訓練に対しても保護を行う。これを行うために、前記フレームワークは、前記分岐予測器と並行して正確な分岐予測を算出するスレッドを実行し、当該正確な分岐予測を用いて前記分岐予測器を、攻撃者の影響を受けないように再訓練する。これらの手法により、実施形態は、既存のコードを変更したりシステムパフォーマンスに多大な影響を及ぼしたりすることなく、Spectre、Meltdown、Foreshadowなどが持つ既知のリスクからアプリケーションを保護する。これらの実施形態は、脆弱性を有するアプリケーションをリアルタイムで保護し、脆弱性に対するパッチをソフトウェアベンダーが設計できるようになる遥か前から当該脆弱性を実質的に仮想修正する。
【0022】
一部の実施形態では、ディスク上にある、OSやユーザが能動的にインストールした既知のどのソフトウェアパッケージの一部でもない未確認ファイルについて、開始を行わない。未確認ファイルのこのような判定を行うために、前記フレームワークはプロセスの実行開始前に、各実行ファイルや各ライブラリのチェックサムを計算して当該チェックサムをこれらのファイルの有効なチェックサムを格納したシグネチャデータベースと照合する。チェックサムが一致しない場合、前記フレームワークは、プロセスを開始しないようにしたり、プロセスを隔離領域に移動させたり、プロセスファイルの正当なコピーを復元したり、実行ファイルやライブラリを修正するための少なくとも1つのパッチをロードしたり、プロセスが悪意あるものであることをユーザに報告したりし得る。
【0023】
そのほか、前記フレームワークは、各プロセスの実行が開始されると、実行ファイルやライブラリのスキャンを引き続き行い、Spectre脆弱性やMeltdown脆弱性をエクスプロイトする際に用いられる可能性がある、メモリのフラッシュ動作のシグネチャを当該プロセスが含んでいるか否かを特定する。前記フレームワークは、プロセスがそのようなシグネチャを含んでいることを特定すると、当該プロセスの実行中に当該プロセスを(例えば、動的バイナリ計装、関数フッキング技術などのメカニズムを用いる等して)リアルタイムで監視し当該プロセスが上記のような脆弱性のエクスプロイトの特徴となる定められたパターン(例えば、フラッシュ動作が特定の頻度やスピードで行われること、特定の変数のキャッシュラインが他のキャッシュラインよりも高速で読み出されること、TSX指定領域内のフラッシュ命令等)に従って前記シグネチャを実行しているか否かを検出する。前記プロセスの実行中、前記フレームワークは、さらに、当該プロセスをリアルタイムで監視し当該プロセスが特権レベル命令でシステムレジスタ/カーネルレジスタ(例えば、Ring0内のCR0、CR1、CR2、CR3等)を使用しているか否かを判定する。前記プロセスが定められたパターン閾値を満たした場合や、前記プロセスが特権レベル命令でシステムレジスタ/カーネルレジスタを使用している場合には、前記フレームワークが、プロセスを終了したり、プロセスを隔離領域に移動させたり、実行ファイルやライブラリファイルの正当なコピーを復元したり、プロセスファイルを修正するための少なくとも1つのパッチをロードしたり、プロセスが悪意あるものであることをユーザに報告したりし得る。実施形態は、SpectreやMeltdownや投機的実行により生じるその他の脆弱性を利用したエクスプロイトを阻止する技術を、このようなフレームワークを用いることによって実行する。
【0024】
実施形態は、ユーザ操作によるメモリ読取りを実施する命令を確実に特定し、Spectre 1型の攻撃で見られるような、投機的実行時の境界外メモリへのアクセスを命令が実行することがないように阻止する。また、実施形態は、Spectre 2型の攻撃で見られるような、分岐予測器の誤訓練を阻止する。また、実施形態は、サイドチャネル攻撃のコードを無効にし、攻撃者が立ち上げたプロセスを終了させることで、Meltdownを利用したエクスプロイトを阻止する。例的な実施形態は、今日のSpectreエクスプロイトやMeltdownエクスプロイトやForeshadowエクスプロイトを検出し阻止するだけでなく、間違いなく出現するであろう今後の攻撃型についても検出し阻止する。
【0025】
実施形態は、最も高次のレベルにおいて下記の対処メカニズムを組み込むことにより、投機的実行環境で実行される被害者プロセスを検出し保護する。
【0026】
【0027】
実施形態は、サイドチャネル攻撃を下記の手法で検出し阻止する:
・ホワイトリストに照合して行うプロセス初期設定検査
・過剰なフラッシュ&リロード傾向を示すプロセスの検出
・過剰なプライム&リロード傾向を示すプロセスの検出
・システムレジスタへのアクセスを試みるユーザコードの検出
・特権命令の実行を試みるユーザコードの検出
・TSX一時的命令を実行するプロセスの検出
・RSBスタックのフラッシュ動作を試みる命令の検出(1.8セクションを参照のこと)
・閾値を上回る過剰なOSコンテキスト切替えを行うプロセスの検出
・閾値を上回るlongjmps()を行うプロセスの検出
・C6スリープステートをトリガするプロセスの検出
【0028】
(投機的実行エンジン)
【0029】
図1Aに、本開示の一部の実施形態における、例的な投機的実行エンジン100を示す。投機的実行は、順序外実行や分岐予測のような、ソフトウェア設計における非一般的な枠組みの概念を招き入れる。このような投機的実行は、アプリケーションの実行中に脆弱性(例えば、Spectre、Meltdown、Foreshadow等)を生じさせる。悪意ある人物は、これらの脆弱性をエクスプロイトすることで、実行中のアプリケーションのデータに不正にアクセスし得る。
【0030】
投機的実行エンジン100は、フロントエンド160、実行エンジン170、およびメモリサブシステム190を備える。フロントエンド160は、アプリケーションの命令をアプリケーション空間から、命令トランスレーションルックアサイドバッファ(ITLB)162に接続されたL1命令キャッシュ161へ移動させる。フロントエンド160は、L1命令キャッシュ161から命令をフェッチして、当該命令をマイクロオペレーション(μOP)にデコードする。フロントエンド160は、このデコードを、命令フェッチ&プリデコード165、命令キュー166および4ウェイデコード167を用いて実行する。フロントエンド160の分岐予測器163は、過去の命令処理で培った訓練に基づき、デコードされた命令(μOP)の実行順番を予測(予想)する。分岐予測器163により、μOP実行順番の予測が(μOPキャッシュ264を介して)MUX168へと供給される。フロントエンド160は、さらに、前記μOPもMUX168へと供給する。MUX168は、アロケーションキュー169内に当該μOPを、予測された順番で並べる。
【0031】
実行エンジン170は、リオーダバッファ171を含む。リオーダバッファ171は、アロケーションキュー169内における前記順番に並べられた未実行μOPに対してレジスタを割り当てたり、当該μOPをリネームしてリタイアさせたりする。実行エンジン170のスケジューラ172は、実行可能な状態になった未実行μOPを、レジスタの割当てに従って173,174,175,176,177,178,179,181を含む実行部182で実行する。スケジューラ172は、未実行μOPが必要とするデータが利用可能になったことが共通データバス(CDB)183から判明した際に、当該未実行μOPが実行可能な状態になったと判断する。分岐予測器163が予測した順番が正確でないと実行エンジン170が判断すると、リオーダバッファ171がロールバックしてμOPをスケジューラ172からクリアする。
【0032】
メモリサブシステム190は、L1データキャッシュ195を含む。μOPの実行に必要なデータは、(実行部182のロードデータ177,178やストアデータ179により)メインプロセッサメモリからロードバッファ193やストアバッファ194へと送られる。ロードバッファ193やストアバッファ194は、当該必要なデータを、デュアルトランスレーションルックアサイドバッファ(DTLB)195に接続された前記データキャッシュ195へ送る。データキャッシュ195は、当該必要なデータを処理するうえで、レベル2変換ルックアサイドバッファ(STLB)197に接続された別のL2キャッシュ198と通信可能とされている。
【0033】
攻撃者は、データキャッシュ195を(例えば、CLFLUSHのような非特権命令を用いる等して)連続的にクリアすることで、投機的実行の脆弱性(Spectre、Meltdown、Foreshadowなど)を悪用し得る。攻撃者は、フラッシュしたキャッシュラインに実行エンジン170がアクセスするまで十分待つ。その後、攻撃者は、フラッシュしたキャッシュラインに再度アクセスする。実行エンジン170がそのキャッシュラインを(例えば、他のμOPを処理する等のために)使用した場合は、実行エンジン170がそのキャッシュラインを使用しておらずキャッシュをメインプロセッサメモリからロードする必要がある場合に比べて、ロードが(L2キャッシュ198に残っているので)早くなる。L2データキャッシュ195をクリアすると、コードブロック内の特定の命令のμOPの実行に必要なデータが存在しなくなる。同じコードブロック内の後続の別の命令を含むμOPが当該必要なデータを要求するものでない場合、スケジューラ172が当該μOPを(同じコードブロック内の前記必要なデータを要求する先行の命令のμOPよりも先に)実行する。これに並行して、攻撃者は、当該μOPの実行に用いられる変数の値を操作(セット、クリア等)することにより、アプリケーション上で特定の重要な命令がトリガされたか否かを確認することができる。そして、攻撃者は、これらの重要な命令を操作することにより、当該命令で処理されるデータを盗み得る。
【0034】
図1Bに、本発明の一部の実施形態における、Spectre脆弱性/Meltdown脆弱性/Foreshadow脆弱性をエクスプロイトする際に用いられる例的なインフラストラクチャ150を示す。Spectre脆弱性やMeltdown脆弱性やForeshadow脆弱性のエクスプロイトは、セキュリティ領域間の隔絶を打ち破ることが可能な、巧妙に作り込まれた悪意あるプロセスを用いて計画されたものである。攻撃者は、投機的実行エンジンのハードウェア脆弱性により、個々のプロセス群116間の隔絶を(キャッシュサイドチャネル攻撃を用いて)打ち破ることができる。当該脆弱性により、CPU128(マイクロコード+投機的実行エンジン100)により実行される所与のプロセス(攻撃者プロセス120)から、CPU128又は分岐予測器163が処理する別のプロセス(被害者プロセス122)のデータを操作することが可能となる。被害者プロセス122は、投機的実行エンジン100が実行しているアプリケーションの関数の一部を含んでいる。前記脆弱性により、攻撃者プロセス120は、CPU128が実行するオペレーティングシステム118を、ユーザ空間コード124及びカーネル保護コード126のいずれでも操作することが可能となる。エラーのないアプリケーション(例えば、被害者プロセス122を含む)であっても、前記脆弱性に基づくと被害者になる可能性がある。エクスプロイトの手段は、極めて低次レベルな性質のものなので、どのログファイルにも痕跡が残らない。
【0035】
キャッシュサイドチャネル攻撃を可能にする一部の投機的実行脆弱性(例えば、Meltdown等)は、ページファイルアクセスを条件とする。コンテナ同士は、カーネル(カーネル保護コード226)を共有する。そのため、コンテナで動作するアプリケーションは、カーネルを共有しない仮想マシン(VM)に比べて受ける影響が大きい。VMWareのようなハイパーバイザーは、VM間の拡張ページテーブルアクセスやページ共有アクセスの許可を典型的に推奨していないものの、プライベートクラウド環境では使用されることがある。前記攻撃を阻止する最も実用的な手立ては、内在する弱点を攻撃者がエクスプロイトし得る前、つまり、アプリケーションプロセスメモリにある。例えば、Googleは、投機的実行時の間接分岐を標的としたキャッシュサイドチャネル攻撃の機会を閉じる「Retpoline」アプローチを採用した。
【0036】
キャッシュサイドチャネル攻撃の種類の一つは、ラストレベルキャッシュに対するマルチコアサイドチャネル攻撃であるフラッシュ&リロードである。この攻撃者プロセス120は、同じ物理メモリ(例えば、libc等)が複数のプロセスにマップされていることを悪用するものである。この攻撃は、まず、攻撃者プロセス120がCLFLUSHのような非特権命令を用いてL1データキャッシュ195の内容を追い出すことで構成される。そして、攻撃者プロセス120は、フラッシュしたキャッシュラインに被害者プロセス122がアクセスするのを十分待つ。次に、攻撃者プロセス120は、フラッシュしたキャッシュラインに再度アクセスする。被害者プロセス122がそのキャッシュラインを使用した場合は、被害者プロセス122がそのキャッシュラインを使用しておらずキャッシュをメインメモリからロードする必要がある場合に比べて、ロードが(L2キャッシュ198に残っているので)早くなる。攻撃者プロセス220は、RDTSC命令を用いて、フラッシュ動作の精密な時間計測を得る。これに並行して、攻撃者プロセス220は、被害者プロセス222で特定の重要な命令がトリガされたか否かを検出し得る。これにより、当該命令により処理されるデータを盗むことが攻撃者プロセス220にとって容易となる。
【0037】
別の種類のキャッシュサイドチャネル攻撃は、VMWareがページテーブルアクセスを許可しない場合に用いられ得るプライム&プローブである。この攻撃は、攻撃者プロセス120がL1データキャッシュ195にアクセスできること、さらに、大量のメモリをVMにマップ出来ることを条件とする。この攻撃は、攻撃者プロセス120が指定のデータ又は命令を用いて1つ以上のキャッシュ群を「プライム」することで構成される。そして、攻撃者プロセス120は、被害者プロセス122がL1データキャッシュ195を実行するのを待つ。被害者プロセス122が当該キャッシュを使用すると、攻撃者のコード又はデータの一部が被害者プロセス122によって取り除かれることになる。一定時間後、攻撃者プロセス120はプライム済みのL1データキャッシュ195をプローブすることで、被害者プロセス122がキャッシュラインを使用したか否かを確認する。この際、攻撃者プロセス120は、プライム対象の位置にあるデータが近隣レベルのキャッシュに由来するものであるのかメインメモリに由来するものであるのかを確認する。攻撃者プロセス120は、RDTSC命令を用いて、キャッシュへのプローブ動作の精密な時間計測を得る。
【0038】
カーネルページテーブルアイソレーション(KPTI)は、カーネルレベルアドレス空間ランダム化(KASLR)をバイパスするサイドチャネル攻撃からの保護を行う、KAISERと称される保護技術を取り入れたものである。この保護は、ユーザモードの間はカーネルページを非マップ化する一方で、カーネルにモードが切り替わった際にはカーネルページを再度マップ化するということに基づいている。結果として、ユーザコードの投機失敗によるカーネルメモリへのアクセスが不可能となるため、Meltdownが阻止される。本発明の実施形態は、CPUが被害者プロセス120を実行している最中の、ユーザ空間コードからカーネルコードへの、コンテキスト的に適切でないアプリケーションの移行を動的に検出し得る。なお、KPTIにより、パフォーマンスの大幅なオーバーヘッドが生じ得ることが報告されている。KPTIは、同じ特権モード内での(例えば、サンドボックス外のメモリにアクセスする等の)攻撃を阻止することができない。
【0039】
別のサイドチャネル攻撃は、空のリターンスタックバッファ(RSB)に対するものである。この問題の根本的原因は、RSBスタックが空になることである。次の少なくとも1つが、RSBスタックを空にし得る:過剰なTSXアボート;WRMSRを0x79に書き込むこと(マイクロコードの更新);0x7A(SGX起動);0x8C~0x8Fに対するWRMSR/RDMSR(SGX起動エンクレーブパブリックキーハッシュ);SGX命令(ENCLS,ENCLU)及びSGX CPUID leaf;OSコンテキストの過剰な切替え回数;ユーザ空間の過剰な例外回数;longjmp()の過剰な呼出し;ならびにC6以上のスリープステートの過剰な呼出し。
【0040】
前記投機的実行プロセッサでRSB「スタック」が空になると、RET命令は、間接分岐予測器の内容に基づいて投機的な推測を行い得る。この構造こそ、Retpolineが阻止しようとするものである。つまり、「Retpoline」を中心とする防御が役に立たなくなることを意味する。次の条件下で、RSBが空になり得る:条件の一つは、コールスタックがRSBの最小深度(16)よりも深くなることである。このときにRET命令を実行すると、RSBが空になり得る。これには、アボート時のTSXトランザクション内におけるCALL命令及びRET命令が含まれる。Intelトランザクショナルシンクロナイゼーションエクステンション(TSX)は、ハードウェアロック省略(HLE)および制限付きトランザクションメモリ(RTM)と称される、x86命令群の2種類の拡張の製品名である。RTMは、命令群に対し、ハードウェアトランザクションの一部として実行すべきコード領域を宣言するのに用いる幾つかの命令を追加する拡張である。別の条件として、間接分岐予測器バリア(IBPB)コマンドがRSBを空にする可能性が挙げられる。なお、HLEは、特定の命令に追加されることが可能なプリフィックス群である。これらのプリフィックスは、当該プリフィックスを使用したコードが古いハードウェアでも動作するように後方互換性を有する。別の条件として、SGX命令(ENCLS、ENCLU)およびSGX CPUID leafが挙げられる。さらなる別の条件は、OSコンテキスト切替え、C++例外、longjmpのように、CALL命令とRET命令のバランスが崩れてCALL命令よりもRET命令が多くなることである。さらなる別の条件として、C6以上のスリープステート(例えば、MWAIT等)に移行することでRSBが空になる可能性が挙げられる。
【0041】
コールスタックの深度は実行時まで分からない数多くの要因に左右され得るので、コールスタックにソフトウェアで対処することは困難である。しかし、深いコールスタックのエクスプロイトでは、従来の分岐先インジェクション(Spectre 2型)攻撃よりも遥かに徹底的にCPU及びプログラム状態の挙動を制御及び予測することが要求されると考えられる。攻撃者プロセスの目的は、RSBスタックを空にし、それ以降の投機的推測が間接分岐予測器に基づいて試みられるようにすることである。投機的実行エンジンが間接分岐予測器を使用するようになると、Spectre 2攻撃が可能となる。
【0042】
(Spectre/Meltdown/Foreshadowのエクスプロイトの阻止)
【0043】
以下では、Spectre/Meltdownの様々な攻撃型、さらには、どのようにしてこれらの攻撃型によるエクスプロイトが本開示の実施形態により阻止されるのかについて説明する。
【0044】
(Spectre 1型(CVE-2017-5753))
【0045】
Spectre 1型(Spectre 1)は、正当に実行されるコードであるにもかかわらず、攻撃者プロセスにより、通常露呈することのない情報を攻撃者へと露呈させることが可能になってしまう、マイクロプロセッサの脆弱性である。この攻撃型のさらなる詳細については、Paul Kocher達の“Spectre Attacks: Exploiting Speculative Execution,” arxiv:1801.01203 (https://arxiv.org/abs/1801.01203), 2018を参照されたい。
【0046】
Spectre 1型は、ロードの境界チェックが一時的にバイパスされて、マイクロアーキテクチャのキャッシュ状態が変更されることにより、サイドチャネル時間計測解析を介して情報が漏洩することに起因するものである。Spectre 1型は、投機的実行ウィンドウ内において境界外メモリアクセスを可能にしてしまう、Intelアーキテクチャの設計欠陥を悪用したものである。その間、分岐予測器163の条件分岐予測は、境界チェックを一時的にバイパスしメモリ上の任意アドレスにアクセスできる状態となる。このアドレスの内容は、プロセッサが予測失敗に追い付いてキャッシュからのその状態をフラッシュするまでの間、L1データキャッシュ195に保存される。このウィンドウ内では、サイドチャネル攻撃により、この情報をキャッシュ195から盗むことが可能となる。任意メモリへの境界外アクセスのこのサイクルがループ実行されることにより、キャッシュ195の内容(社会保障番号、クレジットカード番号、その他の極秘情報のような秘匿データ)が盗み出される。
【0047】
境界チェックバイパスを用いた攻撃では、攻撃者プロセス(例えば、
図1Bの攻撃者プロセス120等)がマイクロプロセッサの投機的実行挙動を利用し、所与のコードにより、意図されている以上の情報を流出させる。この攻撃では、コードのうちの、入力が境界内であるか否かを調べるのに用いられる「混乱した使節」の問題が起こりうるセグメントを、攻撃者プロセスが特定する必要がある。
【0048】
If (input < array_size) //第1行//
val = data[array[input]]; //第2行//
【0049】
上記のコードには、入力が境界外ではないことを確認する入力正当性検査(第1行)が設けられている。このようなコードセグメントを特定した攻撃者プロセスは、次に、プロセッサの分岐予測器163を訓練することにより、境界チェックが真になる可能性が高いと当該分岐予測器163が予測するように仕向け得る。これは、そのコードを、「input(入力)」パラメータに有効な値を用いて何度も呼び出すことによって行われる。分岐予測器163を訓練した後、攻撃者プロセスはそれと同じコードを、「input」パラメータに境界外の悪意ある値を用いて且つarray_sizeの値がキャッシュに格納されていない状態で呼び出し得る。呼出し時に分岐予測器163は「if」命令文が(これまでと同じく)真であるだろうと予測するため、“val=data[array[input]];”は、「inputパラメータ」に悪意ある値が用いられたまま投機的に実行される。すなわち、プロセッサは、「input」パラメータに有効でない値を用いて間違ったコード経路を実行するよう仕向けられる。そして、プロセッサは、「input」パラメータに対する値として、攻撃者が操作したarray[input]により与えられるアドレスのデータをキャッシュにロードする。
【0050】
array_sizeの値がキャッシュに格納されていないことで、プロセッサが“val=data[array[input]];”を開始した時点から、array_sizeの値が返されてプロセッサの投機的推測が正確でなかったことが判明するまでの間、遅延が生じることになる。こうなると、プロセッサは、投機的に誤実行した命令(脆弱性により一時的命令が呼び出されてしまう)をキャッシュ195から廃棄するが、キャッシュ状態の変化は元に戻らされない。元に戻されていないキャッシュ状態を検出することで、攻撃者プロセスは、被害者のメモリのバイトを明らかにすることが可能となる。攻撃者プロセスは、この手順を繰返し用いることにより、同じ又は別の仮想マシン上の他のプロセスが使用するメモリの大部分を読み取ることが可能になる。
【0051】
本発明の実施形態は、この攻撃型に対して2種類の異なる独立した対処策を行使する。これらの対処アプローチでは、アプリケーションに対する変更や、被害者プロセス122が使うカーネルやマイクロコードに対する破壊的変更が必要とならない。これらの対処アプローチは、上記のコードの第1行により生成される基本ブロックと第2行により生成される基本ブロックとの間にFENCE(x86)命令やCSDB(ARM)命令を配置することにより、被害者プロセス(例えば、
図1Bの被害者プロセス122等)を保護する。結果として、これらの2行は、一つのブロックと見なされるので互いに独立して実行出来ないようになる。実施形態は、デベロッパーが何ら負担を負わなくてよいように、FENCE命令又はCSDB命令を動的に適用する。また、これらの対処アプローチは、オブジェクト形態のみで存在するサードパーティコードについても問題対処を支援する。
【0052】
この攻撃型に対する、本発明の(被害者プロセスを保護する)この第1の対処アプローチを、
図1Cの方法に示す。
図1Cの方法191は、アプリケーション空間と投機的実行エンジンのCPUとの間に監視命令を挿入する(501)。方法191は、アプリケーションの実行中に、if-thenコードブロックなどのリピート処理を実行するアプリケーション命令のセットを当該監視命令を用いて解析し特定する(502)。命令のこの特定のセットは、セキュリティ技術導入ガイド(STIG)やユーザ設定に基づくルールベースのポリシーを適用することで設定され得る。実施形態は、コード内での位置を、コンパイラベースのアプローチ又は動的テイント解析ベースのアプローチを用いて特定した。例えば、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等を参照されたい。方法191は、前記監視命令を介してメモリバリア命令を命令の前記セットに追加する(503)。当該メモリバリア命令は、当該メモリバリア命令の前後に発行されるメモリ処理を順序どおり実行する制約を投機的実行エンジンに履行させる、FENCE(x86)命令、CSDB(ARM)命令などのメモリバリア命令である。このようなバリア命令は、投機的実行時に境界外メモリにアクセスする命令を攻撃者が使用するのを阻止する。方法191は、前記メモリバリア命令を追加した状態で命令の前記セットを(投機的実行エンジンにより)実行する(504)。
【0053】
この攻撃型に対する、本発明の第2の対処アプローチでは、実施形態が、攻撃者プロセス(サイドチャネル攻撃プロセス)を確実に検出し不能にするための手順を踏む。この攻撃型に対する、本発明の(被害者プロセスを保護する)この第2の対処アプローチを、
図1Dの方法192に示す。方法192は、子プロセスを例えば当該子プロセスの実行開始時等にインターセプトする(506)。当該方法は、インターセプトしたプロセスのコード(実行ファイルおよびライブラリ)について、投機的実行で生じる脆弱性のエクスプロイト(当該エクスプロイトのシグネチャ)に関する動作を行うコードを有しているか否かを、静的又は動的に検査する(507)。このような動作(例えば、既知のカバートサイドチャネル等)は、セキュリティ技術導入ガイド(STIG)やユーザ設定に基づいて設定されるルールベースのポリシーを適用することで特定され得る。言い換えれば、OSやユーザが意図的にインストールした既知の他のパッケージの一部でない、あらゆる実行ファイル、ライブラリ又はその組合せが終了させられる。例えば、サイドチャネル攻撃は、CLFLUSHコード命令やMCRコード命令やRDTSCコード命令を繰返し実行するものであり得る。ポリシーは、このような動作の有無を検査するように設定かつ適用され得る。方法191は、このようなコード命令を含むプロセスを、攻撃者プロセスの可能性があるとして特定する(508)。
【0054】
方法192は、投機的実行エンジンのデータキャッシュを監視する命令を挿入する(509)。方法192は、当該監視命令を用いて、攻撃者プロセスの可能性がある前記プロセスの動作を、リードタイムスタンプ技術を適用して検査する。この技術において、方法192は、実行中のコードの所与の変数のキャッシュラインであって、他のキャッシュラインよりも高速で前記特定したプロセスにより読み出されるキャッシュラインを、当該キャッシュラインに関するタイムスタンプを解析することに基づいて前記監視命令を用いて探し出す(510)。キャッシュラインがこのように高速で読み出されるということは、当該キャッシュラインのデータが現在データキャッシュに存在していることを示唆する。方法192は、特定した前記プロセスによるキャッシュラインのこのような読出しのカウントを保持する(511)。当該カウントが閾値を上回ると、方法192は、攻撃者プロセスの終了、隔離領域への攻撃者プロセスの移動、プロセスファイルの正当なコピーの復元、プロセスファイルを修正するための少なくとも1つのパッチのロード、プロセスが悪意あるものであることのユーザへの報告などといった保護措置を実施する(512)。
【0055】
この攻撃型に対する、本発明の(被害者プロセスを保護する)第2の対処アプローチには、さらに、
図1Fの方法194が含まれる。方法194は、子プロセスを例えば当該子プロセスの実行開始時等にインターセプトする(530)。当該方法は、インターセプトしたプロセスのプロセスファイルについて、投機的実行で生じる脆弱性のエクスプロイト(当該エクスプロイトのシグネチャ)に関する動作を行うコードを有しているか否かを、静的又は動的に検査する(531)。このような動作(例えば、既知のカバートサイドチャネル等)は、セキュリティ技術導入ガイド(STIG)やユーザ設定に基づいて設定されるルールベースのポリシーを適用することで特定され得る。例えば、サイドチャネル攻撃は、CLFLUSHコード命令やMCRコード命令やRDTSCコード命令を繰返し実行するものであり得る。ポリシーは、このような動作の有無を検査するように設定かつ適用され得る。方法194は、このようなコード命令を含むプロセスを、攻撃者プロセスの可能性があるとして特定する(532)。
【0056】
方法194は、特定した前記プロセスの処理を監視する命令を挿入する(533)。方法194は、当該監視命令を用いて、前記シグネチャ動作が実行された回数を検出しカウントする(534)。また、方法194は、当該カウントを決定するのに、前記シグネチャ動作が実行される頻度、順番等も考慮に入れ得る。前記カウントが閾値を上回ると、方法194は、攻撃者プロセスの終了、隔離領域への攻撃者プロセスの移動、プロセスファイルの正当なコピーの復元、プロセスファイルを修正するための少なくとも1つのパッチのロード、プロセスが悪意あるものであることのユーザへの報告などといった保護措置を実施する(535)。
【0057】
図1Fの方法194は、さらに、特定した前記プロセスによる、システム/カーネルで使用されるレジスタ(例えば、Ring0等)を用いて特権レベル命令を実行しようとするあらゆる試みを監視する。これらのレジスタには、次のシステムレジスタ(Ring0)が含まれる:8個の32ビットのプロセッサ制御レジスタCR0,CR1,CR2,CR3,CR4,CR5,CR6,CR7;マシンステータスワード(MSW)と称される、CR0の下位16ビット;4個の16ビットのテーブルレジスタGDTR,IDTR,LDTR,TR;8個の32ビットのデバッグレジスタDR0,DR1,DR2,DR3,DR4,DR5,DR6,DR7;5個のテストレジスタTR3,TR4,TR5,TR6,TR7;メモリタイプレンジレジスタ;マシン固有レジスタ;およびマシンチェックレジスタ。前記特権レベル命令には、次のものが含まれる:LGDT(GDTRへのGDTのアドレスのロード);LLDT(LDTRへのLDTのアドレスのロード);LTR(TRへのタスクレジスタのロード);MOV Control Register(データをコピーして制御レジスタに記憶する);LMSW(新たなマシンステータスワードをロードする);CLTS(制御レジスタCR0のタスクスイッチフラグをクリアする);MOV Debug Register(データをコピーしてデバッグレジスタに記憶する);INVD(キャッシュを書戻しなしで無効化する);INVLPG(TLBエントリを無効化する);WBINVD(キャッシュを書戻しありで無効化する);HLT(プロセッサをHalt状態にする);RDMSR(モデル固有レジスタ(MSR)を読み取る);WRMSR(モデル固有レジスタ(MSR)に書き込む);RDPMC(パフォーマンス監視カウンタを読み取る);およびRDTSC(タイムスタンプカウンタを読み取る)。特定した前記プロセスが上記のいずれかのレジスタを用いて上記のいずれかの特権レベル命令を実行していると検出すると、方法194は、攻撃者プロセスの終了、隔離領域への攻撃者プロセスの移動、プロセスファイルの正当なコピーの復元、プロセスファイルを修正するための少なくとも1つのパッチのロード、プロセスが悪意あるものであることのユーザへの報告などといった保護措置を実施する。
【0058】
(Spectre 2型(CVE-2017-5715))
【0059】
Spectre 2型(Spectre 2)は、正当に実行されるコードであるにもかかわらず、通常露呈することのない情報を攻撃者へと露呈させることが可能になってしまう、マイクロプロセッサの脆弱性である。この攻撃型のさらなる詳細については、Paul Kocher達の“Spectre Attacks: Exploiting Speculative Execution,” arxiv:1801.01203 (https://arxiv.org/abs/1801.01203), 2018を参照されたい。Spectre 2は、間違った分岐先が一時的に選択されて、マイクロアーキテクチャのキャッシュ状態が変更されることにより、サイドチャネル時間計測解析を介して情報が漏洩することに起因するものである。この攻撃の実施に必要なのは投機的実行だけでよく、プロセッサは、命令を順序どおりに実行することが可能である。
【0060】
この第2の攻撃型は、投機的実行エンジンがプロセス間のコード又はデータを十分に隔絶しないことに起因した、間接分岐汚染として知られる手法を利用し得る。すなわち、分岐予測器163がセキュリティ領域間で学習を区別しないことを利用することで、攻撃者プロセスは、被害者プロセスの分岐予測アルゴリズムを誤訓練することが可能である。間接分岐命令の分岐先アドレスが(キャッシュミスにより)メモリからの読み取りに遅延が生じ、かつ、分岐予測器163が既に誤訓練済みである場合には、攻撃者プロセスが、投機的実行サイクル時に、被害者プロセスの分岐先として特定の分岐先を選択することができる。そして、このエクスプロイトは、被害者プロセスのメモリにリターン指向プログラミング(ROP)ガジェットを適用することで、秘密情報を漏洩させることが可能である。この攻撃型の攻撃では、攻撃者プロセスが分岐先インジェクションでマイクロプロセッサの投機的実行挙動を利用することにより、所与のコードによって、意図されている以上の情報が流出する。攻撃者プロセスは、悪意あるコードをマイクロプロセッサの間接分岐が投機的に実行するように仕向ける。当該悪意あるコードにより、マイクロアーキテクチャの状態は、攻撃者プロセスが当該状態を悪用することでデータ値を推測することのできるような状態となる。
【0061】
条件直接分岐で投機的に実行される可能性がある経路は、2つだけである。対象となる分岐が成立するか又はその分岐実行が「非成立」に終わることで、後続の命令へと実行が移り得る。間接分岐では、直接分岐と異なり、マイクロプロセッサが極めて広範囲の分岐先を投機的に実行し得る。この攻撃は、直接分岐にコードのうちの所与のセグメントを投機的に実行させることで行われる。攻撃者は、Spectre 1型に効果的に繋がるようなコードを巧妙に選定することで、被害者プロセスのメモリ空間から秘匿のデータを推測することが可能となる。
【0062】
以下の例のようなC++の簡単なインヘリタンスについて考える:
【0063】
class Shape {
public:
virtual void Draw() = 0;
};
class Circle : public Shape {
public:
void Draw() override { …}
};
【0064】
Shapeは基底クラスであり、Circleは派生クラスである。次に、以下のコードセグメントについて考える。
【0065】
Shape* obj = new Circle;
Obj->Draw();
【0066】
上記の例のような典型的なポリモルフィックコードでは、仮想関数Draw()の対象アドレスがコンパイル時に決まらず、実行時に解決しなければならない間接分岐となり得る。実行時になってから、適合する関数を見つけ出すように動的ルックアップが実行される。これが行われている間、マイクロプロセッサは、対象アドレスを予想(予測)し、予想した対象アドレスで即座にコードを投機的に実行し始める。攻撃者プロセスは、Spectre 1型に繋がるコードをマイクロプロセッサに間接分岐予測器の操作次第で投機的に実行させることが可能な、上記の例のようなコードを見つけ出す必要がある。そして、攻撃者プロセスは、Spectre 1型を用いることで、被害者のメモリ空間から秘匿のデータを推測することが可能となる。
【0067】
この攻撃型に対する、本発明の(被害者プロセスを保護する)この第1の対処アプローチを、
図1Eの方法193に示す。
図1Eの方法193は、アプリケーション空間と投機的実行エンジンのCPUとの間に監視命令を挿入する(520)。方法193は、アプリケーションの実行中に、不正確な分岐予測を算出するか又は投機的予測に失敗して遅延を発生させるよう誤訓練されているため間接分岐命令のエクスプロイトを可能にしてしまう分岐予測器を、前記監視命令を用いて解析し検出する(521)。当該誤訓練された分岐予測器は、セキュリティ技術導入ガイド(STIG)やユーザ設定に基づくルールベースのポリシーを適用することで検出され得る。実施形態は、コード内での位置を、コンパイラベースのアプローチ又は動的テイント解析ベースのアプローチを用いて特定した。例えば、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等を参照されたい。方法193は、前記誤訓練された分岐予測器により処理される間接分岐命令を前記監視命令を用いて特定する(522)。方法193は、投機的実行ウィンドウ内で間接分岐命令が「バウンド」状に実行されるようになるreturn trampoline(「Retpoline」)手法を用い得る。また、Retpoline手法は、分岐予測器の性質を利用し、RET命令の実行時に当該予測器に、分岐先バッファ(BTB)ではなく攻撃者によって汚染され得ないリターンスタックバッファ(RSB)を使用させるようにする。
【0068】
方法193は、前記監視命令により、間接分岐命令(JMP命令)を直接分岐命令(CALL命令)に変更する(523)。これは、動的バイナリ計装技術を用いることによって達成され得る。方法193は、変更された分岐命令(間接分岐命令の代わりに直接分岐命令)を実行する(524)。方法193は、さらに、分岐予測器を再訓練する(525)。これを行うために、方法193は、誤訓練された分岐予測器と並行して正確な分岐予測を算出し、当該正確な予測を用いて当該分岐予測器の予測アルゴリズムを再訓練する。
【0069】
この攻撃型に対する、本発明の第2の対処アプローチは、(前述した)
図1Dの方法192や
図1Fの方法194を用いることで、攻撃者プロセスが投機的実行エンジンの上記のような脆弱性をエクスプロイトするのを検出し阻止する。
【0070】
(Meltdown 3型(CVE-2017-5754))
【0071】
Meltdown(3型)は、アクセスが許可されていない情報をロードするコードをマイクロプロセッサに投機的に順序外で実行させて、最終的にマイクロアーキテクチャのキャッシュ状態が変化した際に、サイドチャネル時間計測解析を介して情報を漏洩させることにより、マイクロプロセッサが提供するあらゆるメモリ隔絶メカニズムを攻撃者が打ち破るのを可能にしてしまう、マイクロプロセッサの脆弱性である。この攻撃型のさらなる情報については、Lipp達の“Meltdown: Reading Kernel Memory from User Space,” SEC ’18 Proceedings of the 27th USENIX Conference on Security Symposium, pages 973-990, 2018を参照されたい。
【0072】
Meltdownは、Spectreの双方の攻撃型とは異なり、被害者プロセスを必要としない。Meltdownは、投機的実行時にページテーブルを悪用可能な状態にする、設計上のさらなる欠陥を使ったものである。この投機的実行ウィンドウにおいて、ユーザ空間コードは、特権アクセスチェックなしで、カーネルメモリへの完全なアクセスを得ることができる。結果として、攻撃者プロセスは、特権データにアクセスしてこれをキャッシュにロードした後、サイドチャネルメカニズムを用いてこれを盗み出すことができる。この過程を繰り返すことにより、攻撃者は、最終的にカーネルメモリ全体をマップすることが可能となる。カーネルメモリをマップしてしまえば、秘匿又は極秘のデータを盗み出すのに利用可能なROPガジェットを簡単に見つけ出すことができる。攻撃者プロセスは、不正なデータキャッシュロード攻撃時に、マイクロプロセッサの投機的な順序外実行挙動を利用する。これにより、所与のコードによって、意図されている以上の情報が流出する。具体的に述べると、Meltdownは、各プロセス(被害者プロセスおよび攻撃者プロセス)の仮想メモリを管理するうえでオペレーティングシステムが基本前提としているメモリの隔絶を打ち壊す。悪意ある人物は、カーネルから極秘情報を盗み出すことでメモリのレイアウトのマッピングを行い、これを(例えば、ページテーブルを悪用する等の)なおいっそう悪質な攻撃を立ち上げるための下準備に用いる。
【0073】
次のコード:“char val=*(char*)0xAAAAA;”について考える。
【0074】
この行が実行されると、アクセス制限違反によるセグメンテーション違反が発生するはずである。しかし、マイクロプロセッサは、(必要に応じてTLBルックアップやページテーブルウォークを含め)メモリ参照が解決されているあいだ後続の一時的命令を引き続き順序外で実行し得る。すなわち、マイクロプロセッサは、解決が完了するのを待たない。Meltdownの影響を受けるプロセッサでは、データ参照が既存の特権メモリ領域に対するものである場合にも投機的実行が発生する。すなわち、後続の投機的命令において、上記の“val”の投機的利用が可能となる。
例:以下の(簡略化)コードについて考える。
【0075】
char probeTable[256] = {0}; /*処理1*/
/* ... */
char val = *(char *)0xAAAAA; /*処理2*/
char temp = probeTable[val]; /*処理3*/
【0076】
処理2が実行されたときに何が起こるのかについて考える。マイクロプロセッサは、ロードを実行する。アドレス0xAAAAAがOSカーネルデータを指し示している場合、アクセスは許可されない。しかし、0xAAAAAがOSカーネルデータを指し示しているか否かは、ページテーブルを確認した後でしか分からない。この確認が行われている間、マイクロプロセッサは、処理2のメモリロードがリタイア段階に到達しない限り処理3を投機的に実行する。処理2がリタイアされると、例外が発生して投機的実行の結果が廃棄される。しかし、probeTableがキャッシュに格納されていない場合、処理3のコードはキャッシュミスを引き起こし、マイクロプロセッサがメインメモリからその値をわざわざ取り出してくることになる。攻撃者プロセスは、probeTable[i]の各要素を読み取る時間を計測することにより、どの要素が現在キャッシュに格納されているのかを判断することが可能になる。ここから、攻撃者プロセスは“val”の値を推測することができる。そして、ハッカーは、このアプローチを繰返し適用することにより、カーネルに関連付けられていると思われるメモリの大部分を読み取ることが可能となる。
【0077】
マイクロコードから例外の命令がリタイアさせられることになる攻撃例では、攻撃者が親プロセスを用いて子プロセスを生成し、当該子プロセスに一時的命令のセットを実行させる。例外がリタイアさせられた際には、子プロセスが未処理の例外を引き取ったのち終了するが、終了するまでの間に特権カーネルデータがキャッシュへと引き出される。親プロセスは、この露呈したデータを、サイドチャネル攻撃を介して盗み出す。この過程は、カーネルメモリの全体がマップされるまで繰り返され得る。子プロセスの生成及び終了のこのサイクルは、投機的実行ウィンドウ外でも観測することができる。保護アドレスにアクセスしようと試みたことに起因する例外で子プロセスが繰返し終了した場合、ポリシーに基づいて親プロセスが終了され得る。
【0078】
この攻撃型に対する、本発明の対処アプローチは、(前述した)
図1Dの方法192や
図1Fの方法194を用いることで、攻撃者プロセスが投機的実行エンジンの上記のような脆弱性をエクスプロイトするのを検出し阻止する。
【0079】
(Spectre 1の亜種1(CVE-2018-3639))
【0080】
Spectre 1のこの亜種(Spectre 1.1)は、ストアの境界チェックをバイパスする(BCBS)。その名が示すとおり、パフォーマンスを向上させるためにプロセッサは、プログラムの今後の実行フローについて推測し(Linux(登録商標)カーネルはこの目的のための特殊なプログラムと見なすことができる)、投機的に推測した経路が正確又は不正確であるかが確定するまで、プログラム命令を当該推測した経路に沿って実行する。推測した経路が正確であった場合には、パフォーマンスの向上が得られる。推測した経路が不正確であった場合には、投機的処理から得られた全結果を注意深く辿り、マイクロプロセッサを正確な経路へと通常外から分からないかたちで戻す必要がある。この亜種のさらなる情報については、Vladimir Kiriansky達の“Speculative Buffer Overflows: Attacks and Defenses,” arXiv:1807.03757 (https://arxiv.org/abs/1807.03757), 2018を参照されたい。
【0081】
例について考える:
if (x < lenb) //第1行//
return a[b[x] * 512]; //第2行//
if (y < lenc) //第3行//
c[y] = z; //第4行//
【0082】
投機的実行時のプロセッサは、上記の第3行の境界チェックを無視し得る。これにより、攻撃者は、任意書換えの全権を得る。これは投機的書換えに過ぎず、アーキテクチャ的に明確な影響を残さない。しかし、投機的書換えでも、サイドチャネルを介した情報暴露に繋がり得る。簡単な概念実証攻撃として、“c[y]”がスタックのリターンアドレスを示し、“z”が第2行のアドレスを含んでいると仮定する。関数リターンの投機的実行時には、前述したように実行が転送ガジェットに再移行する。なお、Spectre 1に対処するために第1行と第2行との間にフェンス命令(例えば、LFENCE、CSDB等)が追加されていたとしても、攻撃者プロセスは単に“z”を調節するだけで「フェンスを飛び越える」ことができる。また、リターン指向プログラミング(ROP)手法を用いることにより、代替的な攻撃ペイロードを構築することも可能である。投機的データ攻撃では、攻撃者プロセスが、将来的なSpectre 1.0パッチで用いられるデータを(一時的に)書き換えることが可能である。しかも、パフォーマンスパッチ対処では、フェンス命令ではなくデータ依存型の切捨て処理(例えば、“x&=(lenb-1)”等)が使われる。攻撃者は、配列“b”のベース(第2行)又はその長さ“lenb”(第1行)を書き換えることにより、任意読取りアクセスを再び獲得する。
【0083】
本発明の実施形態は、この攻撃型に対して2種類の異なる独立した対処策を行使する。この攻撃型に対する、本発明の第1の対処アプローチは、(前述した)
図1Cの方法191を用いて被害者プロセスを保護する。(Spectre 1型に関して前述したように)第1行と第2行との間にメモリバリア命令(FENCE又はCSDB命令)が設けられている場合には、第4行が第2行へとジャンプすると、本来の分岐ではなくFENCEが設けられた領域に制御が実質上転送されることになる。被害者プロセスがリアルタイムで実行されている最中、方法191は、第4行からの移動がFENCE又はCSDB命令へのジャンプを生じたことを検出する。これは、Specre 1.1型の攻撃の兆候である。また、方法191は、前記監視命令を用いて、メモリバリア命令へのこのジャンプを攻撃の可能性があるとして検出しユーザに報告し得る。
【0084】
この攻撃型に対する、本発明の第2の対処アプローチは、(前述した)
図1Dの方法192や
図1Fの方法194を用いることで、攻撃者プロセスが投機的実行エンジンの上記のような脆弱性をエクスプロイトするのを検出し阻止する。
【0085】
(Spectre 1の亜種2(CVE-2018-3639))
【0086】
Meltdownにおいて、攻撃者プロセスは、ページテーブルエントリ(PTE)のユーザ保護フラグ/スーパーバイザー保護フラグのレイジー(遅延)施行を利用する。同じメカニズムを用いて、読取り/書込みPTEフラグをバイパスすること(読取り専用保護バイパス)も可能である。Spectreのこの攻撃型(Spectre 1.2)は、Meltdownと同じくレイジーPTE施行に依存して行われる、Spectre 1.1の副次的な攻撃型である。Spectre 1.2攻撃では、投機的ストアにより、読取り専用データ、コードポインタおよびコードメタデータ(vtableやGOT/潜在連合テスト(IAT)や制御フロー緩和メタデータを含む)を書き換えることができる。結果として、ハードウェアによる読取り専用メモリ強制に依存して行われるサンドボックスが役に立たなくなる。この亜種のさらなる情報については、Vladimir Kiriansky及びCarl Waldspurgerの“Speculative Buffer Overflows: Attacks and Defenses,” arXiv:1807.03757 (https://arxiv.org/abs/1807.03757), 2018を参照されたい。
【0087】
本発明の実施形態は、この攻撃型に対して2種類の異なる独立した対処策を行使する。この攻撃型に対する、本発明の第1の対処アプローチは、(前述した)
図1Cの方法191を用いて被害者プロセスを保護する。(Spectre 1型に関して前述したように)第1行と第2行との間にメモリバリア命令(FENCE又はCSDB命令)が設けられている場合には、第4行が第2行へとジャンプすると、本来の分岐ではなくFENCEが設けられた領域に制御が実質上転送されることになる。被害者プロセスがリアルタイムで実行されている最中、方法191は、第4行からの移動がFENCE又はCSDB命令へのジャンプを生じたことを検出する。これは、Specre 1.1型の攻撃の兆候である。また、方法191は、前記監視命令を用いて、メモリバリア命令へのこのジャンプを攻撃の可能性があるとして検出しユーザに報告し得る。
【0088】
この攻撃型に対する、本発明の第2の対処アプローチは、(前述した)
図1Dの方法192や
図1Fの方法194を用いることで、攻撃者プロセスが投機的実行エンジンの上記のような脆弱性をエクスプロイトするのを検出し阻止する。
【0089】
(Spectre 3a型(CVE-2018-3640))
【0090】
Variant 3a “Cache Speculation Side-channels” whitepaper, version 1.3, dated May 2018に記載されている不正なシステムレジスタ読取りは、投機的実行手法とサイドチャネルキャッシュ手法の両方を用いて、攻撃者のプロセッサがアーキテクチャ上アクセスすることのできない、所与のプロセッサシステムレジスタの状態の値を推測するというものである。不正なシステムレジスタ読取りは、システムレジスタの状態を読み取る命令を、当該状態の読取りがアーキテクチャ的に許可されていないモード又は特権レベルでプロセッサが動作している際に投機的に実行するものである。この攻撃で値を推測することが可能なシステムレジスタのセットは、その時々の実施によって異なる。これらの処理は、アーキテクチャ的にフォールトになる。あるいは、当該処理を実行する仮想マシン(VM)が終了させられることになる。しかし、場合によっては、当該処理によってデータが返されることがあり、投機的実行経路上の後続の命令が当該データにアクセスすることが可能となる。そして、当該後続の命令がサイドチャネルを生成することにより、システムレジスタの状態を推測することが可能になる。この攻撃型のさらなる情報については、“Intel Analysis of Speculative Execution Side Channels,” White Paper, Revision 3, Intel, Document Number: 336983-003, May 2018を参照されたい。
【0091】
この攻撃型に対する、本発明の対処アプローチは、(前述した)
図1Dの方法192や
図1Fの方法194を用いることで、攻撃者プロセスが投機的実行エンジンの上記のような脆弱性をエクスプロイトするのを検出し阻止する。
【0092】
(Spectre 4型)
【0093】
Microsoftは、投機的実行のサイドチャネルハードウェア脆弱性への対処に関するブログ記事(https://blogs.technet.microsoft.com/srd/2018/05/21/analysis-and-mitigation-of-speculative-store-bypass-cve-2018-3639/)にて、投機的実行のサイドチャネルの条件となり得る3種類の投機的プリミティブについて説明している。これら3種類のプリミティブは、アーキテクチャ外の経路に沿った投機的実行へ移行するための基本的手法であり、条件分岐予測失敗、間接分岐予測失敗、および例外提供又は例外遅延からなる。投機的ストアバイパス(SSB)は、MS(Microsoft)がメモリアクセス予測失敗と称する第4の新たなカテゴリーの投機的プリミティブに属する。
【0094】
SSBは、先行するストアよりも先に、従属関係があり得るロード命令を投機的に実行することを可能にし得る、CPU最適化に起因して発生する。具体的に述べると、先行するストアに対してロードが従属しないと予測されると、当該ロードはそのストアよりも先に投機的に実行され得る。この予測が正確でなかった場合には、ロードによって古いデータが読み取られるほか、場合によっては、従属関係がある別のマイクロオペレーションへと当該データが投機的処理中に受け渡され得る。これにより、投機的実行のサイドチャネルおよび秘匿の情報の暴露が生じる可能性がある。
【0095】
これがどのようにして起こり得るのかを説明するために、次の簡単な例について考えるのが役立ち得る。この例では、RDIとRSIが、アーキテクチャ上の経路の同一アドレスであると仮定する。
【0096】
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]
【0097】
この例では、第1行のMOV命令の実行に追加の時間がかかる場合(例えば、RDI+RCXのアドレス式の計算が先行の命令の実行を待つ場合等)がある。これが起こった場合、CPUは、第2行のMOVZXがそのMOVに対して従属関係を持たないと予測し、ストアを実行するそのMOVよりも先に当該MOVZXを投機的に実行する可能性がある。これにより、メモリのRSI+RCXの位置の古いデータがR8にロードされて、従属関係がある第4行のロードへ当該データが受け渡され得る。R8のバイト値が秘匿のものである場合には、フラッシュ&リロード(RDXが共有メモリを参照するものである場合)、プライム&プローブなどといったキャッシュベースの暴露プリミティブを用いることにより、サイドチャネルを介して当該バイト値が明らかになり得る。CPUは、最終的に予測が失敗したことを検出し、算出済みの状態を廃棄する。しかし、投機的処理時にアクセスされたデータは、この時点までにキャッシュ内に副次的影響を残している可能性があり、これを測定することにより、R8にロードされた値を推測することができる。
【0098】
この例は、問題を説明するために簡略化しているが、SSBによって投機的な境界外読取り、タイプ混乱、間接分岐などを引き起こし得る同様の命令列がほかにも存在する可能性がある。実際、この攻撃型によるエクスプロイトが可能な部分を攻撃者プロセスが見つけるには、次に従って命令列を特定すればよい:当該命令列は、信頼境界線を跨ぐことが可能なものである(例えば、ユーザモードの攻撃者が、システムコールによってカーネルモードの命令列をトリガすることが可能である)。当該命令列は、先行するストア命令に対してアーキテクチャ的に従属関係を有するロード命令を含んでいる。当該ロード命令で読み取られる古いデータは、秘匿のものであり、かつ、アーキテクチャ外の経路においてサイドチャネルを生成できるよう利用される(例えば、当該データは、暴露ガジェットへ受け渡される)。ストア命令よりもロード命令のほうが先に実行されるほか、従属関係があり且つ前記暴露ガジェットを構成する命令が投機的に実行される。
【0099】
この攻撃型に対する、本発明の(被害者プロセスを保護する)第1の対処アプローチは、(前述した)
図1Cの方法191を用いて被害者プロセスを保護する。具体的に述べると、この対処アプローチでは、方法191が、以下の例で示すように、ストア命令とロード命令との間にLFENCE又はSSBBのメモリバリア命令を追加する。
【0100】
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]
【0101】
この攻撃型に対する対処アプローチは、(前述した)
図1Dの方法192や
図1Fの方法194を用いることで、攻撃者プロセスが投機的実行エンジンの上記のような脆弱性をエクスプロイトするのを検出し阻止する。
【0102】
(Spectre RSB)
【0103】
今日のプロセッサでは、洗練された分岐予測器163を用いて、条件分岐や間接分岐やコールの方向や宛先が予測される。リターン命令は、このような予測器にとって課題となる。というのも、リターンアドレスは関数を呼び出したコール位置に左右されるものであり、かつ、関数の多くは所与のプログラムのうちの様々な場所から呼び出されるため、それによって分岐予測器のパフォーマンスが低下し得るからである。例えば、プログラム内の数多くの様々な位置から呼び出され得るprintf()のような関数が挙げられる。リターン先についての過去の履歴に頼ると、分岐予測器による予測パフォーマンスが極めて低くなり得る。この攻撃型のさらなる詳細については、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を参照されたい。
【0104】
この問題を克服するため、リターンアドレスは、次のようにリターンスタックバッファ(RSB)を用いて予測される。RSBは、コール命令が実行されるたびにプロセッサがリターンアドレスをプッシュするハードウェアスタックバッファであり、マッチするリターンに遭遇した際に、プロセッサはそれをリターン先予測として使用する。
図1Hに、実行済みの2つの関数コール(F1およびF2)後のRSBの状態の一例を示す。
図1Hの(a)には、関数のスタックフレーム情報及びリターンアドレスが記憶される、プログラムのソフトウェアスタックの状態も描かれている。
図1Hの(b)には、関数F2のリターン命令が実行された際に、どのようにして双方のスタックの値が使用されるのかが示されている。このとき、高速シャドースタックのリターンアドレスが用いられることにより、リターンアドレスの位置が素早く推測される。この時点で実行されている命令は、投機的であると考えられる。一方で、ソフトウェアスタックからも、リターンアドレスが、関数フレームの分解物の一部としてフェッチされる。このリターンアドレスは、メインメモリ内にある(キャッシュに格納されていない)可能性があり、その場合には数百サイクル後に受け渡されることになる。ソフトウェアスタックのほうのリターンアドレスが解決することで、投機的処理の結果が確定する。当該リターンアドレスがRSBのほうの値と一致した場合には、投機的に処理された命令がコミットされ得る。一致しなかった場合には、投機失敗が発生したことになり、投機的に実行した命令を無かったことにする必要がある。この挙動は、リターン命令によりトリガされるという点を除けば、分岐予測器による投機的処理に似ている。なお、リターンが順序外で発行され得て、しかも、その他の従属関係が解決しない限りリターンのコミットが行われないことから、投機失敗による時間窓は大幅に長くなり得る。
【0105】
Intelのプロセッサは、RSBが空になってRSBの充填不足状態が生じると、分岐予測器を代わりに使用してリターンアドレスを推測する。よって、この状況ではリターン命令によって分岐予測器が推測失敗を引き起こす可能性があるので、Spectre 2から間接分岐を保護するために配備した防御策が役に立たなくなる。Skylake+プロセッサでは、この状況に対処するために、RSB再補充(ソフトウェアパッチ)を実装している。推測失敗の可能性を防ぐために、RSBには、カーネルへの切替えがあるたびに(Retpolineと類似した)無害の遅延ガジェットのアドレスが意図的に補充される。つまり、RSB再補充は、全く異なる目的に設計されたものであるがSpectreRSBの妨げになる。ただし、Skylakeよりも前のCorei7プロセッサにはどれもRSB再補充のパッチが施されておらず、他のプロセッサライン(重要なところでは、Intelベースのクラウドコンピューティングシステムやサーバで使用される主要プラットフォームであるIntel Xeonが含まれる)についてもパッチは施されていないため、これらはSpectreRSBの攻撃を受け易くなる。
【0106】
これらのプロセッサでRSB「スタック」が空になると、RET命令は、間接分岐予測器の内容に基づいて投機的な推測を行い得る。この構造こそ、Retpolineが阻止しようとするものである。つまり、「Retpoline」を中心とする防御が役に立たなくなることを意味する。次の条件下で、RSBが空になり得る:条件の一つは、コールスタックがRSBの最小深度(16)よりも深くなることである。このときにRET命令を実行すると、RSBが空になり得る。これには、アボート時のTSXトランザクション内におけるCALL命令及びRET命令が含まれる。Intelトランザクショナルシンクロナイゼーションエクステンション(TSX)は、ハードウェアロック省略(HLE)および制限付きトランザクションメモリ(RTM)と称される、x86命令群の2種類の拡張の製品名である。RTMは、命令群に対し、ハードウェアトランザクションの一部として実行すべきコード領域を宣言するのに用いる幾つかの命令を追加する拡張である。別の条件として、間接分岐予測器バリア(IBPB)コマンドがRSBを空にする可能性が挙げられる。なお、HLEは、特定の命令に追加されることが可能なプリフィックス群である。これらのプリフィックスは、当該プリフィックスを使用したコードが古いハードウェアでも動作するように後方互換性を有する。別の条件として、SGX命令(ENCLS、ENCLU)およびSGX CPUID leafが挙げられる。さらなる別の条件は、OSコンテキスト切替え、C++例外、longjmpのように、CALL命令とRET命令のバランスが崩れてCALL命令よりもRET命令が多くなることである。さらなる別の条件として、C6以上のスリープステート(例えば、MWAIT等)に移行することでRSBが空になる可能性が挙げられる。
【0107】
コールスタックの深度は実行時まで分からない数多くの要因に左右され得るので、コールスタックにソフトウェアで対処することは困難である。しかし、深いコールスタックのエクスプロイトでは、従来の分岐先インジェクション(Spectre 2型)攻撃よりも遥かに徹底的にCPU及びプログラム状態の挙動を制御及び予測することが要求されると考えられる。攻撃者プロセスの目的は、RSBスタックを空にし、それ以降の投機的推測が間接分岐予測器に基づいて試みられるようにすることである。投機的実行エンジンが間接分岐予測器を使用するようになると、Spectre 2攻撃が可能となる。
【0108】
全てのサイドチャネル攻撃に共通する対処策の一つは、不正な実行ファイルやライブラリを実行させないことである。これにより、悪質なサイドチャネルプロセスは確実に実行できなくなる。
【0109】
この攻撃型に対する、本発明の(被害者プロセスを保護する)対処アプローチの一つは、(前述した)
図1Eの方法193を用いて被害者プロセスを保護する。
図1Eの方法193は、さらに、所与のスレッドで被害者プロセスに関する間接分岐移動が生じた回数に基づくカウントを追跡かつ保持し得る。これにより、方法193は、分岐移動が投機的に行われたものであるか否かを判定することができる。所与のスレッドでの間接分岐のカウントが閾値レベル(間接分岐の予測失敗を示す閾値レベル)を上回ると、方法191は被害者プロセス又は当該所与のスレッドを終了する。
【0110】
この攻撃型に対する、(被害者プロセスを保護する)第2の対処アプローチを、
図1Gの方法195に示す。方法195は、アプリケーション空間とCPUとの間に監視命令を挿入する(541)。方法195は、アプリケーションの実行中に、リターンスタックバッファが攻撃者プロセスにより攻撃されているという脆弱性を示唆する状態を、前記監視命令を用いて特定する(542)。当該状態は、コール深度を増やす割込み/NMI/トラップ/アボート/例外、システム管理割込み(SMI)、ホストのVMEXIT/VMRESUME/VMENTER、および同一コアの別の論理プロセッサのマイクロコード更新ロード(WRMSR 0x79)のうちのいずれかを含む。これに応答して、方法195は、リターンスタックバッファが空にならないように、前記監視命令を介してRSB補充列(例えば、無害の遅延ガジェット/命令のアドレス等)をRSBへと(例えば、アプリケーションコード内に)動的に挿入する(543)。
【0111】
方法195は、さらに、RSBが空になったか否か(およびアプリケーションが間接分岐予測器に頼っている否か)を前記監視命令を用いて監視する(544)。次の動作が原因で、RSBスタックは空になる:過剰なTSXアボート;WRMSRを0x79に書き込むこと(マイクロコードの更新);0x7A(SGX起動);0x8C~0x8Fに対するWRMSR/RDMSR(SGX起動エンクレーブパブリックキーハッシュ);SGX命令(ENCLS,ENCLU)及びSGX CPUID leaf;OSコンテキストの過剰な切替え回数;ユーザ空間の過剰な例外回数;longjmp()の過剰な呼出し;ならびにC6以上のスリープステートの過剰な呼出し。リターンスタックバッファが空になると、方法195は、攻撃者プロセスの終了、隔離領域への攻撃者プロセスの移動、プロセスファイルの正当なコピーの復元、プロセスファイルを修正するための少なくとも1つのパッチのロード、プロセスが悪意あるものであることのユーザへの報告などといった保護措置を実施する(545)。
【0112】
この攻撃型に対する、本発明の別の対処アプローチは、(前述した)
図1Eの方法193を用いて被害者プロセスを保護する。
【0113】
この攻撃型に対する、本発明のさらなる別の対処アプローチは、(前述した)
図1Dの方法192や
図1Fの方法194を用いることで、攻撃者プロセスが投機的実行エンジンの上記のような脆弱性をエクスプロイトするのを検出し阻止する。
【0114】
(Foreshadow Intelソフトウェアガードエクステンション(SGX)エンクレーブ侵入(CVE-2018-3615))
【0115】
今日の広く普及しているオペレーティングシステムやアプリケーションに信頼を寄せることは、本質的に困難である。というのも、それらのサイズは何百万ものコードラインに容易に到達し得て、たった一つの脆弱性であらゆるセキュリティ保証が完全に崩壊することもしばしば起こり得るからである。最新の研究や業界の努力により、これらの課題に応えるかたちで、エンクレーブと称される隔絶されたアプリケーションコンパートメントの代替的非階層保護モデルを特徴とする、トラステッドエグゼキューション環境(TEE)が開発された。この攻撃型のさらなる情報については、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を参照されたい。
【0116】
TEEは、プロセッサパッケージ及びマイクロコードのみを含む最小限のトラステッドコンピューティングベース(TCB)により、相互に不信頼なエンクレーブの機密性及び完全性を強化する。エンクレーブのプライベートなCPU及びメモリ状態には、その内部で動作するコードのみがアクセス可能であり、それ以外のあらゆるエンクレーブや(悪意ある可能性があるオペレーティングシステム及び/又はハイパーバイザーも含め)任意の特権レベルで動作するソフトウェアが全く到達できない状態に維持されている。TEEは、強力なメモリ隔絶以外にも、ある特定のエンクレーブが純正の(つまり、セキュアと見なせる)TEEプロセッサにロードされていることをローカル又はリモートのステークホルダーが実行時に暗号を用いて確認するのを可能にする、アテステーションプリミティブを典型的に提供する。
【0117】
Foreshadow攻撃は、最新のIntelx86プロセッサの投機的実行バグを用いて、CPUキャッシュからエンクレーブのプレーンテキストの秘密情報を確実に漏洩させるものである。根本的には、Foreshadow攻撃は、Meltdown攻撃と同じプロセッサ脆弱性(すなわち、一時的な順序外命令での不正メモリアクセスの結果がロールバックされる前に当該結果を攻撃者が利用するのを可能にする、CPUのアクセス制御ロジックにおける巧妙な競合状態)を悪用する。ただし、重要なのは、Meltdownは従来の階層型保護領域を標的とするのに対し、Foreshadow攻撃は全く異なる攻撃者モデルを想定しているという点である。敵の目標は、ユーザ空間からカーネルメモリを読み取ることではなく、近年配備されているカーネルページテーブル隔絶防御による対策が講じられていない、最新技術であるアドレス空間内エンクレーブ保護領域に侵入することである。Foreshadow攻撃は、被害者マシンへのルートアクセスを持たない非特権の敵側で全てが実施され得る。カーネルレベルの強力な敵に対して防御を講じるというSGXの志しにもかかわらず、今日のSGXプロセッサは、非特権ユーザ空間の攻撃者からエンクレーブの秘密情報を保護することすら出来ない。
【0118】
この攻撃型に対する、本発明の(被害者プロセスを保護する)対処アプローチの一つは、(前述した)
図1Eの方法193を用いて被害者プロセスを保護する。
図1Eの方法193は、さらに、所与のスレッドで被害者プロセスに関する間接分岐移動が生じた回数に基づくカウントを追跡かつ保持し得る。これにより、方法193は、分岐移動が投機的に行われたものであるか否かを判定することができる。所与のスレッドでの間接分岐のカウントが閾値レベル(間接分岐の予測失敗を示す閾値レベル)を上回ると、方法191は被害者プロセス又は当該所与のスレッドを終了する。
【0119】
この攻撃型に対する、本発明の(被害者プロセスを保護する)第2の対処アプローチを、
図1Iの方法195に示す。方法195は、アプリケーション空間とCPUとの間に監視命令を挿入する(541)。方法195は、アプリケーションの実行中に、リターンスタックバッファが攻撃者プロセスにより攻撃されているという脆弱性を示唆する状態を、前記監視命令を用いて特定する(542)。当該状態は、コール深度を増やす割込み/NMI/トラップ/アボート/例外、システム管理割込み(SMI)、ホストのVMEXIT/VMRESUME/VMENTER、および同一コアの別の論理プロセッサのマイクロコード更新ロード(WRMSR 0x79)のうちのいずれかを含む。これに応答して、方法195は、リターンスタックバッファが空にならないように、前記監視命令を介して「RSB補充」列をRSBへと(例えば、アプリケーションコード内に)動的に挿入する(543)。
【0120】
方法195は、さらに、RSBが空になったか否か(およびアプリケーションが間接分岐予測器に頼っている否か)を前記監視命令を用いて監視する(544)。次の動作が原因で、RSBスタックは空になる:過剰なTSXアボート;WRMSRを0x79に書き込むこと(マイクロコードの更新);0x7A(SGX起動);0x8C~0x8Fに対するWRMSR/RDMSR(SGX起動エンクレーブパブリックキーハッシュ);SGX命令(ENCLS,ENCLU)及びSGX CPUID leaf;OSコンテキストの過剰な切替え回数;ユーザ空間の過剰な例外回数;longjmp()の過剰な呼出し;ならびにC6以上のスリープステートの過剰な呼出し。リターンスタックバッファが空になると、方法195は、被害者プロセス又は攻撃者プロセスの終了、隔離領域へのプロセスの移動、プロセスファイルの正当なコピーの復元、プロセスファイルを修正するための少なくとも1つのパッチのロード、プロセスが悪意あるものであることのユーザへの報告などといった保護措置を実施する(545)。
【0121】
この攻撃型に対する別の対処アプローチは、(前述した)
図1Dの方法192や
図1Fの方法194を用いることで、攻撃者プロセスが投機的実行エンジンの上記のような脆弱性をエクスプロイトするのを検出し阻止する。
【0122】
(Foreshadow-NG-1(別名:L1TF-NG-1-IntraOS)(CVE-2018-3620)およびForeshadow-NG-2(別名:L1TF-NG-2-InterVM)(CVE-2018-3646))
【0123】
次の各カテゴリーは、アーキテクチャ外の経路に沿った投機的実行へ移行するための基本的手法である。具体的には、条件分岐予測失敗、間接分岐予測失敗、例外提供又は例外遅延、およびメモリアクセス予測失敗である。L1TFは、アーキテクチャ上の例外を発生させるロジックに関連した投機的(又は順序外)実行についてのものなので、(MeltdownやレイジーFP状態復元と同じく)例外提供又は例外遅延の投機的プリミティブカテゴリーに属する。これらの攻撃型のさらなる情報については、“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を参照されたい。
【0124】
L1TFは、ページテーブルウォークを実行する際のアドレス変換の処理に関連したCPU最適化が原因で生じるものである。線形アドレス変換時のCPUは、仮想アドレスのページング構造エントリが存在しない(存在ビットが0である)か又は有効でない場合に発生するターミナルページフォールトに遭遇する可能性がある。これは、ページフォールトなどの例外や、アーキテクチャ上の経路に沿ったTSXトランザクションのアボートに繋がる。しかし、L1TFの攻撃対象となるCPUは、これらのいずれかが起こる前に、変換中の線形アドレスでL1データキャッシュの読出しを開始する場合がある。投機的にのみ行われるこの読出しの際には、ターミナル(存在しない)ページテーブルエントリのページフレームビットが、ゲストページテーブルエントリであってもシステム物理アドレスと見なされる。この物理アドレスのキャッシュラインがL1データキャッシュに生じると、このラインのデータが、前記ターミナルページフォールトを招いた命令のリタイアまで投機的に実行され得る従属処理へと受け渡され得る。L1TF関連の挙動は、従来のページテーブルおよび拡張ページテーブル(後者は仮想化に用いられる)のいずれを伴うページテーブルウォークの場合にも起こり得る。
【0125】
これがどのようにして起こり得るのかを説明するために、次の簡単な例について考えるのが役立ち得る。この例では、攻撃者が操作する仮想マシン(VM)が、当該VM内に、希望のシステム(ホスト)物理アドレスを読み取ることを目的としたページテーブル階層構造を構築したとする。下記の図は、仮想アドレス0x12345000の例的な階層構造として、ターミナルページテーブルエントリが存在しないものの
図1Iに示すように0x9a0のページフレームを含んでいる階層構造を示したものである。この階層構造をセットアップした後、前記VMは、次のような命令列により[0x9a0000~0x9a1000)内のシステム物理アドレスからの読取りを試みたものとする:
【0126】
【0127】
VMは、これらの命令をTSXトランザクション内で実行したり、アーキテクチャ上のページフォールトを処理したりする際に、システム物理アドレス=0x9a0040に関連付けられたL1データキャッシュラインから(当該L1内に存在していれば)投機的ロードを行って当該キャッシュラインの最初のバイトを、当該バイトを信号配列へのオフセットとして用いる順序外ロードに受け渡そうと試みると考えられる。これにより、フラッシュ&リロードなどの暴露プリミティブを用いてそのバイト値を調べることが可能な状態が生じる。このシステム物理アドレスがVMに割り当てられていない場合には、セキュリティ境界を越えて情報が暴露されることになる。上記のシナリオは、(VMがゲストページテーブルの完全な支配権を有している場合に)仮想マシンの境界を越えて物理メモリを推測するのにL1TFが適用され得る様子を説明したものである。しかし、L1TFは、それ以外のシナリオでも利用される可能性がある。例えば、ユーザモードのアプリケーションがL1TFを用いて、当該ユーザモードのアドレス空間内に存在しないターミナルページテーブルエントリで参照される物理アドレスからの読取りを試みることも可能である。実際、存在しないページテーブルエントリフォーマットのソフトウェアビットを用いて、有効な物理ページフレームに相当し得るメタデータを記憶することは、オペレーティングシステムの常套手段である。これにより、プロセスは、当該プロセス(あるいは、仮想化シナリオであればVM)に割り当てられていない物理メモリや、当該プロセス内でアクセス出来ないように意図されている物理メモリ(例えば、WindowsのPAGE_NOACCESSメモリ等)を読み取ることが可能になる。
【0128】
この攻撃型に対する、本発明の対処アプローチの一つは、次のようなものである。この攻撃型に対する、本発明の実施形態は、アプリケーション空間と投機的実行エンジンのCPUとの間に監視命令を挿入する。実施形態は、当該監視命令を用いて、セキュリティ領域の移行(異なるプロセス間での動作のコンテキスト切替え)を検出し且つそれに応答してL1データキャッシュを動的にフラッシュし得る。前記監視命令は、さらに、過剰なTSXアボートを監視(検出)し、過剰なTSXアボートが検出された場合には被害者プロセスを終了する。実施形態は、セキュリティ技術導入ガイド(STIG)やユーザ設定に基づくルールベースのポリシーを用いて、TSXアボートやプロセス間のコンテキスト切替えの監視や、キャッシュのクリア動作や、被害者プロセスの終了を行い得る。
【0129】
この攻撃型に対する、本発明の別の対処アプローチは、(前述した)
図1Dの方法192や
図1Fの方法194を用いることで、攻撃者プロセスが投機的実行エンジンの上記のような脆弱性をエクスプロイトするのを検出し阻止する。
【0130】
(Spectre NG3(CVE-2018-3665)レイジーFPU状態復元)
【0131】
今日のプロセッサでは、効率的な浮動小数点及びSMID演算を進めるために用いるレジスタのセットがますます大規模になってきている。この大規模なレジスタのセットは、オペレーティングシステムのコンテキストがタスク間で切り替わる際に内容を保存したり復元したりする必要があるためオペレーティングシステムにとって負担となる。最適化の一つとして、オペレーティングシステムは、x87浮動小数点演算装置(FPU)及び単一命令複数データ(SIMD)レジスタのセットのコンテキスト切替えを、当該レジスタへのアクセスを必要とする最初の命令が実行されるまで遅らせ得る。その間、古い内容は、現在のタスクがこれらのレジスタを使用しないことを期待しながら保持される。この最適化は、レイジーFPUコンテキスト切替えと一般的に称される。これを可能にするために、プロセッサは、浮動小数点レジスタやSMIDレジスタを用いる命令の存在をトグルで示すという機能をしばしば提供している。命令がオフにされていると、当該命令を実行しようとする試みはどれもフォールトを生じる。レイジーFPUコンテキスト切替えを悪用することで、任意プロセスやVMのFPU及びSIMDレジスタのセットを復元することができる。この攻撃は、FPU又はSIMD命令の最初の使用を示すフォールトを生じさせる命令の後続に位置したFPU又はSIMD命令を、プロセッサに一時的に実行させることで機能する。そして、オペレーティングシステムがレイジーFPUコンテキスト切替えを用いた際のキャッシュの副作用を利用することで、別のプロセスや仮想マシンのFPU及びSMIDレジスタの内容を再構築することができる。この攻撃型のさらなる情報については、Stcklina達の“LazyFP: Leaking FPU Register State using Microarchitectural Side-Channels,” arXiv:1806.07480 ((https://arxiv.org/abs/1806. 07480), 2018を参照されたい。
【0132】
SIMDレジスタは暗号計算だけでなくメモリのコピーなどといった簡単な演算にもますます使われてきているので、上記のようなレイジーFPUコンテキスト切替えは、影響を受けるプロセッサで登用される可能性があるどのオペレーティングシステムにおいてもオフにされるべき危険な最適化である。Meltdownとは異なり、研究者達は、ページフォールト(#PF)例外ではなくデバイスノットアベイラブル(#NM)例外に遭遇した場合の最新のIntelプロセッサの挙動をエクスプロイト対象としている。この例外は、レイジーFPUコンテキスト切替えと称されるコンテキスト切替え最適化を実現する際に使われるものである。この最適化と非特権ローカルコード実行とを組み合わせることで、投機的命令の実行により、被害者プロセスのFPUレジスタ状態を完全に復元することが可能となる。
【0133】
例的な攻撃シナリオの一つは、1ビットリークの単純なx86アセンブリプログラムである。SSEレジスタxmm0の下位半分が、rax汎用レジスタに読み込まれる。次に、最下位ビットをマスクして、これを6ビットシフトして入力値に応じて0又は64とする。計算後のこのオフセットが、メモリへの書込みに用いられる。64ビットのキャッシュラインを有するシステムでは、書込み処理が、xmm0レジスタのビット0に応じて2つのキャッシュラインのいずれかにタッチする。レイジーFP攻撃の基本構成単位は以下のとおりである:
【0134】
movq rax , xmm0
and rax , 1
shl rax , 6
mov dword [mem + rax], 0
【0135】
FPUレジスタのアクセスは、前のプロセスのFPUレジスタのセットを用いて投機的に実行される。この実行は、最初の命令で生じた#NM例外をオペレーティングシステムのカーネルが処理した時点で、リタイアされる。FPUレジスタがレイジーFPUコンテキスト切替えによって被害者プロセスに所有されていると仮定すると、movq命令によって#NMフォールトが生じ、FPUを使用できないことがオペレーティングシステムに伝えられる。オペレーティングシステムはこのフォールトをトランスペアレントに処理し、現在のプロセスのレジスタ状態を復元して実行を続行する。プロセッサがmovqをリタイアして#NMフォールトを生成する前に、興味深いことが起こる。プロセッサは、後続の命令を既に投機的に実行しているのである。これらの命令で生じるアーキクチャ上の変化は廃棄されるものの、キャッシュ内のマイクロアーキテクチャ的な痕跡は残る。被害者のFPUレジスタのセットを用いたコードの投機的実行と、攻撃者のレジスタのセットを用いた通常の実行とが行われる。攻撃者が、xmm0をゼロにセットし且つプロセッサのキャッシュのmem+64をフラッシュしたと仮定する。すると、攻撃者は、このメモリ位置のアクセスレイテンシをプローブすることにより、被害者のビットを復元することができる。この攻撃を繰り返すことで任意のレジスタから任意のビットを漏洩させることが可能であるが、このような単純形態のものは実用的でない。漏洩を試みるには、その前に被害者が必ず実行を行う必要がある。これは、FPUの所有権を被害者に戻すために必要である。しかし、これは、被害者によってレジスタの内容が変更される可能性が高く、結果の悪用が難しくなることも意味している。
【0136】
この攻撃型に対する、本発明の対処アプローチの一つは次のとおりである。この攻撃型に対する、本発明の実施形態は、アプリケーション空間と投機的実行エンジンのCPUとの間に監視命令を挿入する。実施形態は、BIOS設定が“eagerfpu=on”であることを前記監視命令を用いて確認する。これにより、ホストプラットフォームは、レイジーFPU状態復元の脆弱性の攻撃を確実に受けない。このBIOS設定が“on”に設定されていなければ、実施形態は、このBIOS設定を“on”へと前記監視命令を用いて動的に変更する。実施形態は、セキュリティ技術導入ガイド(STIG)やユーザ設定に基づくルールベースのポリシーを用いて、BIOS設定を確認し変更し得る。
【0137】
この攻撃型に対する、本発明の別の対処アプローチは、(前述した)
図1Dの方法192や
図1Fの方法194を用いることで、攻撃者プロセスが投機的実行エンジンの上記のような脆弱性をエクスプロイトするのを検出し阻止する。
【0138】
(BranchScope(CVE-2018-9056)パターン履歴テーブル攻撃)
【0139】
今日のマイクロプロセッサは、実行パイプラインへの命令提供を条件分岐間で途切れなく維持するのに、分岐予測装置(BPU)を必要とする。複数のプロセスが同じ物理コアで実行される場合、当該複数のプロセスは一つのBPUを共有する。この共有構成は、有用性や複雑性の観点からは魅力的である一方、攻撃者がその共有のBPU状態を操作してサイドチャネルを作り出し、被害者プロセスで実行される分岐命令の分岐方向や分岐先を導出するための機会を与える可能性がある。このような漏洩により、秘匿のデータが奪われ得る。例えば、分岐命令が秘密鍵のビットを条件としている場合には、その鍵のビットが直接漏洩してしまう。これは、今日の暗号方式の冪乗アルゴリズムやその他の重要な数学的演算の実装でも起こる。また、攻撃者が予測器の状態を変更し、被害者側での当該予測器の挙動を変えてしまうという可能性もある。この攻撃型のさらなる情報については、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を参照されたい。
【0140】
今日のマイクロプロセッサにおいてBPUは、分岐先バッファ(BTB)と分岐方向予測器との2つの構造で構成される。過去の研究は、サイドチャネルの生成の標的としてBTBに特化したものであった。BTBでは、分岐が成立した場合にのみ、条件分岐の分岐先が更新される。これを利用することで、特定の被害者分岐が成立したか否かを検出することが可能となる。この分野で最初に提案された攻撃は、攻撃者がBTBに補充を行うことで被害者に属するエントリを追い出すことに基づいた幾つかのBTBベースの攻撃である。以降のアクセスの時間計測を行うことにより、攻撃者は、被害者がどの分岐を新たに実行したのかを推測することができる。研究者達は、関連研究の欄でこれらの攻撃及び当該攻撃の限界について述べている。BTBに関して提案されたサイドチャネル攻撃は、被害者プロセスと攻撃者プロセスとの間でBTBの衝突を生じさせることで、アドレス空間レイアウトランダム化をバイパスして攻撃者がアドレス空間における被害者の特定の分岐命令の位置を見つけ出すことを可能にするものである。別の研究者達(Lee達)はこの研究を基にして、BTBの衝突を用いることで、被害者の分岐命令の方向も明らかにした。彼らは、IntelのSGXエンクレーブに対するカーネル空間の攻撃を立証した。
【0141】
研究者達は、分岐方向予測器を情報漏洩源の標的とする、BranchScopeと呼ばれるマイクロアーキテクチャ上の新たなサイドチャネル攻撃を提案する。BranchScopeは、分岐方向予測器の構造を利用した最初の攻撃であり、BTBが保護されていてもBPUが攻撃を受ける可能性があることを示している。BranchScopeは、攻撃者側の分岐と被害者側の指定の分岐とを衝突させて、当該衝突を用いて被害者側の分岐についての情報を推測することで機能する。この攻撃には、BTB攻撃にはない新たな課題がある。衝突を達成するには、今日のCPUで使われているハイブリッド型の複雑な予測メカニズムの動作予測不能性を克服しなければならない。BranchScopeは、プロセッサに様々なレベルの複数個の複雑な予測器が存在している場合であっても分岐予測器がローカルの1レベル予測を選択するようにさせる分岐パターンを生成することにより、これを克服する。そして、衝突が確実に作り出されてしまえば、所定の結果を有する一対の分岐を攻撃者が実行し、これらの分岐の予測精度を測定し、この情報を予測器の状態、つまり、被害者側の分岐方向と関連付けることで、被害者側の分岐方向を手堅く暴露することが可能となる。
【0142】
今日の分岐予測器は、プログラムカウンタにより直接インデックスされる単純な1レベルbimodal予測器(1レベル予測器と一般的に称される)と、gshare型の2レベル予測器との組合せとして典型的に実装される。gshare型の予測器は、分岐結果が最近の分岐の結果だけでなく分岐のアドレスにも依存するという考えを利用したものである。
【0143】
分岐アドレスによりインデックスされたセレクタテーブルは、所与の分岐にとってどちらの予測器のほうが良好になる可能性が高いのかを、当該予測器同士の過去の挙動に基づいて特定する。この設計は、両コンポーネントの予測器における最良の特徴を組み合わせたものである。以下の図に、このようなハイブリッド型の予測器として考えられ得る設計の一つを示す。1レベル予測器は、パターン履歴テーブル(PHT)の2ビット飽和カウンタの形態で自身の履歴を記憶する。gshare型の予測器は、プログラムカウンタとグローバル履歴レジスタ(GHR)とを組み合わせたより複雑なインデックス方式を有する。GHRは、プログラムが実行した最近の幾つかの分岐の結果を記録する。分岐履歴情報は、さらに、2ビット飽和カウンタを用いてPHTにも記憶される。これら2種類の予測器の唯一の違いは、PHTがインデックスされる方法である。分岐が成立すると予測されると、当該分岐の分岐先アドレスが、分岐先バッファ(BTB)と称される構造から取得される。分岐先バッファ(BTB)は、所与の分岐の最も新しい分岐先アドレスを各々のBTBエントリにマップして記憶する、ダイレクトマップ方式の単純なアドレスキャッシュである。これまでに公開されているBPUへのサイドチャネル攻撃は、いずれもBTBを標的としたものであった。対照的に、BranchScopeは、
図1Jに示すようにBPUの方向予測部を標的とする。
【0144】
一般的に、この攻撃は次のようにして行われる。第1段階:PHTエントリのプライム:この段階では、攻撃者プロセスが、標的のPHTエントリを所定の状態へとプライムする。このプライム動作は、巧妙に選択され且つランダム化してなる複数の分岐命令からなるブロックを実行することによって達成される。このブロックは、攻撃者により一回だけ推測的(a-priori)に生成される。第2段階:被害者側の実行:次に、攻撃者は、監視したい分岐を被害者プロセス内で実行開始し、そのPHT状態が被害者側の動作で変わるまで待つ。第3段階:PHTエントリのプローブ:最後に、攻撃者は、被害者と同じPHTエントリをターゲットにした分岐命令をさらに実行すると共に、時間を計測することでそれらの予測結果を調べる。攻撃者は、当該予測結果をPHTの状態と関連付けることにより、被害者側の分岐の方向を特定する。攻撃者は、自身の分岐と被害者プロセスの分岐とをPHTで衝突させることが可能でなければならない。予測器の動作が分かっていれば、これらの衝突により(具体的には、第3段階で実行する攻撃者のプローブ用分岐の予測精度に対する(上記の第2段階で実行された)分岐の影響を調べることにより)、攻撃者は被害者側の分岐の方向を明らかにすることができる。PHTインデックスが(1レベル予測器のように)命令アドレスで厳密に決まるものであれば、2個のプロセスの分岐同士をPHTで衝突させることは、被害者側のコードの仮想アドレスが典型的に秘密でないので単純明快である。アドレス空間レイアウトランダム化(ASLR)を用いてコードの場所がランダム化されている場合には、データ暴露やASLRへのサイドチャネル攻撃を用いることにより、攻撃者は非ランダム化を実施することができる。
【0145】
この攻撃では、予測器内で衝突を生じさせることが必要となる。衝突の生成は、使用する予測器が複雑なgshare型の予測器ではなく単純なインデックスの1レベル予測器であれば非常に簡単である。この攻撃では、攻撃者のコードと被害者のコードの双方に1レベル予測器を使用させる必要がある。これは、以下に述べるプライム&プローブ戦略を用いて達成される。攻撃者のコードにおける新たな分岐に対し、1レベル予測器が直接使用されるようにすることで、1レベル予測器の使用を強制させる。分岐予測器にて被害者側の分岐(同じく1レベル予測器を使用すると仮定する)と衝突するアドレスに設けられた分岐を複数繰り返し、攻撃に使用された分岐が常にBPUに存在しないようにすることで、当該ユニットに1レベル予測器を使用させることができる。
【0146】
それよりも難しいタスクは、被害者コードに1レベル予測器を使用させることである。被害者コードは、攻撃者の支配下にない。標的となる被害者側の分岐について1レベル予測器をBPUに使用させるには、攻撃者が、次の2つの目標のいずれかを達成する必要がある:1)最近使われていなかった分岐を攻撃に使用することで、当該分岐の予測が確実に1レベルモードから始まるようにすること;および2)2レベル予測器を不正確なものにしてその訓練時間を長引かせることにより、少なくとも幾つかの分岐に関してセレクタに1レベルモードを選択させること。つまり、被害者コードに1レベル予測器を使用させるには、攻撃者が、これら2種類の特性のうちの(両方とは言わなくとも)少なくとも一方を確実に成立させなければならない。この目標は、分岐を大量に含むコードの命令列を攻撃者が作成してこれを実行することにより、BPUの状態を2レベル予測器の精度が下がった状態にする(場合によっては、被害者側の分岐に置き換わる)ことによって達成される。この命令列を実行した結果、被害者コードは分岐の実行時に1レベル予測器を使用するようになり、衝突の実現が可能となる。このコードは、別の重要な機能も果たす。当該コードにより、PHTエントリの状態が、(次の欄でリバースエンジニアリングで作成する)予測FSMの各処理毎の分岐結果を確実に検出できる所望の状態になる。この効率を最大化するには、ランダム化コードに2つの特性が備わっている必要がある。第一に、実行される分岐には、2レベル予測器で予測することが可能な規則的パターンが含まれていてはいけない。この目的のために、コード内の分岐方向は、分岐間で従属関係がないようにランダムに選ばれる。第二に、コードは、PHT内部の多数のエントリに影響を及ぼすものでなければならない。これは、大量の分岐命令を実行すると共に、当該命令間にNOP命令を設けたりNOP命令を設けなかったりすることで当該命令のメモリ位置をランダム化することによって達成される。結果パターンは(当該ブロック生成時の)一度だけランダム化させるのであって、実行時に再ランダム化させないものとする。分岐予測器に対するこれらの操作は、被害者が対象の分岐を実行する前に(攻撃の第1段階で)実行される必要がある。このように実行される必要のある分岐命令の総数は、特定のCPUにおけるBPUの内部データ構造のサイズに依存する。大半のPHTエントリの状態をランダム化し且つ2レベル予測器を実質的に不能化させるには、100,000個の分岐命令の実行で十分であることが実験で判明している。このようなコードの一例を、次のListing1に示す。今後の研究の課題は、このコードのサイズを減らすことである。例えば、特定の分岐を追い出すことだけに集中するのであれば、同じPHTにマップする(そのエントリに置き換わる)より短い分岐命令列を考え出すことが可能であり得る。
【0147】
randomize_pht:
cmp %rcx, %rcx;
je .L0; nop; .L0: jne .L1; nop; .L1: je .L2;
............
.L99998: je .L99999; nop; .L99999: nop;
【0148】
PHTの衝突を強制的に引き起こした後、攻撃者は、さらに、PHTの状態を理解して被害者側の分岐の方向を把握することが可能でなければならない。そのため、第1段階にてPHTエントリをどのような所望の開始時状態へとプライムしたのかが分かっていなければならない。この開始時状態により、第3段階における攻撃者のプローブ処理の所与の観測可能な挙動を被害者側の分岐の方向と関連付けることが可能にならなければならない。
【0149】
BranchScope攻撃で必要となる重要な機能は、分岐予測器のイベントを検出する能力である。アプローチの一つは、失敗した分岐を検出するハードウェアパフォーマンスカウンタを使用することである。このアプローチは、分岐予測の結果を明確に提供するハードウェアに頼るものである。しかし、攻撃者がこれを利用するには、少なくとも部分的に高い特権が必要となる。代替的なアプローチは、分岐関連のイベントを、当該イベントによるCPUのパフォーマンスへの影響を調べることで検出することである。予測に失敗した分岐は、間違った経路の命令をフェッチすることになるので、パイプラインのリスタートで大幅な数のサイクルが失われてしまう。したがって、サイクル数を追跡することにより、攻撃者は、分岐が正確に予測されたか否かを判断することができる。Intelのプロセッサにおいて、この時間計測(タイムキーピング)は、rdtsc又はrdtscp命令で実現可能である。これらの命令により、ユーザプロセスは、システムソフトウェアレイヤをバイパスしてタイムキーピングハードウェアに直接アクセスすることができる。BranchScope攻撃では、総合的なBPUパフォーマンスではなく、一つ一つの分岐実行の予測が正確であったのか又は不正確であったのかを攻撃者が検出する必要がある。攻撃目的での信頼性の高い測定メカニズムとしてのrdtscp命令の可用性を評価するために、一連の実験を実施する。まず、一つ一つの分岐命令について、分岐が成立した場合と分岐が成立しなかった場合との2種類の場合に関して、予測が正確であったときの時間測定と予測が不正確であったときの時間測定とを集める。それぞれの場合毎に、100,000個のサンプルを収集した。その結果によれば、分岐予測失敗によるパフォーマンスへの影響は顕著であり、しかも、その影響は実際の分岐方向にかかわらず存在する。個々のデータ点のみならず平均値においても、速度低下は明らかである。これらの測定値へのキャッシュ格納の影響をなくすため、各分岐を2回実行すると共に、命令がキャッシュに配された後となる2回目の実行時のレイテンシだけを記録した。
【0150】
BranchScopeは、IntelのSGXのような隔絶型実行をサポートするシステムを標的にするよう直接用いられることも可能であるし、一般的な環境における汎用的なサイドチャネル攻撃として用いられることも可能である。この欄では、IntelのSGX、およびそのような環境での攻撃の考慮事項に関する概要を述べた後、SGXエンクレーブ内部で動作している被害者に対しても実施することが可能な一連の具体的な攻撃について説明する。SGX環境でのBranchScopeについて説明するため、研究者達は、SGX外部の受信者へとSGXエンクレーブ内部で動作している送信者からBranchScopeを用いて通信を行うというカバートチャネルベンチマークを繰り返す。ノイズの存在下であっても、そのエラーレートは許容範囲に収まる。ただし、OSが(他のプロセスが実行しないようにして)ノイズを制御すると、チャネルの品質は上がる。モンゴメリラダーは、冪剰余アルゴリズムやスカラ乗算アルゴリズムにおいて良く使われるアルゴリズムである。これらのいずれの数学的処理も、公開鍵暗号の伝統的なRSA及び楕円曲線(ECC)実装の重要なコンポーネントを成している。モンゴメリラダーは、秘密鍵kのビット値kiに関係なく演算を実行することに基づいたものである。この実装により、実行経路が等化されてタイミングサイドチャネルやパワーサイドチャネルが軽減される。しかし、これには、kiの値に直接依存して動作する分岐が必要となる。Yarom達[55]は、ECDSA暗号のOpenSSL実装の脆弱性を、フラッシュ&リロードのキャッシュサイドチャネル攻撃を用いて立証した。この攻撃は、CPUのキャッシュを用いて対象の分岐の方向を探るものであった。BranchScopeでは、このような分岐の方向を直接明らかにすることができる。最新の暗号ライブラリには、秘密鍵のビットに直接依存する結果を有する分岐が含まれていない。しかしながら、一部の限られた情報についてはしばしば復元できる場合がある[6,8]。また、旧式のライブラリも、未だに数多く使用されている。秘匿の情報を明らかにする攻撃の別の例として、よく使われるJPEG符号化/復号化ライブラリであるlibjpegに対する攻撃が挙げられる。この攻撃は、解凍時に実行される逆コサイン変換(IDCT)処理によって可能となる。この最適化では、係数行列中の行の要素及び列の要素を0と比較することにより、高負荷の演算を回避する。このような比較の各々が、個々の分岐命令として実現される。BranchScopeは、これらの分岐を探ることにより、復号化後の画素ブロック間の相対的な複雑性についての情報を取得することができる。libjpegへの攻撃は、最適化が適用され得る回数をカウントしページフォールトサイドチャネル[27,54]を用いて元々の画像を復元することによって過去に立証された。BranchScope攻撃は、全ての行/列の要素がゼロとなる場合を識別できるだけでなく、どの要素がゼロでないのかも分かるので有利である。ASLR値の復元:BranchScopeを用いて、被害者エンクレーブ内の制御コードを推測することも可能である。攻撃者は、分岐同士の衝突を調べることにより、特定の分岐が成立したのか成立しなかったのかが分かるだけでなく、被害者の仮想メモリ内の分岐命令の位置も検出し得る。これにより、攻撃者は、アドレス空間レイアウトランダム化をバイパスすることができる。
【0151】
BranchScopeを用いて、被害者エンクレーブ内の制御コードを推測することも可能である。攻撃者は、分岐同士の衝突を調べることにより、特定の分岐が成立したのか成立しなかったのかが分かるだけでなく、被害者の仮想メモリ内の分岐命令の位置も検出し得る。これにより、攻撃者は、アドレス空間レイアウトランダム化(ASLR)保護をバイパスすることができる。同様の攻撃が、BTBを用いて過去に立証された[21,35]。Gruss[23]が示唆するように、Intelの最新のプロセッサにはBTBベースの攻撃が効かない。そのため、この種の攻撃では分岐方向予測器が唯一無二の候補となる。
【0152】
BranchScopeについても、2つの異なる対処アプローチが存在する。一方はアプリケーションに関するものであり、他方はサイドチャネル攻撃プロセスに関するものである。なお、間接分岐を有するプロセスは、BranchScope攻撃者プロセスの攻撃を受ける可能性がある。つまり、BranchScopeは、Spectre 2型の攻撃と似ている。BranchScopeは間接分岐予測を条件としているので、Retpolineベースのアプローチを用いることにより、間接分岐を完全に消失させることができる。この攻撃型に対する、本発明の第1の対処アプローチは、
図1Eの方法193を用いて被害者プロセスを保護する。BranchScope型の攻撃者プロセスは、RDTSC命令の悪用に主に依存して行われるプライム&プローブアプローチやフラッシュ&リロードアプローチの使用から検出することが可能である。
【0153】
BranchScopeは、プライム&プローブサイドチャネルやフラッシュ&リロードサイドチャネルに主に頼る。この攻撃型に対する本発明の第2の対処アプローチは、(前述した)
図1Dの方法192や
図1Fの方法194を用いることで、攻撃者プロセスが投機的実行エンジンの上記のような脆弱性をエクスプロイトするのを検出し阻止する。
【0154】
(投機的実行に対する防御のシステム)
【0155】
図2Aに、脆弱性(Spectre、Meltdown、Foreshadowなど)からアプリケーションを保護する例的なトラステッドエグゼキューションプラットフォーム200を示す。
図2Aは、
図1Aの投機的実行エンジンで脆弱性がエクスプロイトされることがないよう阻止するものである。
図2Aのプラットフォーム255では、ユーザ202が、クラウドコンピューティングプラットフォーム、ウェブサービスプラットフォーム(例えば、
図2Aのウェブインフラストラクチャ等)、仮想マシン(VM)プラットフォーム、その他のあらゆる無限数のコンピューティングプラットフォームなどといったコンピューティングプラットフォーム255でアプリケーションを開始する。コンピューティングプラットフォーム255は、当該コンピューティングプラットフォーム200のアプリケーション(アプリケーション空間206にロードされたアプリケーション)を実行する投機的実行を実装した少なくとも1つのマイクロプロセッサ(又は別種のプロセッサ)を備える。攻撃者は、コンピューティングプラットフォーム255がアプリケーション処理を実行している最中に、投機的実行により生じる前記マイクロプロセッサの脆弱性(Spectre、Meltdown、Foreshadowなど)をエクスプロイトし得る。
【0156】
アプリケーションコードがコンピューティングプラットフォーム255のメモリで実行されている最中に、解析執行エンジン(アプリケーションランタイム監視解析(VSP)アプライアンスとも称される)230が、前記脆弱性に対する仮想パッチを実施する。解析執行エンジン230は、コンピューティングプラットフォーム200がアプリケーション空間206から当該コンピューティングプラットフォーム255の中央演算処理装置(CPU)に向けてアプリケーションのコードをディスパッチする際に、AppSensor(又は解析エンジン)239によって当該コード(例えば、コンパイラ型コード、インタプリタ型コード、バイナリ等)を解析する。これを行うために、解析執行エンジン230は、実行時にアプリケーションコードを取得する(AppMapデータベース231に設定された)命令210をコンピュータプラットフォーム255へと、インターネットプロトコル(IP)パケットをイーサネットバス232でインターフェース214を介して送信することによって実装する。実装される当該命令は、コンピュータプラットフォーム255にインストールされた、当該プラットフォーム255で実行されるプロセスの動作を監視するセキュリティ監視エージェントの一部として構成され得る。
図2Aでは、実装された命令210が、コンピューティングプラットフォーム200において、アプリケーション空間206のランタイムサービス208とCPUに通信可能に接続された実装パイプライン212との間に位置している。実装された命令210は、コンピューティングプラットフォーム200に実装されたカーネル(システムコール)211にもアクセスする。前記解析執行エンジンは、実装された命令210(セキュリティ監視エージェント)で特定のデータ(アプリケーションコード)を取得したりAppSensor239でデータの解析やパッチの提供やその他の保護措置の実施を行ったりする際に、セキュリティ技術導入ガイド(STIG)やユーザ設定に基づいたルールベースのポリシーを適用し得る。
【0157】
解析執行エンジン230は、取得したアプリケーションコードを、実装された命令210により(インターフェース214を介して)受け取る。AppSensor239は、エンジン233,234,235,236,237と通信し、前記取得したアプリケーションコードの解析を実行する。これらのエンジンには、ユーザデータ検証234、インサイダー保護235、ファイルシステム監視236、および仮想保護237が含まれる。また、解析執行エンジン230は、実装された命令210により、アプリケーションコードの制御フロー233強化を実行し得る。例えば、解析執行エンジン230(例えば、インサイダー保護エンジン235、仮想保護エンジン237等)は、アプリケーションコードを(実装された命令210により)取得して受け取り、Spectreエクスプロイト/Meltdownエクスプロイト/Foreshadowエクスプロイトの攻撃を受け易い(例えば、境界外アクセスや分岐先インジェクションの攻撃を受け易い)命令列を有しているか否かについて(AppSensor219で)解析し得る。
【0158】
このような命令列の検出に応答して、解析執行エンジン230(例えば、インサイダー保護エンジン235、仮想保護エンジン237等)は、脆弱性に対する処置を決定し得る。解析執行エンジン230は、AppMapデータベース231内の、前記脆弱性を有するアプリケーションコードを修正するための保護命令を、決定した前記処置に基づいて特定する。メインプロセッサメモリ213から(命令パイプライン212を介して)CPUのキャッシュへとアプリケーションコードが実行のためにフェッチされる際に、解析執行エンジン230は、実装された命令(セキュリティ監視エージェント)210により、当該アプリケーションコード(例えば、バイナリコード等)内に保護命令(パッチ)を配置し得る。例えば、境界外アクセス(Spectre 1型)の場合、実装された命令210は、アプリケーションが投機的実行エンジンにより順序外で実行されるのを阻止する保護フェンス命令を配置し得る。別の例として、分岐先インジェクション(Spectre 2型)の場合、実装された命令210は、間接ジャンプ命令を直接コール命令へと変更し得る。また、解析執行エンジン230は、実装された命令210により、脆弱性のエクスプロイトを阻止するための別の動作を(インターフェース214を介して)実施するものであってもよい。さらなる別の例として、レイジーFPU状態復元の場合、実装された命令210は、BIOS設定を“eagerfpu=on”に変更し得る。さらなる別の例として、実装された命令210は、投機的エンジンのデータキャッシュをセキュリティ領域の移行時にフラッシュし得る。
【0159】
プロセスの実行開始前に、解析執行エンジン230は、(AppSensor239がファイルシステム監視エンジン236と通信することによって)各実行ファイルや各ライブラリのチェックサムを計算し、当該チェックサムを、プロセスファイルの有効なチェックサムを格納したシグネチャデータベースと照合する。チェックサムが一致しない場合、解析執行エンジン230は(インターフェース214を介して)、プロセスを終了させたり、プロセスを隔離領域に移動させたり、プロセスファイルの正当なコピーを復元したり、プロセスファイルを修正するための少なくとも1つのパッチをロードしたり、プロセスが悪意あるものであることをユーザに報告したりし得る。
【0160】
プロセスの実行開始時に、解析執行エンジン230は、(AppSensor239がファイルシステム監視エンジン236と通信することによって)当該プロセスを一時保留し当該プロセスの各プロセスファイルをスキャンする。解析執行エンジン230は、スキャン対象のプロセスファイルについて、Spectre/Meltdown/Foreshadowなどの脆弱性のエクスプロイトで使われるシグネチャ(例えば、コンピューティングプラットフォーム200でアプリケーションを処理するのに用いられるメモリ(例えば、データキャッシュ等)のフラッシュ動作等)をプロセスが含んでいるか否かを特定するための検査を行う。このようなシグネチャをプロセスが含んでいることが特定されると、解析執行エンジン230は、当該プロセスの実行中に、当該特定されたプロセスによるコールを取得解析する命令210を実装する。例えば、解析執行エンジン230は(例えば、AppSensor239がファイルシステム監視エンジン236と通信する等によって)、当該取得したコールを当該実装された命令210により解析し、プロセスが前記シグネチャを定められたパターン(例えば、フラッシュ動作が特定の頻度又はスピードで行われること、特定の変数のキャッシュラインが他のキャッシュラインよりも高速で読み出されること等)に従って実行しているか否かを検出し得る。前記定められたパターンは、解析執行エンジン230により、AppMap231データベースから取り出され得る。また、プロセスの実行中に、実装された命令210は、当該プロセスをリアルタイムで監視し当該プロセスが特権レベル命令でシステムレジスタ/カーネルレジスタ(例えば、Ring0内のCR0、CR1、CR2、CR3等)を使用しているか否かを判定し得る。
【0161】
解析執行エンジン230は、プロセスの実行が前記定められたパターンを満たしているか又はシステムレジスタ/カーネルレジスタが特権レベル命令で使用されていると判断すると、(例えば、インターフェース214を介して制御フロー強化エンジン233等により)そのプロセスを終了させるか又は当該プロセスに関してその他の保護措置を実施する。解析執行エンジン230は、コンパイラ型コードに対する攻撃により生じた変化を確実に特定するための決定論的メカニズムを提供する。当該解析執行エンジン230は、バイナリコードや、インタプリタ型言語で記述されたコードも含め、アプリケーションスタック全体を保護する。解析執行エンジン230は、投機的実行により生じるSpectre脆弱性やMeltdown脆弱性やForeshadow脆弱性やその他の脆弱性を利用したエクスプロイトを阻止可能な技術を実行する。
【0162】
図2Bに、アプリケーションを実行する少なくとも1つのマイクロプロセッサに存在する脆弱性(Spectre、Meltdown、Foreshadowなど)からアプリケーションを保護する、例的な別のトラステッドエグゼキューションシステム250を示す。
図2Bのシステム250は、解析執行エンジン(Virsecセキュリティプラットフォーム(VSP)アプライアンスとも称される)230を実行して、前記少なくとも1つのマイクロプロセッサを含むウェブアプリケーションインフラストラクチャを保護する。
図2Bのウェブアプリケーションインフラストラクチャ204では、ウェブサーバ216がユーザ202から(ウェブサービスクライアントを介して)ウェブ要求(例えば、HTTP要求等)を受信する。ウェブサーバ216は、ウェブ要求に含まれる情報(例えば、URL等)を用いてユーザ202を認証し、認証に成功すると、ユーザ202がウェブアプリケーションインフラストラクチャ204を介したサービスを享受するためのコネクション(又はセッション)を確立させる。アプリケーションサーバ218は、このコネクションを介したアプリケーション処理を処理することにより、データベースサーバと通信してデータ220にアクセスすることも含め、そのようなサービスをユーザ202に提供する。
【0163】
ウェブアプリケーションインフラストラクチャ204の少なくとも1つのコンポーネント(ウェブサーバ216、アプリケーションサーバ218およびデータベースサーバ220)は、投機的実行を用いる、脆弱性有りの前記少なくとも1つのマイクロプロセッサ上で実行され得る。ウェブアプリケーションインフラストラクチャ204がアプリケーション処理を実行している最中に、攻撃者は、投機的実行により生じる前記マイクロプロセッサの脆弱性(Spectre、Meltdown、Foreshadowなど)をエクスプロイトすることを試み得る。
図2BのVSPアプライアンス230は、コードがマイクロプロセッサのメモリで実行されている最中に、前記脆弱性に対する修正(パッチ)を実装する。このVSPアプライアンスのさらなる情報については、“Systems and Methods for Remediating Memory Corruption in a Computer Application”(WO 2017/218872 A1)を参照されたい。これを行うために、VSPアプライアンス230は、ウェブサーバ216、アプリケーションサーバ218及びデータサーバ220の、前記脆弱性有りの少なくとも1つのマイクロプロセッサによってコードが実行されている最中に、当該コード(例えば、コンパイラ型コード、バイナリ等)をAppSensor(解析エンジン)により動的に解析する。一部の実施形態において、VSPアプライアンス230は、動的バイナリ解析エンジンを用いて、メインプロセッサメモリとマイクロプロセッサのCPUとの間に関数又は命令を(ウェブインフラストラクチャ204にインストールされたセキュリティ監視エージェントの一部として)実装し得る。
【0164】
アプリケーションコードがマイクロプロセッサで実行されている際に、このような関数又は命令が実行されることで、アプリケーションのバイナリ(又はコンパイラ型コード)は、境界外アクセス、分岐先インジェクション、不正なデータキャッシュロードなどといったエクスプロイトの攻撃を受け易い命令を有しているか否かが決定論的に監視される。監視対象となる命令列は、VSPアプライアンス230の管理サーバ240のユーザインターフェース242を介してアドミニストレータにより設定されるAppMap231データベースなどから実装され得る。VSPアプライアンス230は、セキュリティ技術導入ガイド(STIG)やユーザ設定に基づくルールベースのポリシーを用いて、アプリケーションを監視するための特定の命令を実装し得る。他の実施形態において、VSPアプライアンス230は、アプリケーションのコードの実行前に、当該コードがそのような命令を有しているか否かを(例えば、AppSensor等により)静的に解析し得る。
【0165】
このようなエクスプロイトの攻撃を受け易い命令の検出に応答して、VSPアプライアンス230は(VSPの前記実装された命令又はセキュリティ監視エージェントを介して)、例えばセキュリティ監視エージェントにより実行される動的バイナリ計装エンジン等により、保護命令(パッチ)をリアルタイムでバイナリコードへと先制的に実装し得る。VSPアプライアンス230は、アプリケーションの実行中にメインプロセッサメモリからバイナリコードがフェッチされる際に、前記保護命令を実装する。例えば、VSPアプライアンス230は、前記命令列へとメモリバリア命令(例えば、フェンス命令等)を実装し得る。当該メモリバリア命令は、当該メモリバリア命令の前後に発行されるメモリ処理を順序どおり実行する制約を投機的実行エンジンに履行させることにより、境界外アクセスを阻止する。別の例として、VSPアプライアンス230は、間接ジャンプコールに代えて直接コール命令を実装し得る。これにより、投機的実行サイクル中の間接ジャンプコール命令の宛先として特定の宛先を選択することが可能になるように分岐予測器を攻撃者が誤訓練する、分岐先インジェクションが阻止される。また、VSPアプライアンス230は、投機的実行に用いられる分岐予測器と並行して正確な分岐予測を算出するスレッドを実行し、当該正確な分岐予測を用いて当該分岐予測器を、分岐先インジェクションエクスプロイトを受けないように再訓練し得る。
【0166】
攻撃者は、悪意あるプロセスを実行し、ウェブアプリケーションインフラストラクチャ204のアプリケーションに割り当てられたプロセスメモリのフラッシュ動作を連続的に実施することで、投機的実行により生じる脆弱性をエクスプロイトし得る。
図2BのVSPアプライアンス230は、ウェブアプリケーションインフラストラクチャ204におけるこのような悪意あるプロセスの有無を監視する。これを行うために、VSPアプライアンス230(例えば、AppSensorコンポーネント等)は、プロセスの実行開始時にプロセスファイルをスキャンし得る。VSPアプライアンス230は、各プロセスファイル(例えば、Microsoftアプリケーションファイル等)のチェックサムを計算し、当該チェックサムを、プロセスファイルの有効なチェックサムを格納したシグネチャデータベースと照合する。チェックサムが一致しない場合、VSPアプライアンス230は、プロセスを終了させたり、プロセスを隔離領域に移動させたり、プロセスファイルの正当なコピーを復元したり、プロセスファイルを修正するための少なくとも1つのパッチをロードしたり、プロセスが悪意あるものであることをユーザに報告したりし得る。
【0167】
また、スキャン中に、VSPアプライアンス230は、プロセスがメモリのフラッシュ動作のシグネチャを含んでいるか否かを特定する。このようなシグネチャを当該プロセスが含んでいることが特定されると、当該プロセスの実行中にVSPアプライアンス230の前記関数又は命令が実行されて、当該プロセスが前記シグネチャを定められたパターン(例えば、フラッシュ動作が特定の頻度又はスピードで行われること、特定の変数のキャッシュラインが他のキャッシュラインよりも高速で読み出されること等)に従って実行しているか否かを検出するよう当該プロセスのリアルタイムかつ決定論的な監視が行われる。前記定められたパターンは、VSPアプライアンス230の管理サーバ240のユーザインターフェース242を介してアドミニストレータにより設定されるAppMap231データベースなどから取り出され得る。また、プロセスの実行中に、VSPアプライアンス230は、当該プロセスをリアルタイムで監視し当該プロセスが特権レベル命令でシステムレジスタ/カーネルレジスタ(例えば、Ring0内のCR0、CR1、CR2、CR3等)を使用しているか否かを判定する。
【0168】
プロセスが前記定められたパターンを満たしているか又は特権レベル命令がシステムレジスタ/カーネルレジスタで使用されている場合には、当該プロセスが投機的実行の脆弱性をエクスプロイトしようとしている悪意あるプロセスであるとVSPアプライアンス230が判断し、前記ウェブアプリケーションインフラストラクチャの保護を実施する。他の実施形態において、当該保護措置は、プロセスを終了させることや、プロセスを隔離領域に移動させることや、プロセスファイルの正当なコピーを復元することや、プロセスファイルを修正するための少なくとも1つのパッチをロードすることや、プロセスが悪意あるものであることをユーザに報告することを含み得る。
【0169】
(悪意ある投機的実行に対する防御の方法)
【0170】
図3Aに、コンピュータアプリケーションのSpectre脆弱性/Meltdown脆弱性/Foreshadow脆弱性を仮想修正する例的な方法300を示す。例的な実施形態では、
図2A及び
図2Bの解析執行エンジン(VSPアプライアンス)230が方法300を実行する。
【0171】
投機的実行エンジンによるコンピュータアプリケーションの実行前に、方法300は、コンピュータアプリケーションのうち、投機的エンジンが順序外で実行する命令列を特定する(305)。一部の実施形態では、投機的実行エンジンがコンピュータアプリケーションのプロセスメモリまたは命令/コードキャッシュから中央演算処理装置(CPU)に向けてアプリケーションコードを実行のためにディスパッチする際に、方法300が、当該コードを(例えば、バイナリ解析エンジンを用いる等して)動的に解析することにより前記命令列を特定し得る。方法300は、
図2A又は
図2Bを参照しながら説明した動的解析を用い得る。他の実施形態において、方法300は、アプリケーションの実行前に、当該アプリケーションのプロセスファイルをスキャンするなどして前記命令列を突き止め特定するものとされてもよい。
【0172】
前記投機的実行エンジンは、コンピュータアプリケーションのコードを実行するのに投機的実行を用いるマイクロプロセッサ(IntelやAMDやARMによる一部のプロセッサを含む)であり得る。前記投機的実行エンジンは、
図2Aと同様のアーキテクチャで構成されたものであり得る。順序外実行により、Spectre脆弱性や、Meltdown脆弱性や、Foreshadow脆弱性や、悪意ある攻撃者がセキュアなデータにアクセスするのにエクスプロイトし得るその他の脆弱性が生じ得る。一部の実施形態において、方法300は、前記命令列が前記投機的実行エンジンにより順序外で実行される命令列であることを、このような命令列を規定したデータベース又はその他のメモリを参照することによって判断し得る。一部の実施形態において、方法300は、前記投機的実行エンジンの実行パターンの機械学習により、前記命令列を判断し得る。例的な実施形態において、前記命令列は、アセンブリコードリピート命令:REP、REPNZまたはREPZを有するリピートストリング処理を含むものである。当該リピートストリング処理は、「if-then-else」コードブロックを有し得る。また、前記方法は、コンピュータアプリケーションの間接分岐命令を特定し得る。
【0173】
方法300は、前記命令列に対する処置であって、前記投機的実行エンジンに命令を順序どおり実行させる処置を決定する(310)。一部の実施形態において、方法300は、前記投機的実行エンジンが命令キャッシュから中央演算処理装置(CPU)に向けてコードを実行のためにディスパッチする際に、前記処置を決定し得る。他の実施形態において、方法300は、アプリケーションの実行前に、当該アプリケーションのプロセスファイルをスキャンするなどして前記処置を突き止めて特定し得る。一部の実施形態において、方法300は、順序外で実行されるその特定された命令列を当該特定された命令列に対する適切な処置へとマップするデータベース又はその他のメモリを参照することにより、前記処置を決定し得る。一部の実施形態において、方法300は、前記投機的実行エンジンの実行パターンの機械学習により、命令列に対する前記処置を決定し得る。一部の実施形態において、前記処置は、前記命令列にメモリバリア命令を追加することを含み得て、当該メモリバリア命令は、前記投機的実行エンジンに、当該メモリバリア命令の前後に発行されるメモリ処理を順序どおり実行する制約を履行させる。このようなメモリバリア命令は、アセンブリコード命令:LFENCE、MFENCE、SSBBまたはCSDBを有し得る。
【0174】
前記投機的実行エンジンによるコンピュータアプリケーションの実行中に、方法300は、前記処置に基づいて前記命令列を変更する(例えば、仮想パッチを適用する)(315)。方法300は、ステップ320にて、前記脆弱性のエクスプロイトによる前記コンピュータアプリケーションへの攻撃を阻止するために、元々特定された命令列の代わりに、変更された命令列を実行する。一部の実施形態において、方法300(ステップ315,320)は、前記投機的実行エンジンが命令キャッシュから中央演算処理装置(CPU)に向けてコードを実行のためにディスパッチする際に、前記命令列を変更し得る。例えば、方法300は、バイナリ計装エンジンを用いて前記命令列を、CPUによる実行前に動的に変更し得る。方法300は、
図2A又は
図2Bを参照しながら説明した、命令の動的実装を用い得る。前記方法は、コンピュータアプリケーションへの攻撃を阻止するために、変更された前記命令列を実行する(320)。
【0175】
また、同様に、方法300は、コンピュータアプリケーションの実行中に、特定された間接分岐命令を直接分岐命令に変更し得る。方法300は、前記コンピュータアプリケーションへの攻撃を阻止するために、特定された間接分岐命令の代わりに、前記直接分岐命令を実行し得る。また、前記方法は、前記投機的実行エンジンの分岐予測器を再訓練することにより、間接分岐命令を用いた分岐先インジェクションを阻止し得る。
【0176】
図3Bに、本開示の一部の実施形態における、Spectre/Meltdown/Foreshadowのエクスプロイトを検出し阻止する例的な方法を示す。例的な実施形態では、
図2AのVSPアプライアンスまたは
図2Bの解析執行エンジン230が方法350を実行する。
【0177】
方法350は、プロセスの実行開始時に、当該プロセスの実行を一時保留する(355)。次に、方法350は、一時保留されたプロセスが投機的実行攻撃の特徴を示すシグネチャを含んでいるか否かを判定する(360)。例えば、攻撃者は、コンピュータアプリケーションのコードの実行に用いられるプロセスメモリ(例えば、データキャッシュ等)の連続的なフラッシュ動作を実施する悪意あるプロセスを実行することにより、投機的実行の脆弱性(例えば、Spectre、Meltdown、Foreshadow等)をエクスプロイトし得る。方法350は、プロセスファイルをスキャンし、一時保留されたプロセスがメモリのフラッシュ動作のそのようなシグネチャを含んでいると判断し得る。メモリのフラッシュ動作の前記シグネチャは、CLFLUSHアセンブリ命令や、MCRアセンブリ命令や、RDTSCアセンブリ命令を含み得る。そして、前記方法は、一時保留されたプロセスの実行を続行する(365)。プロセスが前記シグネチャを含んでいるとの判断に基づき、方法350は、当該プロセスを、投機的実行の脆弱性をエクスプロイトする挙動特徴を有しているか否か実行中に検査すべきプロセスであると特定する。
【0178】
実行中に、方法350は、プロセスが前記シグネチャを定められたパターンに従って実行しているか否かを検査する(370)。例えば、方法350は、プロセスがCLFLUSHアセンブリ命令やMCRアセンブリ命令やRDTSCアセンブリ命令を呼び出し、実行中のアプリケーションに関連付けられたメモリ(例えば、データキャッシュ等)のフラッシュ動作を、投機的実行の脆弱性のエクスプロイトを示唆するような頻度、スピード、順番などで行っているか否かを検査し得る。一部の実施形態において、方法350は、このようなエクスプロイトの特徴を示すフラッシュ動作パターンを記憶したデータベース又はその他のメモリを参照することにより、前記定められたパターンを決定し得る。一部の実施形態において、方法300は、投機的実行の脆弱性をエクスプロイトする悪意あるプロセスの実行パターンの機械学習により、前記定められたパターンを決定し得る。一部の実施形態において、方法350は、プロセスの実行中に、当該プロセスが前記シグネチャを前記定められたパターンに従って実行しているか否かを検査するように当該プロセスを動的に解析する。方法350は、
図2A又は
図2Bを参照しながら説明した動的解析を用い得る。方法350は、実行が前記定められたパターンを満たした場合に前記プロセスを終了する(375)。
【0179】
(例的な保護シナリオ)
【0180】
図4Aに、攻撃者が投機的実行により生じる脆弱性(Spectre 1型-境界チェックバイパス)をエクスプロイトする際の例的なシナリオ400を示す。
図4Aでは、アプリケーションが、アプリケーションのファイル103と当該アプリケーションに割り当てられたプロセスメモリ406とを含むプラットフォーム上で実行される。当該プラットフォームは、さらに、投機的実行エンジンを含む。当該投機的実行エンジンは、コードキャッシュ261、データキャッシュ295、命令パイプライン112、およびプロセッサ(CPU)414を有する。
図4Aの例的なシナリオ400では、アプリケーションプロセスが、そのファイル103から実行されてプロセスメモリ406にロードされる。このアプリケーションプロセスは、「if-then」コードブロック418の命令を含む。このアプリケーションが前記投機的実行エンジンにより実行されると、「if-then」コードブロック418の命令がプロセスメモリ406から前記投機的実行エンジンのコードキャッシュ261に移動させられる。そして、前記投機的実行エンジンが、コードキャッシュ261からの各命令を、命令パイプライン112およびプロセッサ414へと実行のためにフェッチする。
【0181】
前記投機的実行エンジンは、後続の命令が先行する命令よりも先に順序外で実行されるように、命令パイプライン112内の命令の実行の順序を並び替える。例えば、「if-then」コードブロック118の「then」命令(“y=read[x]”)が、当該コードブロック118の「if」命令(“if(x<array_len)”)よりも先に実行され得る。
図4Aにおいて前記投機的実行エンジンが前記先行する命令(例えば、“if(x<array_len)”等)の順番を変える理由は、当該先行する命令の実行に必要なデータが、前記投機的実行エンジンのメインメモリからデータキャッシュ295へと未だ供給されていないからである。例えば、“array_len”の値がデータキャッシュ295に未だ存在していないのである。先行する命令(例えば、“if(x<array_len)”等)は、当該先行する命令を実行するためのそのデータ(例えば、“array_len”の値等)が前記データキャッシュに供給されるまで、リオーダバッファ内に配置される。
【0182】
攻撃者416は、前記先行する命令(例えば、“if(x<array_len)”等)の実行を阻止し続けるために、キャッシュフラッシュ命令(CLFLUSHやMCR)や精密時間計測命令(RDTSC)を用いるなどしてデータキャッシュからデータを繰返しクリアする。クリア動作が繰り返されることで、データ(例えば、“array_len”等)が引き続き不在のままなので、前記先行する命令は前記リオーダバッファ内で待ち続ける。この間に、攻撃者216は、コードブロック418の後続の命令の変数(例えば、“x”等)を特定して操作することにより、アプリケーションメモリのマッピング(例えば、“x”のどの値が“y”のどの値にマップしているか等)を不正に可視化させることが可能となる。この不正な可視化により、攻撃者216は、アプリケーションが処理するプライベートなデータ(例えば、クレジットカード番号)にアクセスすることが可能となる。
【0183】
図4Bに、本開示の一部の実施形態における、攻撃者が投機的実行により生じる脆弱性をエクスプロイトしないよう阻止する例的なシナリオを示す。
図4Bにおいて、本発明の実施形態のセキュリティプラットフォーム130は、投機的実行エンジンにより順序が並び替えられるであろうコードブロック(例えば、コードブロック418等)の命令がプロセスメモリ406又はコードキャッシュ261から命令パイプライン112に向けてプロセッサ414へとディスパッチされる際に当該コードブロックを検出する命令を、当該プラットフォームに実装する。アプリケーションコードがプロセスメモリ406又はコードキャッシュ261からフェッチされて命令パイプライン112へと送信される際に、セキュリティプラットフォーム130は、その実装された命令を用いて、命令の実行の順序の並び替えを阻止する適切な命令を、そのコードブロック内に挿入する。例えば、「if-then」コードブロック418の場合、セキュリティプラットフォーム130は、メモリバリア命令(例えば、フェンス命令等)を命令列へと挿入する。当該メモリバリア命令は、前記投機的実行エンジンに、当該メモリバリア命令の前後に発行されるメモリ処理を順序どおり実行する制約を履行させる。追加されるこのようなメモリバリア命令の例には、アセンブリ命令:LFENCE、MFENCE、SSBB、CSDBなどが含まれる。
【0184】
前記投機的実行エンジンは、この命令が挿入されると、命令パイプライン112内で命令の実行の順序を並び替えることができなくなる。そのため、前記投機的実行エンジンは、後続の命令の前にある先行する命令が実行されるまで、当該後続の命令の実行を待機させなければならない。よって、先行する命令(例えば、“if(x<array_len)”等)の実行に必要なデータが前記投機的実行エンジンのメインメモリからデータキャッシュ295へと未だ供給されていないのであれば、このデータが供給されるまで、後続の命令は前記パイプライン内に待機したままとなる。例えば、“array_len”の値がデータキャッシュ295に未だ存在していないのである。したがって、この変数を含む命令(例えば、“if(x<array_len)”等)が命令パイプライン112内で実行を待つことになるだけでなく、コードブロックにおいて当該命令よりも後になる残りの命令(例えば、(“y=read[x]”)等)も、当該命令以降での実行を命令パイプライン112内で待つことになる。
【0185】
攻撃者416がキャッシュフラッシュ命令(CLFLUSH)や精密時間計測命令(RDTSC)を用いるなどしてデータキャッシュからデータを繰返しクリアしたとしても、コードブロックの命令が順序外で実行されることはない。よって、攻撃者416は、コードブロック418の後続の命令の変数(例えば、“x”等)を特定して操作しアプリケーションメモリのマッピング(例えば、“x”のどの値が“y”のどの値にマップしているか等)を不正に可視化させるための脆弱性をエクスプロイトする機会を失う。
【0186】
また、セキュリティプラットフォーム130は、キャッシュフラッシュ命令(CLFLUSH)や精密時間計測命令(RDTSC)を含んでいると判断されたプロセスの挙動を検査するための命令を実装し得る。セキュリティプラットフォーム130は、このようなプロセスを、当該プロセスの開始時に当該プロセスのファイルをスキャンすることによって判定し得る。アプリケーションの実行中に、このようなプロセスがデータキャッシュ295を定められたパターン(例えば、頻度、スピード等)に従ってフラッシュした場合には、セキュリティプラットフォーム130が、当該プロセスを攻撃者416の悪意あるプロセスであるとして特定し当該プロセスを終了し得る。
【0187】
図5に、本開示の実施形態が実現され得るコンピュータネットワーク又は同様のデジタル処理環境を示す。
【0188】
少なくとも1つのクライアントコンピュータ/装置50および少なくとも1つのサーバコンピュータ60は、アプリケーションプログラムなどを実行する処理装置、記憶装置および入出力装置を提供する。少なくとも1つのクライアントコンピュータ/装置50は、さらに、他のコンピューティングデバイス(他のクライアント装置/プロセス50および1つ以上のサーバコンピュータ60を含む)へと通信ネットワーク70を介して接続され得る。通信ネットワーク70は、リモートアクセスネットワーク、グローバルネットワーク(例えば、インターネット等)、世界中のコンピュータの集まり、ローカルアエリア又はワイドエリアネットワーク、および現在それぞれのプロトコル(TCP/IP、Bluetooth(登録商標)など)を用いて互いに通信するゲートウェイの一部であり得る。それ以外の電子デバイス/コンピュータネットワークアーキテクチャも好適である。
【0189】
クライアントコンピュータ/装置50は、VSPアプライアンスのうちの、セキュリティ監視エージェントとして構成され得る。サーバコンピュータ60は、VSPアプライアンスのうちの、クライアント装置(すなわち、セキュリティ監視エージェント)50と通信してデータベースインジェクション攻撃を検出する解析エンジンやAppSensorとして構成され得る。サーバコンピュータ60同士は、別々のサーバコンピュータではなくクラウドネットワーク70の一部とされてもよい。一部の実施形態において、前記サーバコンピュータは、コンピュータ命令のセットを解析したり、適用すべき1つ以上の処置(パッチ)を特定したり、1つ以上のパッチをコンピュータ命令に適用したりし得る。クライアント(セキュリティ監視エージェント)50は、サーバ(解析エンジン又はAppSensor)60に対してパッチやパッチの要求を通信し得る。一部の実施形態において、クライアント50は、要求やクエリを取得したりパッチが必要な投機的実行の脆弱性を検出したりパッチを提供したりする、当該クライアント(例えば、セキュリティ監視エージェント等)50上で実行されるクライアントアプリケーション又はコンポーネントを含み得る。クライアント50は、このような情報をサーバ(例えば、解析エンジン等)60に通信し得る。
【0190】
図6は、
図5のコンピュータシステムにおけるコンピュータ(例えば、クライアントプロセッサ/装置50、サーバコンピュータ60等)の例的な内部構造の図である。それぞれのコンピュータ50,60は、コンピュータ又は処理システムの構成要素間でのデータ伝送に利用される一連のハードウェアラインであるシステムバス79を備える。システムバス79は、本質的に、コンピュータシステムの相異なる構成要素(例えば、プロセッサ、ディスクストレージ、メモリ、入出力ポート、ネットワークポート等)同士を接続して当該構成要素間での情報の伝送を可能にする共有の導管である。システムバス79には、様々な入出力装置(例えば、キーボード、マウス、ディスプレイ、プリンタ、スピーカ等)をコンピュータ50,60に接続するための入出力装置インターフェース82が取り付けられている。ネットワークインターフェース86は、コンピュータが、ネットワーク(例えば、
図5のネットワーク70等)に取り付けられた様々な他の装置へと接続することを可能にする。メモリ90は、本開示の一実施形態を実現する(例えば、投機的実行による脆弱性を有するアプリケーションコードに対して処置やパッチを適用等する)のに用いられるコンピュータソフトウェア命令92およびデータ94を記憶する揮発性の記憶部である。ディスクストレージ95は、本開示の一実施形態を実現するのに用いられるコンピュータソフトウェア命令92およびデータ94を記憶する不揮発性の記憶部である。システムバス79には、さらに、コンピュータ命令を実行する中央演算処理装置84が取り付けられている。
【0191】
本発明の実施形態または態様は、ハードウェア回路を含む(但し、これに限定されない)ハードウェアの形態でも、ファームウェアの形態でも、ソフトウェアの形態でも実現されてよい。ソフトウェアで実現された場合、当該ソフトウェアは、プロセッサに当該ソフトウェア又は当該ソフトウェアの命令の一部をロードさせることが可能であるように構成された任意の非過渡的なコンピュータ読取り可能媒体に記憶されたものとされ得る。そして、プロセッサがこれらの命令を実行することにより、本明細書で説明した様式で装置が動作することになるか又は装置をそのように動作させる構成となっている。
【0192】
また、本明細書では、ハードウェア、ファームウェア、ソフトウェア、ルーチンまたは命令が、データプロセッサの特定の動作および/または機能を実行するかの如く説明しているかもしれない。しかしながら、本明細書に含まれるこのような説明はあくまでも便宜上のものに過ぎず、実際には、コンピューティングデバイス、プロセッサ、コントローラまたはその他の装置が当該ファームウェア、ソフトウェア、ルーチン、命令などを実行することによってそのような動作が生じるという点を理解されたい。
【0193】
フロー図、ブロック図およびネットワーク図は、構成要素の数が増えても減ってもよいし、配置が異なってもよいし、表現が異なってもよいと理解されたい。ただし、実施の方法によってはブロック図やネットワーク図が決まっており、実施形態の実施を示すブロック図やネットワーク図の数も特定の数になり得るという点も理解されたい。
【0194】
つまり、様々なコンピュータアーキテクチャ及び/又は物理コンピュータ及び/又は仮想コンピュータ及び/又はクラウドコンピュータ及び/又はこれらの所与の組合せにより、さらなる実施形態が実現し得る。したがって、本明細書で説明したデータプロセッサは、あくまでも例示目的に意図されたものあり、実施形態を限定するものではない。
【0195】
例的な実施形態について具体的に図示説明したが、当業者であれば、添付の特許請求の範囲に包含された実施形態の範囲を逸脱しない範疇で形態や細部に様々な変更が施されてもよいことが分かるであろう。
なお、本発明は、態様として以下の内容を含む。
〔態様1〕
(i)投機的実行エンジンによるコンピュータアプリケーションの実行前に、
前記コンピュータアプリケーションのうち、前記投機的実行エンジンが順序外で命令を実行する命令列を特定する過程と、
前記命令列に対する処置であって、前記投機的実行エンジンに前記命令を順序どおり実行させる処置を決定する過程と、
(ii)前記投機的実行エンジンによる前記コンピュータアプリケーションの実行中に、
前記処置に基づいて前記命令列を変更する過程と、
前記コンピュータアプリケーションへの攻撃を阻止するために、特定された前記命令列の代わりに、変更された前記命令列を実行する過程と、
を備える、コンピュータに実装される方法。
〔態様2〕
態様1に記載の方法において、前記命令列が、リピートストリング処理を含む、方法。
〔態様3〕
態様2に記載の方法において、前記リピートストリング処理が、アセンブリコードリピート命令:REP、REPNZまたはREPZを有する、方法。
〔態様4〕
態様2に記載の方法において、前記リピートストリング処理が、if-then-elseコードブロックを有する、方法。
〔態様5〕
態様1に記載の方法において、前記処置が、特定された前記命令列にメモリバリア命令を追加することを含み、当該メモリバリア命令は、前記投機的実行エンジンに、当該メモリバリア命令のアセンブリコードの前後に発行されるメモリ処理を順序どおり実行する制約を履行させる、方法。
〔態様6〕
態様5に記載の方法において、前記メモリバリア命令が、アセンブリコード命令:LFENCE、MFENCE、SSBBまたはCSDBである、方法。
〔態様7〕
態様5に記載の方法において、さらに、
追加されたメモリバリア命令へのジャンプを、攻撃の可能性があるとしてユーザに報告する過程、
を備える、方法。
〔態様8〕
態様1に記載の方法において、さらに、
(i)前記投機的実行エンジンによる前記コンピュータアプリケーションの実行前に、
間接分岐命令のエクスプロイトを可能にする不正確な分岐予測を算出するように誤訓練された、前記投機的実行エンジンの分岐予測器を検出する過程と、
誤訓練された前記分岐予測器の検出に基づいて、前記コンピュータアプリケーションの間接分岐命令を特定する過程と、
(ii)前記投機的実行エンジンによる前記コンピュータアプリケーションの実行中に、
特定された前記間接分岐命令を直接分岐命令に変更する過程と、
前記コンピュータアプリケーションへの攻撃を阻止するために、特定された前記間接分岐命令の代わりに、前記直接分岐命令を実行する過程と、
を備える、方法。
〔態様9〕
態様8に記載の方法において、さらに、
誤訓練された前記分岐予測器と並行して、正確な分岐予測を算出する過程と、
算出された前記正確な分岐予測を用いて、誤訓練された前記分岐予測器を再訓練する過程と、
を備える、方法。
〔態様10〕
コンピュータメモリに接続されたプロセッサを備える、コンピュータシステムであって、
前記プロセッサは、
(i)投機的実行エンジンによるコンピュータアプリケーションの実行前に、
前記コンピュータアプリケーションのうち、前記投機的実行エンジンが順序外で命令を実行する命令列を特定し、
前記命令列に対する処置であって、前記投機的実行エンジンに前記命令を順序どおり実行させる処置を決定し、
(ii)前記投機的実行エンジンによる前記コンピュータアプリケーションの実行中に、
前記処置に基づいて前記命令列を変更し、
前記コンピュータアプリケーションへの攻撃を阻止するために、特定された前記命令列の代わりに、変更された前記命令列を実行する、
ように構成されている、システム。
〔態様11〕
態様10に記載のシステムにおいて、前記命令列が、リピートストリング処理を含む、システム。
〔態様12〕
態様11に記載のシステムにおいて、前記リピートストリング処理が、アセンブリコードリピート命令:REP、REPNZまたはREPZを有する、システム。
〔態様13〕
態様11に記載のシステムにおいて、前記リピートストリング処理が、if-then-elseコードブロックを有する、システム。
〔態様14〕
態様10に記載のシステムにおいて、前記処置が、特定された前記命令列にメモリバリア命令を追加することを含み、当該メモリバリア命令は、前記投機的実行エンジンに、当該メモリバリア命令のアセンブリコードの前後に発行されるメモリ処理を順序どおり実行する制約を履行させる、システム。
〔態様15〕
態様14に記載のシステムにおいて、前記メモリバリア命令が、アセンブリコード命令:LFENCE、MFENCE、SSBBまたはCSDBである、システム。
〔態様16〕
態様14に記載のシステムにおいて、前記プロセッサは、さらに、追加されたメモリバリア命令へのジャンプを、攻撃の可能性があるとしてユーザに報告するように構成されている、システム。
〔態様17〕
態様10に記載のシステムにおいて、前記プロセッサは、さらに、
(i)前記投機的実行エンジンによる前記コンピュータアプリケーションの実行前に、
間接分岐命令のエクスプロイトを可能にする不正確な分岐予測を算出するように誤訓練された、前記投機的実行エンジンの分岐予測器を検出し、
誤訓練された前記分岐予測器の検出に基づいて、前記コンピュータアプリケーションの間接分岐命令を特定し、
(ii)前記投機的実行エンジンによる前記コンピュータアプリケーションの実行中に、
特定された前記間接分岐命令を直接分岐命令に変更し、
前記コンピュータアプリケーションへの攻撃を阻止するために、特定された前記間接分岐命令の代わりに、前記直接分岐命令を実行する、
ように構成されている、システム。
〔態様18〕
態様17に記載のシステムにおいて、前記プロセッサは、さらに、
誤訓練された前記分岐予測器と並行して、正確な分岐予測を算出し、
算出された前記正確な分岐予測を用いて、誤訓練された前記分岐予測器を再訓練する、
ように構成されている、システム。
〔態様19〕
(i)プロセスの実行開始時に、
前記プロセスの実行を一時保留する過程と、
一時保留された前記プロセスがメモリのフラッシュ動作のシグネチャを含んでいるか否かを判定する過程と、
一時保留された前記プロセスの実行を続行する過程と、
(ii)前記プロセスがメモリのフラッシュ動作の前記シグネチャを含んでいる場合、前記実行中に、
前記プロセスがメモリのフラッシュ動作の前記シグネチャを定められたパターンに従って実行しているか否かを動的に検査する過程と、
前記実行が前記定められたパターンを満たした場合、前記プロセスの保護措置を実施する過程と、
を備える、コンピュータに実装される方法。
〔態様20〕
態様19に記載の方法において、メモリのフラッシュ動作の前記シグネチャが、CLFLUSH、RDTSCおよびMCRアセンブリ命令のうちの少なくとも1つのパターンを含む、方法。
〔態様21〕
態様19に記載の方法において、前記定められたパターンが、前記メモリの前記フラッシュ動作の頻度及びスピードの尺度を含む、方法。
〔態様22〕
態様19に記載の方法において、前記定められたパターンは、前記プロセスが前記CLFLUSHまたはMCR命令を実行する回数の閾値である、方法。
〔態様23〕
態様19に記載の方法において、さらに、
前記投機的実行エンジンのキャッシュにおける所与の変数のキャッシュラインが他のキャッシュラインよりも高速で繰返し前記プロセスにより読み出された場合に、前記プロセスを終了する過程、
を備える、方法。
〔態様24〕
態様19に記載の方法において、さらに、
前記プロセスが特権レベル命令をシステムレジスタで実行することを試みた場合に、前記プロセスを終了する過程、
を備える、方法。
〔態様25〕
態様19に記載の方法において、前記保護措置が、前記プロセスの終了、隔離領域への前記プロセスの移動、プロセスファイルを修正するための少なくとも1つのパッチのロード、および前記プロセスが悪意あるものであることのユーザへの報告のうちの少なくとも1つである、方法。
〔態様26〕
コンピュータメモリに接続されたプロセッサを備える、コンピュータシステムであって、
前記プロセッサは、
(i)プロセスの実行開始時に、
前記プロセスの実行を一時保留し、
一時保留された前記プロセスがメモリのフラッシュ動作のシグネチャを含んでいるか否かを判定し、
一時保留された前記プロセスの実行を続行し、
(ii)前記プロセスがメモリのフラッシュ動作の前記シグネチャを含んでいる場合、前記実行中に、
前記プロセスがメモリのフラッシュ動作の前記シグネチャを定められたパターンに従って実行しているか否かを動的に検査し、
前記実行が前記定められたパターンを満たした場合、前記プロセスの保護措置を実施する、
ように構成されている、システム。
〔態様27〕
態様26に記載のシステムにおいて、メモリのフラッシュ動作の前記シグネチャが、CLFLUSH、RDTSCおよびMCRアセンブリ命令のうちの少なくとも1つのパターンを含む、システム。
〔態様28〕
態様26に記載のシステムにおいて、前記定められたパターンが、前記メモリの前記フラッシュ動作の頻度及びスピードの尺度を含む、システム。
〔態様29〕
態様26に記載のシステムにおいて、前記定められたパターンは、前記プロセスが前記CLFLUSHまたはMCR命令を実行する回数の閾値である、システム。
〔態様30〕
態様26に記載のシステムにおいて、前記プロセッサは、さらに、前記投機的実行エンジンのキャッシュにおける所与の変数のキャッシュラインが他のキャッシュラインよりも高速で繰返し前記プロセスにより読み出された場合に、前記プロセスを終了するように構成されている、システム。
〔態様31〕
態様26に記載のシステムにおいて、前記プロセッサは、さらに、前記プロセスが特権レベル命令をシステムレジスタで実行することを試みた場合に、前記プロセスを終了するように構成されている、システム。
〔態様32〕
態様26に記載のシステムにおいて、前記保護措置が、前記プロセスの終了、隔離領域への前記プロセスの移動、プロセスファイルを修正するための少なくとも1つのパッチのロード、および前記プロセスが悪意あるものであることのユーザへの報告のうちの少なくとも1つである、システム。