Zen+ および Zen 2 マイクロアーキテクチャに基づく AMD プロセッサでメルトダウン クラスの脆弱性が発見されました

ドレスデン工科大学の研究者グループは、Zen+ および Zen 2020 マイクロアーキテクチャに基づく AMD プロセッサーに、メルトダウン クラスの攻撃を可能にする脆弱性 (CVE-12965-2) を特定しました。 当初、AMD Zen+ および Zen 2 プロセッサはメルトダウン脆弱性の影響を受けないと考えられていましたが、研究者らは、非正規の仮想アドレスを使用すると、保護されたメモリ領域への投機的アクセスにつながる機能を特定しました。

AMD64 アーキテクチャでは、仮想アドレスの最初の 48 ビットのみが使用され、残りの 16 ビットは無視されます。 ビット 48 ~ 63 は常にビット 47 の値をコピーする必要があると指定されています (符号ビット拡張)。 この条件に違反し、上位ビットの任意の値を持つアドレスにアクセスしようとすると、プロセッサは例外を生成します。 上位ビットを繰り返し埋めると、使用可能なアドレス空間が 0 つのブロックに分割されます。上位ビットが 00007 に設定される下位ブロック (800000000000 ~ 1FFFFFFFFFFFFF) と、上位ビット (FFFFXNUMX ~ FFFFFFFFFFFFFFFF) です。上位ビットはすべて XNUMX に設定されます。

指定されたブロック内にあるアドレスは正規と呼ばれ、上位ビットの内容が任意である不正なアドレスは非正規と呼ばれます。 通常、正規アドレスの下位範囲はプロセス データに割り当てられ、上位範囲はカーネル データに使用されます (ユーザー空間からのこれらのアドレスへのアクセスは、特権分離レベルでブロックされます)。

古典的なメルトダウンの脆弱性は、設定された権限によりユーザーのプロセスからのアクセスが禁止されているため、命令の投機的実行中にプロセッサがプライベート データ領域にアクセスし、結果を破棄できるという事実に基づいています。 プログラムでは、投機的に実行されるブロックは条件付き分岐によってメイン コードから分離されており、実際の条件では常に分岐が起動しますが、条件付きステートメントでは、プロセッサがプリエンプティブ実行中に認識していない計算値が使用されるため、コードでは、すべての分岐オプションは投機的に実行されます。

投機的に実行される操作は、通常に実行される命令と同じキャッシュを使用するため、投機的実行中に、プライベート メモリ領域の個々のビットの内容を反映するマーカーをキャッシュに設定し、その後、通常に実行されるコードでタイミングを通じてその値を決定することができます。キャッシュされたデータとキャッシュされていないデータへの分析アクセス。

AMD Zen+ および Zen 2 プロセッサに影響を与えるこの新しい脆弱性の特徴は、CPU が上位 16 ビットを単純に無視して、無効な非正規アドレスを使用してメモリにアクセスする投機的な読み取りおよび書き込み操作を許可することです。 したがって、投機的コードの実行中、プロセッサは常に下位 48 ビットのみを使用し、アドレスの有効性は個別にチェックされます。 非正規仮想アドレスを連想変換バッファ (TLB) 内の物理アドレスに変換するときに、アドレスの正規部分で一致が検出された場合、投機ロード操作は内容を考慮せずに値を返します。これにより、スレッド間のメモリ共有をバイパスできます。 その後、操作は無効とみなされ破棄されますが、メモリ アクセスは完了し、データはキャッシュに残ります。

実験中、FLUSH+RELOAD キャッシュの内容を決定する手法を使用して、研究者らは 125 秒あたり XNUMX バイトの速度で隠しデータ転送用のチャネルを編成することができました。 この問題は、AMD チップに加えて、古典的なメルトダウン脆弱性の影響を受けるすべての Intel プロセッサにも影響します。 LFENCE 命令の使用など、メルトダウン攻撃のブロックに役立つ同じテクニックを、この新しいタイプの攻撃から保護するために使用できます。 たとえば、Intel プロセッサにメルトダウンに対するハードウェア保護が含まれている場合、またはシステムでソフトウェア保護が有効になっている場合、そのような構成は新しい攻撃亜種の影響を受けません。

同時に研究者らは、Intelプロセッサと比較して、AMDプロセッサのアーキテクチャは実際の攻撃を実行する可能性を制限しているが、効果を高めるために他のマイクロアーキテクチャ攻撃と組み合わせて新しい手法を使用することを排除するものではないと指摘している。 特に、提案されている攻撃では、カーネルやその他のプロセスのメモリ領域の内容を特定することはできませんが、同じ仮想メモリ空​​間で実行されている同じプログラムの他のスレッドにアクセスできるように制限されています。

脆弱性のないプログラムはそのスレッドにアクセスできるため、実用的な観点から見ると、この方法はサンドボックスの分離をバイパスし、サードパーティのプログラムの実行を許可するプログラム内の他のスレッドの作業への干渉を組織する上で興味深いものです。 Web ブラウザや JIT エンジンなどのコード。 研究者らは、SpiderMonkey JavaScript エンジンと Linux カーネルの攻撃に対する脆弱性を調査しましたが、攻撃の実行に使用される可能性のある脆弱なコード シーケンスは見つかりませんでした。 この方法は、アプリケーションの攻撃に加えて、他のマイクロアーキテクチャの脆弱性を悪用しながら、プロセッサのマイクロアーキテクチャ要素間に許容できないデータ フローを強制するためにも使用できます。

出所: オープンネット.ru

コメントを追加します