L1 Terminal Fault を使用したカーネルのサイドチャネル攻撃: CVE-2018-3620 & CVE-2018-3646

Public Date: August 15, 2018, 11:10
更新 August 15, 2018, 11:10 - Chinese, Simplified 英語 French Korean
Resolved 状態
Important Impact

Insights vulnerability analysis

View exposed systems

Red Hat セキュリティーチームは、Spectre および Meltdown 脆弱性と類似する新しいコンピューターマイクロプロセッサーハードウェア実装 (マイクロアーキテクチャー)の問題を認識しています。これは、Intel によって製造された x86 マイクロプロセッサーに影響すると報告されています。権限を持たない攻撃者がこの不具合を利用すると、従来のメモリーセキュリティー制限を回避して、通常はアクセス不可能なメモリーリソースにアクセスできるようになります。この脆弱性には 3 つのケースがあります。1 つ目は、Intel「SGX」セキュアエンクレーブのみに影響し、オペレーティングシステムと独立したマイクロコードの更新を行うことで軽減されます。その他 2 つのケースは、オペレーティングシステムおよびハイパーバイザーによって実行されるソフトウェアレベルの軽減策が必要です。仮想化を使用する環境で信頼できないゲスト仮想マシンによる潜在的な攻撃を完全に防ぐには、システム管理者による特定の処置が必要になります。

本問題のオペレーティングシステムの脆弱性には CVE-2018-3620 が割り当てられ、仮想化に関する脆弱性には CVE-2018-3646 が割り当てられました。本問題は、業界では L1 Terminal Fault (L1TF) と呼ばれ、セキュリティーの関係者の間では「Foreshadow」と呼ばれています。

L1 Terminal Fault の脆弱性によって、悪意のあるユーザーは、通常はオペレーティングシステムやハイパーバイザーで強制および管理されるメモリーアクセスのセキュリティー制御を回避することができます。攻撃者はこの脆弱性を利用して、プロセッサーの L1 データキャッシュ にキャッシュされる物理メモリーの場所を読み取ることができます。通常、オペレーティングシステムやハイパーバイザーによって管理される「ページテーブル」は、アプリケーション、オペレーティングシステムのカーネル自体、およびゲスト仮想マシンインスタンスがアクセスできるメモリーの場所に関する情報をプロセッサーに提供します。これらのページテーブルは、有効性を示す「現在」のビットが含まれるページテーブルエントリー (PTE) から構成されます。攻撃者は L1TF を利用して、有効な PTE を認識する Intel プロセッサーロジックを悪用できます。

L1 データキャッシュ (通常のサイズは 32KB) は、(プロセッサーにとって) 外部のメインメモリーチップにも保持されるデータのコピーが含まれる、高速オンチッププロセッサーメモリー階層の最初のレベルです。プログラムがメモリーを使用するとキャッシュにデータが保存され、通常は複数のレベルに分割されます。小型で高速な L1 キャッシュは、プログラム内で実際に計算を行うプロセッサーの機能ユニットに最も近く、大型で低速なキャッシュは概念上、遠くに存在します。L1 は、Intel プロセッサーコア内の 2 つのピアハイパースレッドの間で共有されます。各コアには若干大きな L2 キャッシュもあります。L3 (LLC またはラストレベルキャッシュ) は、プロセッサー内のすべてのコアによって共有され、サイズは大きくなります (例: 32MB)。データは、使用されるとメモリーから L3 に移動し、L1 に向かって移動します。

プロセッサーチップ内のキャッシュメモリーへのアクセスは、メインメモリーへのアクセスよりも大幅に高速となるため、パフォーマンスを大きく改善するために使用されます。また、投機的実行またはアウトオブオーダー実行中に行われる操作の副作用としてデータキャッシュにもデータが保存されます。このように、キャッシュとメモリーのパフォーマンスは相対的に異なるため、悪意のあるソフトウェアコードを使用してキャッシュの動作を推測することが可能です。これがサイドチャネル分析と呼ばれ、Meltdown および Spectre の脆弱性によって広く知られるようになりました。L1TF と同様に、これらの脆弱性では「ガジェット」と呼ばれるソフトウェアシーケンスを作成し、脆弱性のあるプロセッサーを悪用して、投機的実行中にキャッシュ動作の観察が可能になります。

L1TF は Meltdown と類似しており、この場合はページテーブルの検索中 (テーブルウォーク) に、脆弱性のあるプロセッサーが投機実行を実装する方法を悪用します。プロセッサーは最も積極的なパフォーマンスを達成するように設計されているため、ページテーブルエントリーは有効で、必要な妥当性チェックを完了する前にメモリーへのアクセスを許可すると推測します。プロセッサーは先制して L1 データキャッシュでページテーブルエントリーのビットと一致する物理アドレスを検索し、一致したものを依存する投機的操作に転送します。しばらくすると、プロセッサーはページテーブルエントリーが無効であることを検出し、内部の「ターミナル違反」を通知します。その後、プロセッサーは以前の投機結果を破棄しますが、キャッシュの観察による影響は残ります。

