メルトダウンに基づく新しい攻撃手法。 投機的命令を使用して仮想化を検出する

メルトダウン攻撃は、アーキテクチャの状態を使用して情報を送信するプロセッサに対する新しい種類の攻撃を開始しました。 しかし、最初にMeltdownを攻撃するために使用された投機的実行により、制限を削除してコードを実行できるだけでなく、プロセッサの特定の詳細を見つけることもできます。 アーキテクチャの状態を使用して攻撃を実装する新しい方法を発見しました。 投機的実行命令を送信するかどうかをプロセッサが選択する方法に基づいて、仮想化を検出できます。 この方法をIntelに報告し、2018年5月21日に脆弱性アラート「2018年Q2投機的実行サイドチャネルアップデート」が発行されました。この脆弱性には、脆弱性CVE-2018-3640またはSpectre Variant 3aが存在します。



1.はじめに



この攻撃は、メルトダウン攻撃に似たキャッシュサイドチャネルに基づいています。 ご存知のように、Meltdownは投機的実行を使用してメモリにアクセスしますが、メモリは特別な権限なしでは使用できません。 問題の攻撃は、キャッシュアクセス時間のしきい値を使用しないという点でMeltdownとは異なります。 これは、プロセッサがコード実行を高速化するために特定の命令を事前に実行するために可能です。 メルトダウンは、投機的実行で悪意を持って制御されたバッファからの読み取り値を利用するため、攻撃者はメモリアクセス時間の測定値をサイドチャネルとして使用できます。



2.仮想化



IntelプロセッサーのVT-xテクノロジーにより、ハイパーバイザーは、rdtscなどの特定の命令の実行時にVMEXIT(ハイパーバイザーへのコンテキスト切り替え)を行うかどうかを選択できます。 標準構成のほとんどの仮想化環境は、デフォルトでrdtscインターセプトを構成します。 これは、たとえば、AppleおよびParallelsのハイパーバイザー上のVirtualbox、VMware、Hyper-V、Parallelsによって実行されます。 VMEXITは実際にはコンテキストの切り替えを意味するため、VMEXITを生成する命令は、仮想化されていない環境で実行された場合よりも実行に時間がかかります。



3.攻撃



いくつかのページのバッファが作成されます。 次に、メモリ領域への投機的アクセスの代わりに、データを取得するために、rdtsc命令が投機的に実行され、その実行結果が以前に割り当てられたバッファの特定の部分にアクセスするために使用されます。 投機的実行では、割り当てられたバッファの特定の部分のみがアクセスされるため、投機的アクセスのケースとランダムエラーを区別できます。 投機的なコード実行を含む関数の完了後、アクセス時間が最も短いメモリのページ番号が統計に追加されます。 次に、キャッシュがバッファ全体にフラッシュされます。 以下は、32ビットバージョンのWindowsで投機的実行とメモリアクセスをトリガーするために使用される関数です。



_declspec(naked) void herring() { //    __asm { //  xorps xmm0, xmm0 //   speculate sqrtpd xmm0, xmm0 sqrtpd xmm0, xmm0 sqrtpd xmm0, xmm0 sqrtpd xmm0, xmm0 sqrtpd xmm0, xmm0 sqrtpd xmm0, xmm0 sqrtpd xmm0, xmm0 sqrtpd xmm0, xmm0 movd eax, xmm0 lea esp, [esp+eax+4] ret } } _declspec(naked) void __fastcall speculate(const char* detector) { __asm { //    rdtsc  mfence. //  ,  mov esi, ecx. // rdtsc  call herring rdtsc. //  and eax, 7. //  or eax, 32. //* shl eax, 12. //* movzx eax, byte ptr [esi+eax] //* } }
      
      





攻撃を正常に実装するには、これらの手順を繰り返してキャッシュページの分布を見つける必要があります。 十分な統計を取得するために必要な回数だけ繰り返しを実行する必要があります。説明したテストでは、10,000回の反復が使用されました。 次に、選択したメモリ領域を超えるミスの数が計算されます。 rdtscインターセプトが有効になっている仮想化環境では、このようなミスの割合は50〜99%です。 非仮想化システムでは、1パーセント未満です。 この情報は次の図に示されています(メモリの領域が暗いほど、より多くのヒットが記録されます)。 テストでは、macOS、Ubuntu、Debian、およびWindowsを非仮想化システムとして使用し、Ubuntu、Debian、およびWindowsをゲストシステムとして使用しました。







さまざまな環境でのキャッシュされたページの配布



4.攻撃の説明



この攻撃は、プロセッサのrdtsc実行情報の開示を強制する命令の投機的実行を使用します。 非仮想化環境では、rdtscはプロセッサ自体で実行され、単純にカウンタを返します。 RDTSC終了ビットがMSR IA32_VMX_PINBASED_CTLSに設定されている仮想化環境では、rdtscは本質的に時間がかかるコンテキストスイッチです。



脆弱性が発見された時点で、利用可能なIntelプロセッサの内部ドキュメントには、何が起こっているかを正確に説明するデータが含まれていませんでした。 プロセッサには、rdtscの実行時間が長すぎると判断し、実行フローが直接到達するまで実行しないか、VMEXITを呼び出すすべての命令が投機的に実行されないという2つの前提があります。 非仮想化環境では、それに続くrdtsc命令は投機的に実行されますが、これは仮想化環境では発生しません。



5.今後の研究の結論と方向



説明した攻撃では、メルトダウンに基づいた新しいキャッシュ手法を使用して、特権メモリ領域にアクセスする代わりに、プロセッサの動作モードに関する情報を明らかにするサイドチャネルを作成します。 仮想化を検出するためのすべての既知の方法は、rdtsc命令をタイマーとして使用することに大きく依存しています。これにより、スマートハイパーバイザーは戻り値を置き換えることでこれらの方法をだますことができます。 このような攻撃も制限できますが、コードに小さな変更を加えた場合、ハイパーバイザーの側から時間を置き換えても結果に影響を与えることはできません。 おそらく、このバージョンのPoCを後で公開するでしょう。

説明した攻撃のrdtscインターセプトバリエーションを使用した仮想化環境では、仮想化の存在を判断でき、インターセプトがない場合、TLBキャッシュを使用した作業速度の測定など、既知の方法を使用することができます。



この攻撃により、標準設定の環境またはrdtscインターセプトを意図的に使用して仮想化の検出から保護する環境で、迅速かつ簡単に仮想化を検出できます。 この攻撃は仮想化されたサンドボックスで正常にテストされました。専門家は自分自身を裏切ることなくサンドボックスを発見しました。



PoCコードは次の場所にあります



All Articles