技術的な詳細 脆弱性メルトダウン-CVE-2017-5754

著者から



重要! この脆弱性は実際には3つの脆弱性です-メルトダウン、スペクター1、スペクター2

こんにちは、Habr! 今日、Meltdown脆弱性ノート (CVE-2017-5754)の翻訳があります。 この脆弱性を理解するための最初のページとノートの主要部分のみが翻訳されています。







メルトダウン



全般



最新のコンピューターシステム(著者のメモ。スマートフォン、コンピューター、メーカー以外のコードを実行できるほぼすべてのウェアラブルデバイス)のセキュリティは、アドレス空間の分離に基づいています。たとえば、カーネルメモリはアクセス不可とマークされ、ユーザーによるアクセスから保護されています。 このメモでは、メルトダウンを紹介します。 Meltdownは、最新のプロセッサでの異常実行の副作用を利用して、個人情報やパスワードを含むカーネルからデータを読み取ります。 順不同の実行はパフォーマンスに大きな影響を与え、ほとんどの最新のプロセッサに含まれています。 この攻撃はオペレーティングシステムに依存せず、ソフトウェアの脆弱性を悪用しません。 Meltdownは、準仮想化を含むアドレス空間の分離に基づいて、すべてのシステムセキュリティを破ります。

メルトダウンを使用すると、他のプロセスや仮想マシンのメモリの一部を読み取ることができます。 カイザーシステムには、メルトダウンロックの形で重要な副作用があることを示します(ただし、松葉杖です)。 私たちは、情報漏えいを防ぐために、カイザーを直ちに有効にすることを主張します。







はじめに



アドレス空間の分離に基づく最新のコンピューターシステムのセキュリティ。 オペレーティングシステムは、個々のプロセスの分離を保証します。 最新のプロセッサでは、カーネルプロセスとユーザープロセス間の状態分離は、ハイパーバイザービットによって保証されます。 全体の概念は、このビットがユーザープロセスでリセットされ、カーネルプロセスで設定されるということです。 プロセスの変更は、割り込みとシステムコール(システムコール/ syscall)によって発生します。 現在、メモリのアドレス指定は、システムコールおよび割り込み中に変更されません。 メルトダウンは2010年代のIntelプロセッサーで実行され、他のメーカーのプロセッサーに影響を与える可能性があります(著者のメモ:AMD、VIA)。 Meltdownは、最新のプロセッサの異常な実行の副作用を利用して、個人情報やパスワードを含むカーネルからデータを読み取ります。







プロセッサは、長い遅延とアイドル状態で外部バスからのデータを待つ代わりに、命令の実行を開始し、アイドル状態のカーネルの部分にデータを追加します。 しかし、これらのアクションには副作用があります-命令の実行時間の違いです。







脆弱なプロセッサにより、非特権プロセスが順番にコードを実行し、カーネルメモリから一時レジスタにデータをロードできます。 さらに-プロセッサは、このレジスタの値に基づいて計算を実行します。たとえば、レジ​​スタの値に応じてデータの配列からデータをロードします。 プロセッサは、予測結果が正しくない場合、実行結果、たとえば書き込まれたレジスタをリセットすることにより、コードの正しい実行を保証します。 したがって、アーキテクチャレベルで問題は発生しません。 ただし、前述のように、アウトオブキュー実行には副作用があります。アウトオブオーダーエグゼキューターのコードに応じてキャッシュがいっぱいになります。 したがって、攻撃者は、マイクロアーキテクチャ機能を使用して、カーネルのアドレス空間内のすべてのデータを読み取ることができます。







メルトダウンは、クラウド内のサーバーだけでなく、最新のパーソナルコンピューターやラップトップでも動作します。 また、カーネルの分離に基づくサンドボックス-準仮想化とプロセス内のサンドボックス。







KAISER対策は、KASLRを標的とする攻撃を防ぎ、メルトダウン攻撃から不注意に保護します。







抽象例



raise_exception(); access(probe_array[data * 4096])
      
      





2行目は実行されません。

エラーの原因が何であれ、エラーのコンテキストで実行状態を順番に変換します。ほとんどの場合はカーネルです。







コードの2行目はアーキテクチャレベルでは実行さませんでしたが、ワールドアーキテクチャレベルでキャッシュの状態を変更しました。

probe_array配列のページへのアクセス時間







ご覧のように、キャッシュが順番に実行時にアクセスしたメモリの一部をロードしたため、アレイの異なる領域へのアクセス時間は異なります。







したがって、特権モードで命令を実行する実行状態から攻撃者のユーザープロセスにデータを順番に転送できます。

さらに、すでにキャッシュにあるデータへのアクセスは、プロセッサが異常な動作をロールバックする時間よりも短いという事実に基づいて、攻撃者はキャッシュ内のプロセッサのコアメモリ部分の値を読み取ります。 時々、読み取りの試みは失敗します プロセッサーは、データを読み取る前に実行順序外パイプラインをリセットすることに成功し(0.003%)、i7 6700Kで503KB / sの速度でデータを読み取ることができます。







この脆弱性を利用するスレッドはエラーに陥るので、この脆弱性を悪用するには、プロセスが子スレッドのメモリにアクセスする子スレッドを作成できる必要があります。







脆弱性



Linux



2.6.32から4.13.0のカーネルバージョンでこの脆弱性を悪用しました。

KAISERパッチはこの脆弱性を排除します。









この脆弱性をWindows 10で再現しました(バージョンは指定されていません)。







コンテナ



攻撃は、OpenVZ、Docker、LXCなどのコンテナーで実行できます。







AMDおよびARMの制限。



ARMおよびAMDでこの脆弱性を再現することはできませんでしたが、実装が遅すぎる可能性があります。

しかし! 両方のプロセッサでキュー外実行の脆弱性を再現できました

重要! オペレーティングシステム用のパッチはメルトダウンを防ぎますが、スペクターは防ぎません

重要! この脆弱性は他のプロセッサに存在する可能性があります!

短いメモでごめんなさい! もうそんなことはしません:)。








All Articles