仮想化ゲストインスタンスの場合、L1TF の脆弱性は「拡張ページテーブル」(EPT) と呼ばれる Intel プロセッサー内部機能の実装によって発生します。このハードウェアパフォーマンス機能では、ハイパーバイザー (KVM など) がページテーブル管理の一部をゲスト仮想マシンに委譲できます。メモリーへのアクセスは、ゲストによる変換と、ホストページテーブルによる変換の 2 つの変換が条件になります。これにより、EPT 以前で必要だったハイパーバイザーの度重なる対応によって発生するオーバーヘッドを削減できます。脆弱性のある実装では、悪意のあるゲストは通常の 2 つの変換を回避する「存在しない」ページテーブルエントリーを作成できるため、L1 データキャッシュにコピーがあれば、ゲストはホストハイパーバイザーまたは他のゲストの物理メモリーを読み取ることができます。

2 つの攻撃パターンからエンドユーザーを保護する必要があります。1 つ目は、物理システム上のデータを読み取るシステム上の悪意のあるユーザーで、2 つ目は、他のゲストまたはホストから情報にアクセスする悪意のあるゲスト OS またはコンテナーです。この脆弱性は CVE-2017-5754 (Meltdown) と類似していますが、仮想メモリーアドレスから物理メモリーアドレスに変換するときに、投機的実行でのメモリー管理ユニット (MMU) と L1 データキャッシュとの間の対話を悪用します。この新しい脆弱性から保護するには、これまでのマイクロアーキテクトの脆弱性 (Meltdown、Variant 3) に対応する既存の軽減策では十分ではありません。

Red Hat は、お客様が利用可能な更新を適用した後に、特定のカーネルパラメーターを手作業で有効にし、Intel のハイパースレッディングなどの機能を無効にするなどの修正措置を取るよう強く推奨します。詳細は、本記事の軽減策を参照してください。

背景情報

近年のオペレーティングシステムは「仮想メモリー」を実装して、複数のタスクやプロセス全体で利用できるメインメモリーを効率的に使用します。物理システムには、物理アドレス空間を形成する固定容量のメインメモリーがあります。このアドレス空間は、ページと呼ばれる小さな (例: 4KB) 管理ユニットに分割されます。オペレーティングシステムは、稼働中のプログラム (プロセス) ごとに 仮想アドレス空間を作成します。各仮想アドレスは、メモリー管理ユニット (MMU) と呼ばれるプロセッサー内のハードウェアの一部を使用して物理アドレスに変換されます。プロセッサーによってプログラムの実行がスケジュールされると、その命令とデータは仮想アドレスにマップされます。プログラムは仮想アドレスを使用してメモリーの場所を参照します。プロセッサーの MMU は ページング と呼ばれる概念を使用して、仮想アドレスとマップされた物理メモリーアドレスの変換を実行します。

ページング は、ページテーブルと呼ばれる階層的なページング構造を使用して各仮想アドレスを物理アドレスに変換します。ページテーブルのコンポーネントへのインデックスとしてアドレスからのビットを使用して仮想アドレスの部分を変換します。ページテーブルは、別のページング構造エントリーまたはマップされたメモリーページを示す物理アドレスを保持する固定サイズのレコード/エントリーから構築されます。物理アドレスとともに、ページング構造エントリーも物理アドレスに関するさまざまな属性ビットを保持します。これらには、物理メモリーにページが存在 (P フラグ) するかどうかを示すビットが含まれます。存在しないと示されたページテーブルエントリーはプロセッサーの MMU ロジックによって無視されるはずです。

ページ構造エントリー:

Intel Software Developers Manual (Volume 3、Chapter 4) には、Intel プロセッサーによって使用されるハードウェアのページング構造が定義されています。これには、仮想から物理アドレスへの変換中に物理アドレスを格納するために使用される 64 ビットページテーブルエントリー (PTE) も含まれています。


アドレスの変換中、プロセッサーはページテーブル構造をたどり、最終的に特定の仮想アドレスの想定される物理変換が含まれるページテーブルエントリーに到達します。仮想アドレスが物理メモリーのマップされたページフレームに対して解決された場合や、ページング構造エントリーによってメインメモリーに必要なページフレームが 存在しない (P フラグ (ビット0) = 0) と示された場合、または 予約済みのビットセット がある場合に、このアドレス変換プロセスが終了します。このようなエントリーから物理アドレスにアクセスすると、ページ違反例外 (ターミナル違反) が発生します。

謝辞

Red Hat は、この問題を報告していただき、軽減策でご協力いただいた Intel Inc. ならびに業界のパートナーに感謝いたします。

その他の参考資料

この問題に関する詳細は、Intel 社の web サイトを参照してください。

Foreshadow の web サイト

Everything you need to know about L1TF in 3 minutes

Technical Explainer Video (10 分)

Understanding L1 Terminal Fault Blog

Managing Risk in the Modern World Blog

Performance considerations for L1TF


 Red Hat 製品のその他の関連資料

Is CPU Microcode available to address CVE-2018-3620 and CVE-2018-3646?

Managing Hyper-Threading

The "tuned-adm" command hangs when changing to the "cpu-partitioning" profile with CPUs disabled


影響を受ける製品

Red Hat Product セキュリティーチームは、 CVE-2018-3620 および CVE-2018-3646 の重大度を重要な影響 と評価しています。

