Retbleed は、Intel および AMD CPU の投機的実行メカニズムに対する新たな攻撃です。

チューリッヒ工科大学の研究者グループは、CPU での間接遷移の投機的実行メカニズムに対する新たな攻撃を特定しました。これにより、カーネル メモリから情報を抽出したり、仮想マシンからホスト システムに対する攻撃を組織したりすることが可能になります。 この脆弱性はコード名 Retbleed (CVE-2022-29900、CVE-2022-29901) であり、本質的に Spectre-v2 攻撃に近いものです。 違いは、スタックからアドレスをロードする「jmp」命令を使用した間接ジャンプではなく、スタックからジャンプするアドレスをフェッチする「ret」(リターン)命令を処理する際の任意のコードの投機的実行の構成にあります。メモリまたは CPU レジスタ。

攻撃者は、不正確な遷移予測の条件を作成し、プログラム実行ロジックによって提供されていないコード ブロックへの標的を絞った投機的な遷移を組織化する可能性があります。 最終的に、プロセッサは分岐予測が正当でなかったと判断し、操作を元の状態にロールバックしますが、投機的実行中に処理されたデータはキャッシュとマイクロアーキテクチャ バッファーに残ります。 誤って実行されたブロックがメモリにアクセスすると、その投機的な実行により、メモリから読み取られたデータが共有キャッシュに置かれます。

投機的操作後にキャッシュに残っているデータを特定するために、攻撃者は、キャッシュされたデータとキャッシュされていないデータへのアクセス時間の変化を分析するなど、サイドチャネル手法を使用して残留データを特定できます。 別の特権レベルの領域 (カーネル メモリなど) から意図的に情報を抽出するには、「ガジェット」が使用されます。これは、カーネル内に存在する一連のコマンドで、影響を受ける外部条件に応じてメモリからデータを投機的に読み取るのに適しています。攻撃者。

条件付きおよび間接ジャンプ命令を使用する古典的な Spectre クラスの攻撃から保護するために、ほとんどのオペレーティング システムは、間接ジャンプ操作を「ret」命令に置き換えることに基づいた「retpoline」テクニックを使用しており、プロセッサはそのために別のスタック状態予測ユニットを使用します。 . 分岐予測ブロックを使用しません。 retpoline が 2018 年に導入されたとき、Spectre のようなアドレス操作は、「ret」命令を使用した投機的分岐には実用的ではないと考えられていました。

Retbleed 攻撃手法を開発した研究者は、「ret」命令を使用して投機的移行を開始するためのマイクロアーキテクチャ条件を作成できる可能性を実証し、Linux カーネルの脆弱性の悪用に適した命令シーケンス (ガジェット) を特定するための既製のツールを公開しました。そのような状態が現れます。

研究中に、Intel CPU を搭載したシステム上で、ユーザー空間の非特権プロセスからカーネル メモリから 219 秒あたり 98 バイトの速度と 3.9% の精度で任意のデータを抽出できる実用的なエクスプロイトが準備されました。 AMD プロセッサでは、エクスプロイトの効率ははるかに高く、リーク レートは 28 秒あたり 6 KB です。 実用的な例として、提案されたエクスプロイトを使用して /etc/shadow ファイルの内容を特定する方法を示します。 Intel CPU を搭載したシステムでは、root ユーザーのパスワード ハッシュを決定する攻撃は XNUMX 分で実行され、AMD CPU を搭載したシステムでは XNUMX 分で実行されました。

この攻撃は、6 年第 8 四半期より前にリリースされた第 3 ~ 2019 世代の Intel プロセッサ (Skylake を含む) と、1 年第 1 四半期より前にリリースされた Zen 2、Zen 2021+、および Zen 3 マイクロアーキテクチャに基づく AMD プロセッサに対して確認されています。 AMD ZenXNUMX や Intel Alder Lake などの新しいプロセッサ モデルや ARM プロセッサでは、この問題は既存の保護メカニズムによってブロックされます。 たとえば、IBRS (間接分岐制限投機) 命令を使用すると、攻撃から保護するのに役立ちます。

Linux カーネルと Xen ハイパーバイザー用に一連の変更が準備されており、古い CPU 上のソフトウェアの問題をブロックします。 Linux カーネル用に提案されたパッチは、68 個のファイルを変更し、1783 行を追加し、387 行を削除します。 残念ながら、この保護は多大なオーバーヘッド コストにつながります。AMD および Intel プロセッサに関して実施されたテキストでは、パフォーマンスの低下は 14% から 39% と推定されています。 新世代の Intel CPU で利用可能であり、Linux カーネル 4.19 以降でサポートされる IBRS 命令に基づく保護を使用することがより望ましいです。

Intel プロセッサでは、投機的間接ジャンプのアドレス置換は、リターン スタック バッファの下限を介してオーバーフロー (アンダーフロー) が発生したときに表示される機能のおかげで実行されます。 このような状況が発生すると、「ret」命令は通常の間接ジャンプに使用されるものと同様のアドレス選択ロジックの適用を開始します。 Linux カーネルには、このような逆流を開始する条件を作成し、システム コールを通じてアクセスできる箇所が XNUMX 個以上発見されています。

AMD プロセッサでは、「ret」命令の投機的実行はスタック固有のバッファ (リターン アドレス スタック) を参照せずに実行され、分岐予測ユニットは「ret」命令を制御リターンではなく間接分岐と見なします。 、したがって、そのデータを間接遷移の予測に使用します。 このような状況では、システム コール経由で到達可能な事実上すべての「ret」操作が悪用される可能性があります。

さらに、AMD CPU では、架空の分岐の実装に関連する別の問題 (CVE-2022-23825、分岐タイプの混乱) も確認されています。必要な分岐命令がなくても分岐予測の条件が発生する可能性があり、分岐予測バッファに影響を与える可能性があります。 「ret」という命令なしで。 この機能により、保護の実装が大幅に複雑になり、分岐予測バッファーのより積極的なクリーニングが必要になります。 カーネルに完全な保護を追加すると、オーバーヘッドが 209% 増加すると予想されます。

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

コメントを追加します