以下の Red Hat 製品のバージョンが影響を受けます。

  • Red Hat Enterprise Linux 5

  • Red Hat Enterprise Linux 6

  • Red Hat Enterprise Linux 7

  • Red Hat Atomic Host

  • Red Hat Enterprise MRG 2

  • Red Hat OpenShift Online v3

  • Red Hat Enterprise Linux OpenStack Platform 7.0 (Kilo) for RHEL7

  • Red Hat Enterprise Linux OpenStack Platform 7.0 (Kilo) director for RHEL7

  • Red Hat OpenStack Platform 8.0 (Liberty)

  • Red Hat OpenStack Platform 8.0 (Liberty) director

  • Red Hat OpenStack Platform 9.0 (Mitaka)

  • Red Hat OpenStack Platform 9.0 (Mitaka) director

  • Red Hat OpenStack Platform 10.0 (Newton)

  • Red Hat OpenStack Platform 11.0 (Ocata)

  • Red Hat OpenStack Platform 12.0 (Pike)

  • Red Hat OpenStack Platform 13.0 (Queens)

  • Red Hat Virtualization (RHEV-H/RHV-H)


    Red Hat の Linux コンテナーは、カーネル問題による直接の影響は受けませんが、そのセキュリティーは、ホストのカーネル環境の整合性に依存します。Red Hat では最新版のコンテナーイメージを使用することを推奨しています。Red Hat Container Catalog に含まれる Container Health Index を使用すると、お使いのコンテナーのセキュリティー状況を確認できます。使用中のコンテナーのプライバシーを保護するには、これらの攻撃に対してコンテナーホスト (Red Hat Enterprise Linux や Atomic Host など) が更新されていることを確認してください。Red Hat では、このユースケース用の更新済み Atomic Host をリリースしています。

    攻撃の詳細と影響

    従来のホスト攻撃ベクトル:

    プロセッサーが命令の投機的実行をサポートする場合は、物理アドレスに解決できない仮想アドレスからの投機的ロードによって、その変換プロセス時にページ違反例外が発生します。このページ違反例外が出力される前に、ロード命令の投機的実行は、存在しない (P フラグ = 0) または 予約済みのビットセット のページング構造エントリーの物理アドレスを使用して物理メモリーにアクセスします。この物理メモリーの場所が L1 データキャッシュに格納された場合は、投機的ロードにより不適切な物理メモリーの場所からデータを読み込みます。その結果、後続の投機的操作がこのデータを使用でき、攻撃者が不正なデータを読み取るために使用できるキャッシュに重大な影響を与えます。

    権限を持たないシステムユーザーまたはプロセスが L1TF 脆弱性を悪用し、データが最初に L1 データキャッシュにロードされた場合に、システム上で実行しているカーネルやその他のプロセスの任意の物理メモリーからデータを読み取ることが可能になります。L1 データキャッシュへのロードは、プロセッサーに本来備わっている機能であるため、攻撃者が行うことは、通常の操作の実行中に、機密情報が含まれるプログラムがその機密情報をロードするのを待つことのみです。機密情報には、暗号キーやその他のデータなどが含まれます。


    仮想化攻撃ベクトル:

    仮想化のゲスト環境では、この脆弱性を利用した場合の影響が悪化します。仮想化環境では、ゲストがメモリーを管理するオペレーティングシステムを、ベアメタルのホストマシンで実行しているかのようにしばしば実行します。ゲストのオペレーティングシステムが物理メモリと認識しているのは、仮想マシンモニター (KVM などの VMM) によって作成され、ハイパーバイザーとしても知られるホスト上の仮想アドレス空間です。このハイパーバイザーは、実際のホストの物理メモリーを制御するためにメモリーの仮想化層を導入し、ホストの物理メモリーへのアクセスを管理する間に、多数のゲストに分離した仮想のアドレス領域を提供します。これは、仮想環境が、2 つのレベルのメモリー変換を持つことを示しています。

    ゲストの物理アドレスからホストの物理アドレスへ効率的な変換を容易にするために、ハードウェアのプロセッサーに、Extended Page Table (EPT) 機能が導入されています。

    EPT は、仮想アドレスから物理のメモリーアドレスに変換するために、ホストのオペレーティングシステムが使用する階層的ページング構造に類似します。ホストのページ違反例外のように、ゲストの物理アドレスをホストの物理アドレスに変換する際、EPT 違反 例外により仮想マシンが終了します。これは、指定したゲストの物理アドレス変換が、ホストの物理アドレスを解決できない、または指定したホストメモリーにアクセスするためのパーミッションがゲストにないことを示しています。

    ホストと同様、ゲストユーザーによる命令の投機的実行は、このような EPT 違反によって誘発された仮想マシンの終了を利用して、キャッシュサイドチャンネル攻撃を介して、ホストの物理メモリーからのデータを読み取ります。ゲストのオペレーティングシステムは、EPT ページングエントリーでゲストの物理アドレスビットを制御できるため、ゲストユーザーは、特定のホストの物理アドレスを狙って、L1 データキャッシュからデータを読み込むことができます。これには、任意のホストのカーネルメモリーや、そのホストで実行している別のゲストやプロセスのメモリーが含まれます。


    同時マルチスレッド攻撃ベクトル:

    最新のプロセッサーは、同時マルチスレッド (SMT) を使用することで、別の論理プロセッサーで同時に複数の命令ストリームを実行することでシステムのパフォーマンスを改善します。つまり、CPU には、データレジスター、コントロールレジスター、セグメントレジスターなどの独自のセットがあり、アーキテクチャーの状態を形成する 2 つ以上の論理プロセッサーを作成します。この論理プロセッサーは、同じ実行エンジン、プロセッサーキャッシュ、TLB、システムバスインターフェースなどを共有しながら、別の命令ストリームを実行します。

    論理プロセッサーがプロセッサーのキャッシュを共有しているということは、1 つの論理プロセッサーによって実行されたキャッシュ操作を相手が確認できるということです。つまり、1 つの論理プロセッサーで実行しているアプリケーションまたはゲストは、L1TF と命令の投機的実行を利用して、その他のプロセスと、共有データキャッシュのカーネルの任意のメモリーコンテンツを読み込みます。

    Intel のハイパースレッディングの同時発生の機能は、ピアの論理プロセッサー上で実行中の仮想マシンインスタンスを切り替えるときに、その論理プロセッサー上のキャッシュをフラッシュすることにより、小さな時間枠が残り、そのシークレットがピアによって再ロードされ、悪意のある攻撃者に表示されるようになり、他の論理プロセッサー上でコードを実行するようになります。これが確実に発生しないようにするための標準的な方法はありません。

    その結果、仮想化環境は、2つの異なる仮想マシンが、1 つのコアから 2 つの論理プロセッサーを共有するようにスケジュールする必要はありません。また、フルスタックの Linux がホストで実行している場合、そのホストが、中断などのイベントに応えて、その独自のシークレットをロードできますが、信頼できないゲストを論理プロセッサーで実行している場合にハイパースレッディングを有効にすることは安全ではありません。

    パフォーマンスへの影響

    仮想環境を使用しないベアメタル環境で L1TF を軽減すると、パフォーマンスにわずかな影響を与えますが、更新をインストールする以外に特別な作業をする必要はありません。

    仮想化環境で L1TF を軽減すると、仮想マシンのコードの実行を開始する時に、その他の仮想マシン (またはホスト) から潜在的なシークレットの L1 データキャッシュ (L1D) をフラッシュしたかどうかを、ハイパーバイザーが常に確認する必要があります。そのワークロードによっては、あるハイパースレッド上で実行している悪意のある仮想マシンが、ピアスレッド上で他のハイパースレッドを攻撃しないようにするために、Intel のハイパースレッディングを無効にしないといけない場合があります。

    L1 データキャッシュは、メインのメモリーよりもはるかに速く CPU にデータを提供し、メモリーからロードされた (ほとんど) すべてのデータはそれを通過する必要があります。L1 データキャッシュがフラッシュされたら、CPU は、そのエントリーを低レベルのキャッシュから再投入するために、何百ものサイクルを費やす必要があります。これは、データアクセスにかかる時間を考えると高くつきます。相対効率に関しては、L1 データキャッシュは 1x CPU サイクルとなりますが、低レベルキャッシュからの同じデータアクセスには 4x CPU サイクルを要します。メインメモリーからのデータアクセスでは、60-70x 以上のサイクルを要する可能性があります。L1 に含まれるデータは、よりレベルの高いキャッシュにも含まれるため、通常は L2 から補充され、パフォーマンスに与える影響もわずかとなります。このオーバーヘッドにより、外部の中断とその他のイベントのレイテンシーも増えます。

    同様に、ハイパースレッディング (SMT 実装) は、複数の命令ストリームを同時に実行して、システムのパフォーマンスを取得します。このスレッドを無効にすると、システムが確認できる論理 CPU の数を半分にしてしまうため、システムのスループットとそのパフォーマンスの計算全体が著しく低下します。

    この方法の実際のパフォーマンスへの影響はワークロードに依存し、1 つのワークロードから別のワークロードに変更する場合があることを留意してください。ワークロードに特化したパフォーマンスの影響の詳細は、L1 Terminal Fault におけるパフォーマンスの考慮事項 を参照してください。

    脆弱性の診断

    診断スクリプトを使用して、この不具合による脆弱性がご使用のシステムに存在するかどうかを判断します。正規のスクリプトであることを確認するために、GPG 分離署名もダウンロード できます。このスクリプトの現在のバージョンは 1.2 です。

    また、以下に Ansible Playbook が 2 つ提供されています。1 つ目の Playbook CVE-2018-3620-fix_disable_ht.yml は、システムを再起動せずにハイパースレッディングを無効にして L1TF に対応するようにしていないシステムに適用できます。この Playbook は、システムがハイパーバイザーとして動作しているかどうか、そのシステムに稼働している仮想マシンがあるかどうかを決定しますが、ハイパースレッディングをオフラインにすると、特定のコア/スレッドのアフィニティーを使用するアプリケーションで予期せぬ動作が発生します。システムのカーネルに必要な機能が含まれない場合は失敗し、その結果へのメッセージを表示します。この場合は、最新のカーネルに更新し、L1TF に対応するカーネルの機能を利用する 2 番目の Playbook を使用することが推奨されます。

    CVE-2018-3620-fix_disable_ht.yml Playbook を使用するには、HOSTS 追加変数で指定した、変更したいホストで ansible-playbook を呼び出します。
    ansible-playbook -e "HOSTS=webservers,db01,portal" CVE-2018-3620-fix_disable_ht.yml

    2 番目の Playbook (CVE-2018-3620-apply_settings.yml) により、L1TF に対応するカーネルが提供する軽減策を有効にできます。指定できる設定は 3 つあります。

    • FLUSH=1 はカーネルと kvm-intel カーネルモジュールの動作を変更して、フラッシュが必要だとカーネルが判断したものだけでなく、すべての仮想マシンで L1 データキャッシュをフラッシュします。パフォーマンスの実装があっても、仮想マシン間で情報が共有されていないことをより強く保証し、ASLR の非ランダム化などの情報リークが起こらないようにします。この設定は、信頼できないゲストシステムでハイパーバイザーを実行している場合にのみ必要になります。
    • SMT=1 は、ライブシステムまたはブート時にハイパースレッディングを無効にします。最初の Playbook と同様、 アフィニティーを設定したスレッドをオフラインにしないようにするアクティブなゲストがあるかどうかを確認するための試みが行われます。
    • FORCE=1 は、SMT=1 と組み合わせて使用した場合は、ランタイム時に /sys/devices/cpu/smt/control インターフェースから SMT を再有効にすることはできません。FORCE が指定されていない場合は、十分なパーミッションを持つユーザーがランタイム時に SMT を再度有効にしたり、無効にしたりできます。

    また、Playbook は、上述の軽減策を削除し、システムの動作をデフォルトに戻して、仮想マシンで SMT と条件付き L1 データキャッシュのフラッシュを有効にする RESET=1 引数を提供します。RESET=1 を使用したらシステムの再起動が必要になります。

    CVE-2018-3620-apply_settings.yml を使用するには、追加の編集を設定する機能と、HOSTS 変数で対象するシステムを指定します。以下は例となります。

    SMT はオフにしますが、ランタイムの変更を可能にし、条件付き L1 データキャッシュのフラッシュをデフォルトの動作にするには:
    ansible-playbook -e "HOSTS=webservers SMT=1" CVE-2018-3620-apply_settings.yml

    すべての軽減策を適用してランタイムの変更を防ぐには:
    ansible-playbook -e "HOSTS=vmserver01 FLUSH=1 SMT=1 FORCE=1" CVE-2018-3620-apply_settings.yml

    L1TF 設定をリセットしてデフォルトの状態に戻すには:
    ansible-playbook -e "HOSTS=webservers RESET=1" CVE-2018-3620-apply_settings.yml

    軽減策 Playbook のダウンロード

    CVE-2018-3620-fix_disable_ht.yml  GPG 分離署名

    CVE-2018-3620-apply_settings.yml  GPG 分離署名

    システムの脆弱性の判断


    対処方法

    影響のあるバージョンの Red Hat 製品をご使用のお客様は、エラータが入手可能になり次第、該当製品を更新することが強く推奨されます。利用可能な更新を早急に適用し、適切な軽減策を有効にしてください。
     
    パッチを当てる順番は重要ではありませんが、ファームウェアとハイパーバイザーをアップデートしたら、システムおよび仮想マシンの電源をすべて切って再起動して、新しいハードウェアのタイプを認識させる必要があります。

    影響を受ける製品の更新

    製品名パッケージアドバイザリー/更新
    Red Hat Enterprise Linux 7 (z-stream)kernelRHSA-2018:2384
    Red Hat Enterprise Linux 7kernel-rtRHSA-2018:2395
    Red Hat Enterprise Linux 7microcode_ctlmicrocode_ctl
    Red Hat Enterprise Linux 7.4 Extended Update Support**kernelRHSA-2018:2387
    Red Hat Enterprise Linux 7.4 Extended Update Support**microcode_ctlRHSA-2018:2387
    Red Hat Enterprise Linux 7.3 Extended Update Support**kernelRHSA-2018:2388
    Red Hat Enterprise Linux 7.3 Extended Update Support**microcode_ctlRHSA-2018:2388
    Red Hat Enterprise Linux 7.2 Update Services for SAP Solutions, & Advanced Update Support***,****kernelRed Hat Enterprise Linux 7.2 Update Services for SAP Solutions, & Advanced Update Support***,****
    Red Hat Enterprise Linux 7.2 Update Services for SAP Solutions, & Advanced Update Support***,****microcode_ctlRed Hat Enterprise Linux 7.2 Update Services for SAP Solutions, & Advanced Update Support***,****
    Red Hat Enterprise Linux 6 (z-stream)kernelRHSA-2018:2390
    Red Hat Enterprise Linux 6microcode_ctlRHSA-2018:2390
    Red Hat Enterprise Linux 6.7 Extended Update Support**kernelRHSA-2018:2391
    Red Hat Enterprise Linux 6.7 Extended Update Support**microcode_ctl RHEA-2018:2304
    Red Hat Enterprise Linux 6.6 Advanced Update Support***,****kernelRHSA-2018:2392
    Red Hat Enterprise Linux 6.6 Advanced Update Support***,****microcode_ctlRHEA-2018:2302
    Red Hat Enterprise Linux 6.5 Advanced Update Support***kernelRHSA-2018:2393
    Red Hat Enterprise Linux 6.5 Advanced Update Support***microcode_ctlRHEA-2018:2303 
    Red Hat Enterprise Linux 6.4 Advanced Update Support***kernelRHSA-2018:2394
    Red Hat Enterprise Linux 6.4 Advanced Update Support***microcode_ctlRHEA-2018:2297 
    Red Hat Enterprise Linux 5 Extended Lifecycle Support*kernelpending
    Red Hat Enterprise Linux 5 Extended Lifecycle Support*microcode_ctlpending
    Red Hat Enterprise Linux 5.9 Advanced Update Support***kernelpending
    Red Hat Enterprise Linux 5.9 Advanced Update Support***microcode_ctlpending
    RHEL Atomic Hostkernelrespin pending
    Red Hat Enterprise MRG 2kernel-rtRHSA-2018:2396
    Red Hat Virtualization 4redhat-virtualization-hostRHSA-2018:2403
    Red Hat Virtualization 4rhvm-applianceRHSA-2018:2402
    Red Hat Virtualization 3 Extended Lifecycle Support*rhev-hypervisor7RHSA-2018:2404
    Red Hat Enterprise Linux OpenStack Platform 7.0 (Kilo) director for RHEL7director イメージrespin pending
    Red Hat OpenStack Platform 8.0 (Liberty)director イメージrespin pending
    Red Hat OpenStack Platform 9.0 (Mitaka)director イメージrespin pending
    Red Hat OpenStack Platform 10.0 (Newton)director イメージrespin pending
    Red Hat OpenStack Platform 11.0 (Ocata)director イメージrespin pending
    Red Hat OpenStack Platform 12.0 (Pike)director イメージrespin pending
    Red Hat OpenStack Platform 12.0 (Pike)コンテナーrespin pending
    Red Hat OpenStack Platform 13.0 (Queens)director イメージrespin pending
    Red Hat OpenStack Platform 13.0 (Queens)コンテナーrespin pending


    *このパッチにアクセスするには、アクティブな ELS サブスクリプションが必要です。ご使用のアカウントにアクティブな ELS サブスクリプションがない場合は、Red Hat 営業部門または営業の担当者にお問い合わせください。

    **このパッチにアクセスするには、アクティブな EUS サブスクリプションが必要です。お持ちのアカウントに有効な EUS サブスクリプションがない場合は、Red Hat 営業部門または営業の担当者にお問い合わせください。

    Red Hat Enterprise Linux Extended Update Support サブスクリプションとは何ですか?

    ***RHEL AUS のパッチを入手するには、有効な AUS サブスクリプションが必要です

    What is Advanced mission critical Update Support (AUS)?

    ****RHEL TUS のパッチを入手するには、アクティブな TUS サブスクリプションが必要です

    ***** サブスクリプションをお持ちの場合は、お使いのハードウェアの OEM に連絡して、CPU マイクロコード/ファームウェアの最新バージョンを入手してください。


    軽減策

    現時点の軽減策には、ハードウェア OEM の CPU マイクロコード/ファームウェアと合わせてベンターのソフトウェア更新の適用が含まれます。Red Hat 製品をご使用のお客様は、パッチが利用可能になったら、(必要に応じて) 早急にベンダーソリューションを適用して CPU やシステム BIOS にパッチを当て、カーネルを更新してください。すべての軽減策はデフォルトで有効になっておりますが、ハイパースレッディングの無効は例外となるため、お客様が手動で無効にする必要があります。お客様がこの問題を確認して対応する際には、セキュリティーリスクと、軽減策の範囲、そしてパフォーマンスへの影響を評価する必要があります。セキュリティーおよび信頼性のレベルを高くする必要があるシステムに最初に対応する必要があり、信頼できないシステムに侵害のリスクが低減するための方法を適用できるようになるまで、そのようなシステムからは分離する必要があります。 この問題の完全な軽減を希望される場合は、より安全に管理する方法を検討し、場合によっては、すべての攻撃進路を遮断するためにハイパースレッディングを無効にすることを検討してください。

    軽減策/修正:

    L1 Terminal Fault の完全な軽減策には、ページテーブルの反転 (更新されたカーネルにより提供され、デフォルトで有効になっている小規模の更新)、(仮想マシンを切り替える際の) L1 データキャッシュのフラッシュ、あるいは SMT の無効の 3 つの変更が必要です。3 つの変更はそれぞれ独立しており、対処する攻撃の種類も異なります。

    Red Hat が提供する、更新したカーネルに存在しないページテーブルエントリーを操作する際に、ページテーブル反転 (メルトダウンの軽減時に追加されたページテーブルの分離と異なる) が、デフォルトで実行されます。

    L1 データキャッシュのフラッシュはオプションで、更新したマイクロコードまたはカーネルにより実装できます。現在は、仮想化ゲストマシンを実行するとデフォルトで有効になりますが、カーネルパラメーターを使用してユーザーが制御できます。

    オプションで、仮想マシンを実行する信頼できない共有環境を保護するために SMT の無効化を使用できます。これは、新しい制御インターフェースを追加する、カーネルへのソフトウェア変更により実装されます。また、これを使用して BIOS ファームウェアで Intel のハイパースレッディングを無効にすることもできますが、はるかに扱いにくいため、アプローチとしては推奨されません。

    この不具合には、要因が 3 つあるため、救済策には、3 方面のアプローチが必要になります。

    1. 存在しない (P flag = 0) ページテーブルエントリー (PTE)、または 予約済みのビットセット があるものが、初期化されていない物理アドレスを保持しています。そして、その物理アドレスが L1 データキャッシュに格納されます。
    2. L1 データキャッシュへの投機的な操作により発生した更新は削除されません。これは、後続のプロセスにより確認できます。
    3. 同時マルチスレッド (SMT) は実行エンジンと、L1 データや TLB キャッシュなどのオンチッププロセッサーのキャッシュを共有します。

    ページテーブルの反転:

    プロセッサーは、存在しない PTE から物理アドレスに投機的にアクセスし、この物理アドレスのコンテンツが L1 データキャッシュに格納され、メモリーのアクセスに成功します。したがって、物理アドレスのコンテンツがキャッシュに格納されていないと、そのメモリーアクセスはデータをリークしません。ページテーブル反転の軽減策は、上位アドレスビットを設定することで、メモリーにない物理アドレスや、キャッシュに格納できない物理アドレスを指定するようにして、存在しない PTE で物理アドレスを更新します。したがって、このコンテンツは L1 データキャッシュには存在しないはずです。

    更新したカーネルパッケージは、以下のように、sysfs インターフェースから、システムの現在のステータスを表示します。

    # cat /sys/devices/system/cpu/vulnerabilities/l1tf
    軽減策: PTE 反転; VMX: SMT 脆弱性, L1D 条件付きキャッシュのフラッシュ
    #

    L1 データキャッシュのフラッシュ:

    更新されたマイクロコードをシステムにインストールすると、Intel x86 プロセッサーは IA32_FLUSH_CMD Machine Specific Register (MSR) を提供します。これは、L1 データキャッシュを無効にするために使用できます。IA32_FLUSH_CMD MSR のサポートは /proc/cpuinfo フラグまたは lscpu(1) コマンド (CPU フラグの一覧を表示) で確認できます。

    # lscpu
    フラグ:    … ssbd ibrs ibpb stibp spec_ctrl intel_stibp flush_l1d
    #

    flush_l1d フラグが利用できない場合は、更新されたマイクロコードがシステムにインストールされており、システムが再起動していることを確認します。

    更新したマイクロコードがインストールされていない場合は、flush_l1d フラグが使用できません。更新したカーネルでは、引き続きソフトウェアで L1 データキャッシュをフラッシュします。この動作は、ハードウェアの flush_l1d インターフェースに比べると遅くなります。

    更新したカーネルパッケージでは、L1TF の軽減を制御するために、以下のカーネルおよび KVM モジュールのパラメーターが導入されます。

    l1tf=[full/full,force/flush/flush,nosmt/flush,nowarn/off]

    これは、影響を受ける CPU で L1TF 問題の軽減策を制御するカーネルブートパラメーターです。以下のいずれかの値を取ります。

    full:  L1TF 問題の軽減策をすべて有効にします。

    • すべての仮想マシンエントリー操作で、L1 データキャッシュのフラッシュを有効にします。
    • ハイパースレッディング (SMT) を無効にします。

    L1 データキャッシュのフラッシュと SMT はともに、起動後のランタイム時に、sysfs インターフェースから制御できます。

    full,force: L1TF 問題の軽減策をすべて有効にします。

    • すべての仮想マシンエントリー操作で、L1 データキャッシュのフラッシュを有効にします。
    • ハイパースレッディング (SMT) を無効にします。

    ここで force パラメーターによって、上述の L1TF 軽減策を sysfs インターフェースから無効にすることはできません。ユーザーは、ランタイム時に SMT を有効にすることはできません。

    flush: L1 データキャッシュのフラッシュだけを有効にします。

    • デフォルトの L1 データキャッシュのフラッシュの軽減策を有効にします。これは、L1 データキャッシュを条件付きでフラッシュします。
    • ハイパースレッディング (SMT) を無効にしません。

    両方とも、引き続き sysfs インターフェースで制御できます。ハイパーバイザー (KVM) は、設定が安全ではない状態 (SMT が有効になっているか、L1 データキャッシュのフラッシュが無効になっている場合) でゲストを起動した場合に警告を発生させます。

    flush,nosmt: ハイパースレッディング (SMT) を無効にします。

    • 条件付き L1 データキャッシュのフラッシュの軽減策を有効にします。
    • ハイパースレッディング (SMT) の無効

    両方とも、引き続き sysfs インターフェースで制御できます。ハイパーバイザー (KVM) は、設定が安全ではない状態 (SMT が有効になっているか、L1 データキャッシュのフラッシュが無効になっている場合) でゲストを起動した場合に警告を発生させます。

    flush,nowarn: 上述のフラッシュオプションと類似していますが、実行しているゲストの設定が安全ではない場合に KVM モジュールの警告を非表示にする点が異なります。

    off: ハイパーバイザーの軽減策を無効にします。つまり、KVM は仮想マシンエントリーで L1 データキャッシュをフラッシュしません。

    l1tf ブートパラメーターのデフォルト値は、上述のフラッシュ軽減策オプションに設定されます。

    kvm-intel.vmentry_l1d_flush: それぞれの仮想マシンエントリーで L1 データキャッシュのフラッシュ操作を制御する KVM モジュールパラメーター。ここでは、以下の値を設定できます。

       always     全 VMENTER で L1D キャッシュをフラッシュします。
       cond       条件付きで L1D キャッシュをフラッシュします。
       never      L1D キャッシュフラッシュの軽減策を無効にします。

    VMEXIT と VMENTER の間で実行しているコードが安全だと考えられる場合に、cond は、VMENTER における L1D キャッシュのフラッシュを
    回避しようとします。つまり、利用される可能性がある L1D に興味深い情報を持ち込むことはしません。

            # cat  /sys/module/kvm_intel/parameters/vmentry_l1d_flush
           cond
           #

    このパラメーターは、デフォルトで cond に設定できます。これにより、仮想マシンの選択的エントリーインターフェースで L1 データキャッシュをフラッシュして、L1 データキャッシュフラッシュのパフォーマンスへの影響を少なくできるはずです。

    制御 SMT:

    同時マルチスレッドまたはハイパースレッディング技術が使用されている場合は、同じコアで実行し、プロセッサーキャッシュのリソースを共有する無関係なスレッドが、 L1TF 問題を利用して、L1 データキャッシュからそれぞれのデータを読み込むことができます。信頼できない共有環境を実行している場合は、軽減策の一環として SMT を無効にすることを検討してください。一般的に、SMT の有効化/無効化はシステムの BIOS で設定できます。

    更新したカーネルパッケージでは、コマンドラインパラメーター nosmt が新たに導入されました。

    nosmt: 同時マルチスレッド (SMT) を無効にします。sysfs インターフェースを介せば、ランタイム時に再度有効にできます。

    nosmt=force: 同時マルチスレッド (SMT) を無効にします。ランタイム時に再度有効にすることはできません。

    注記: ランタイム時にマルチスレッドを管理するための、カーネルの sysfs インターフェースでの制御があります。ただし、SMT を再度有効にすると間違った動作が発生する可能性があります。したがって、SMT を有効または無効にするために、上述した BIOS 設定またはカーネルブートパラメーターのいずれかを使用することが強く推奨されます。ランタイムのフラグについては、以下では参照用として提供されています。

    /sys/devices/system/cpu/smt/active
    /sys/devices/system/cpu/smt/control

    上述の active ファイルは読み取り専用インターフェースです。active ファイルに ‘1’ が含まれる場合は、SMT が有効で、シブリングスレッドがオンラインになっています。 ‘nosmt’ パラメーターでカーネルを起動した場合は通常、上述の active ファイルに ‘0’ を書き込みます。

    上述の制御ファイルは読み書きのインターフェースで、SMT を制御します。以下の値を設定できます。

    on             :  SMT が有効になっています。シブリングスレッドがオフラインの場合は有効にします。
    off            :  SMT が無効になっています。シブリングスレッドがオンラインになっている場合は無効にします。
    forceoff :  SMT が強制的に無効になっていて、変更することができません。ランタイム時に制御または
                     変更することはできません。
    notsupported: プロセッサーはハイパースレッディング (SMT) をサポートしません。

    EPT: の無効

    本来、ゲストのアドレス変換を VMM およびハイパーバイザーが管理するため、KVM ゲストに対して、Extended Page Tables (EPT) を無効にすると、L1TF 問題が軽減します。EPT を無効にした場合は、上述のように、ハイパースレッド (SMT) を無効にして L1 データキャッシュをフラッシュする必要はなくなります。

    注記: EPT を無効にすると、システムのパフォーマンスが著しく低下するため、これは現実的な選択肢ではないかもしれません。

    EPT は、kvm-intel.ept パラメーターを使用して、ハイパーバイザーで無効にできます。これはデフォルトでは有効になっています。

    Red Hat は、利用可能になったらすぐに、ハードウェアベンダーまたは CPU ベンダーが提供するマイクロコード/ファームウェアの更新を適用し、更新されたカーネルをインストールすることを推奨します。ソフトウェアの更新は、ハードウェアのマイクロコードとは別に適用できますが、CPU ファームウェアが更新されるまで有効にはなりません。

    Tuned

    新しい L1TF カーネルは、ランタイムまたはカーネルのブート時にハイパースレッディングを無効にするための制御をユーザーに提供します。この 2 つのいずれかの方法を使用しており、以下の 4 つのいずれかの tuned プロファイルをシステムが実行している場合は、

          cpu-partitioning    
          realtime
          realtime-virtual-host
          realtime-virtual-guest

    更新した tuned が必要になります。RHEL 7.4z および 7.5z のみがこの影響を受けます。ハイパースレッディングが BIOS で無効になっている場合は、更新した tuned は必要ありません。

    Comments