Warning message

This translation is outdated. For the most up-to-date information, please refer to the English version.

Red Hat Enterprise Linux パラメーターで、CVE-2017-5754、CVE-2017-5715、および CVE-2017-5753 で提供されているマイクロコードおよびセキュリティーのパッチによるパフォーマンスへの影響を制御する

Updated -

お使いのシステムがこの CVE の影響を受けるかどうかを検出する Spectre And Meltdown Detector が Red Hat Customer Portal Labs で提供されています。

先日公開された投機的実行に関する CVE は、様々なプロセッサーのアーキテクチャーおよびハードウェアプラットフォームに影響を与える、潜在的な 3 つの攻撃に対応しています (フィックスは環境によって多少異なります)。このフィックスを適用するには、多くの場合、ハードウェアベンダーから提供されるマイクロコードのアップデートが必要になります。

Red Hat は、セキュリティーの脆弱性に対応する、アップデート版カーネルを公開しました。弊社では、セキュリティーについては追加設定を必要としないことが優先されるため、上述のパッチはデフォルトで有効になっています。投機的実行は、パフォーマンスを最適化する技術です。したがって、このアップデート (カーネルおよびマイクロコードの両方) では、ワークロードに関するパフォーマンスが低下する可能性があります。したがって、その他の方法 (物理的に分離するなど) でシステムが十分に保護されていると確信している場合に、上記のカーネルパッチを一部またはすべて無効にすることを希望されることが予想されます。逆に、セキュリティー保護のためにパッチを有効にする場合は、このページで、フィックスを有効または無効にしたときのパフォーマンスを評価するメカニズムについて説明します。

概要

お使いのシステムがこの CVE の影響を受けるかどうかを検出する Spectre And Meltdown Detector が Red Hat Customer Portal Labs で提供されています。

先日公開された投機的実行に関する CVE は、様々なプロセッサーのアーキテクチャーおよびハードウェアプラットフォームに影響を与える、潜在的な 3 つの攻撃に対応しています (フィックスは環境によって多少異なります)。このフィックスを適用するには、多くの場合、ハードウェアベンダーから提供されるマイクロコードのアップデートが必要になります。

Red Hat は、セキュリティーの脆弱性に対応する、アップデート版カーネルを公開しました。弊社では、セキュリティーについては追加設定を必要としないことが優先されるため、上述のパッチはデフォルトで有効になっています。投機的実行は、パフォーマンスを最適化する技術です。したがって、このアップデート (カーネルおよびマイクロコードの両方) では、ワークロードに関するパフォーマンスが低下する可能性があります。したがって、その他の方法 (物理的に分離するなど) でシステムが十分に保護されていると確信している場合に、上記のカーネルパッチを一部またはすべて無効にすることを希望されることが予想されます。逆に、セキュリティー保護のためにパッチを有効にする場合は、このページで、フィックスを有効または無効にしたときのパフォーマンスを評価するメカニズムについて説明します。

この 3 つの CVE で説明されているセキュリティーの脆弱性は、x86 (Intel チップセットおよび AMD チップセット)、System Z、Power、ARM を含む主要なハードウェアプラットフォームの、最新のマイクロプロセッサーおよびオペレーティングシステムで発生しています。

Retpoline カーネル

2018 年 3 月以降、Red Hat は、X86 cpu において、投機的実行とカーネルの間接分岐を分けるために、この分岐に Retpoline コードを使用します。 Skylake 以前の Intel プロセッサーの場合は、Spectre バリアント 2 に対応するために、ibrs 機能の代わりに Retpolines が使用されます。 Skylake の場合は、CVE 緩和策の懸念があるため、ibrs が引き続き使用され、Retpolines は無効になります。

パッチを当てた GCC コンパイラーには Retpoline サポートが含まれ、Retpoline のパッチを当てたカーネルをコンパイルするために使用されます。 カーネルで実行する必要があるカーネルモジュールをコンパイルするのに、パッチを当てた GCC コンパイラーも必要になります。 SystemTap は、カーネルモジュールを使用してカーネル領域でコードを実行する一例です。パッチを当てたコンパイラーが必要になります。

CVE の無効化:

Red Hat Enterprise Linux カーネルでは、3 つの debugfs パラメーターを使用して、アップデートしたカーネルでさまざまなパッチの動作を制御できます。 この 3 つのパッチを使用した場合はマイクロコードのアップデートが必要になります。ハードウェアプラットフォームプロバイダーから取得してください。

この 3 つの debugfs パラメーターは、システムの起動時にカーネルコマンドラインで、またはランタイム時に debugfs コントロールから有効または無効にできます。このパラメーターは、pti (Page Table Isolation)、ibrs (Indirect Branch Restricted Speculation)、および retp (retpolines) を制御します。CPU の種類によっては、システムの起動時に検出したアーキテクチャーを保護するのに必要となるため、Red Hat では、この機能をデフォルトで有効にしています。

このような CVE に対するセキュリティーの緩和策を無効して、パフォーマンスロスを回復したい場合は、以下の 2 つの方法を選択できます。

永続的に無効にする (再起動後も有効)

1 つ目の方法は、以下のフラグを追加してカーネルのコマンドラインからパラメーターを無効にし、カーネルを再起動してこの設定を有効にすることです。これを設定するフラグがいくつかあります。たとえば以下のようになります。

     spectre_v2=off nopti

注意: 各パラメーターを個別に無効にできます。パフォーマンスの性質上、同時にすべてのパラメーターをすべて無効にする必要はありません。

ランタイム時に無効にする (システムを再起動すると設定が元に戻る)

2 つ目の方法は、以下の 3 つのコマンドを実行して、ランタイム時に無効にすることです。変更はすぐにアクティブになり、再起動時は必要ありません。

    # echo 0 > /sys/kernel/debug/x86/pti_enabled
    # echo 0 > /sys/kernel/debug/x86/ibpb_enabled
    # echo 0 > /sys/kernel/debug/x86/ibrs_enabled

注意: debugfs ファイルシステムがマウントされていることが必要になります。RHEL 7 では、debugfs はデフォルトでマウントされています。RHEL 6 では、以下のコマンドを実行してマウントできます。

  mount -t debugfs nodev /sys/kernel/debug

変更の確認

この CVE に関するフィックスが適切に無効になっていることを確認するには、以下の 3 つのファイルを cat して、値がすべて 0 に設定されていることを確認します。

    # cat /sys/kernel/debug/x86/pti_enabled
    # cat /sys/kernel/debug/x86/ibpb_enabled
    # cat /sys/kernel/debug/x86/ibrs_enabled

上述の CVE フラグを無効にした場合でも、一部のアプリケーションではパフォーマンスロスがわずかに発生する可能性があります。

詳細:

ここからは、各 CVE バリアントの詳細を説明します。

  • CVE-2017-5753 (バリアント #1/Spectre) は、分岐中の境界検査に関する脆弱性となります。この問題は、カーネルパッチで修正されます。バリアント #1 の保護は常に有効になっています。パッチを無効にすることはできません。バリアント #1 に対する Red Hat のパフォーマンステストでは、測定可能な影響は見られませんでした。

  • CVE-2017-5715 (バリアント #2/Spectre) は、データリークが発生する可能性がある間接分岐ポイズニング攻撃となります。この攻撃により、仮想システムのゲストが、ホストシステムからメモリーを読み込むことができるようになります。この問題はマイクロコードで修正されます。同時に、ゲストおよびホストの仮想ソフトウェアに、カーネルおよび仮想システムのアップデートを適用してください。 この脆弱性には、マイクロコードとカーネルのアップデートパッチが必要になります。バリアント #2 の動作は、マイクロコードと連動する ibrs パラメーターと retp パラメーターで制御できます。ibpb パラメーターは確認できますが、読み取り専用で、カーネルにより設定されます。

  • CVE-2017-5754 (バリアント #3/Meltdown) の脆弱性は、投機的なキャッシュロードを使用して、ローカルの攻撃者がメモリーの内容を読み取ることを可能にします。この問題は、カーネルパッチで修正されます。バリアント #3 の挙動は、pti パラメーター (nopti/pti_enabled) で制御されます。

前述したように、ハードウェアベンダーからマイクロコードのアップデートを提供された場合は、バリアント 2 に対して保護するために、そのアップデートをハードウェアにインストールする必要があります。マイクロコードのアップデートについては、ハードウェアベンダーにお問合せください。

pti (Page Table Isolation)

"nopti"/pti_enabled は、ユーザーランドで実行中に、カーネルのページテーブルを分離させる KPTI (Kernel Page Table Isolation) 機能を制御します。この機能は CVE-2017-5754 に対応しており、バリアント #3 (Meltdown) と呼ばれています。

システムの起動時に nopti をカーネルコマンドラインに渡すか、ランタイム時に以下の debugfs コントロールを使用して動的に、PTI 機能を無効にできます。

    # echo 0 > /sys/kernel/debug/x86/pti_enabled

ibrs (Indirect Branch Restricted Speculation)

"noibrs"/ibrs_enabled は、(マイクロコードのアップデート後に) SPEC_CTRL が cpuid に存在する場合に、SPEC_CTRL の MSR (model-specific register) で IBRS 機能を制御します。ibrs_enabled を 1 (spectre_v2=ibrs) に設定すると、カーネルは ibrs で実行します。これにより、カーネル領域を攻撃から保護します (ハイパースレッドおよび同時マルチスレッド攻撃からも保護されます)。IBRS を 2 (spectre_v2=ibrs_always) に設定すると、ユーザーランドおよびカーネルの両方を、ibrs で実行します。これにより、ハイパースレッドおよび同時マルチスレッド攻撃からもユーザー領域を保護します。これは、特定の、以前の AMD プロセッサーでもデフォルトになります (ファミリー 10h、12h、および 16h)。この機能は、CVE-2017-5715 バリアント #2 に対応します。

ibrs_enabled を 3 に設定すると、ユーザーランドを、ibrs で実行します。これは、retpoline (spectre_v2=retpoline,ibrs_user) とともに使用して、ibrs_always と同様のセキュリティーを提供しますが、パフォーマンスのオーバーヘッドは減ります。

システムの起動時に、noibrs をカーネルのコマンドラインに渡すか、以下の debugfs コントロールを使用して動的に、マイクロコードの ibrs 実装を無効にできます。

    # echo 0 > /sys/kernel/debug/x86/ibrs_enabled

ibpb (Indirect Branch Prediction Barriers)

注意: ibpb パラメーターは読み取り専用で、ibrs または retp を設定すると、カーネルにより設定されます。ibpb を ibrs と一緒に使用する場合は、適切に動作させるために、マイクロコードをアップデートする必要があります。

ibpb は、(マイクロコードのアップデート後に) IBPB_SUPPORT または SPEC_CTRL のいずれかが cpuid に存在する場合に、PRED_CMD の MSR (model-specific register) で IBPB 機能を制御します。ibpb_enabled を 1 に設定すると、ユーザーモードおよびゲストモードのコンテキストで実行された間接分岐予測のコンテンツを削除する IBPB バリアが、同じホストで別のアプリケーションまたは仮想マシンを攻撃しないようにします。仮想マシンを、別の仮想マシンから保護するには、ibpb_enabled=1 を設定する必要があります。これは、ibrs_enabled を 2 に設定していても必要になります。この機能は、CVE-2017-5715 バリアント #2 に対応します。

アーキテクチャーのデフォルト

デフォルトでは、アーキテクチャーに適用する適切なパラメーターは、検出されたアーキテクチャーに従って、システムの起動時に自動的に有効になります。

Intel デフォルト:

pti=1 ibrs=0 retp=1 ibpb=1-> フィックスのバリアント #1 #2 #3 (Skylake より前の cpu)
pti=1 ibrs=1 retp=0 ibpb=1-> フィックスのバリアント #1 #2 #3 (Skylake より前の cpu)

pti=1 retp=1 ibrs=0 ibpb=0 -> フィックスのバリアント #1 #3 (マイクロコードのアップデートが利用できる以前の Intel システムの場合)

AMD デフォルト:
基本的なハードウェア実装が異なるため、AMD X86 システムはバリアント #3 の攻撃を受けません。正しいデフォルト値は、起動シーケンス時の動的チェックに基づいて、AMD ハードウェアに設定されます。

pti=0 ibrs=0 ibpb=1 retp=1 -> フィックスのバリアント #1 #2 (マイクロコードのアップデートが適用された場合)
pti=0 ibrs=2 ibpb=1 retp=1 -> フィックスのバリアント #1 #2 (マイクロコードをアップデートせず、間接分岐予測を無効にできる、以前のプロセッサーの場合)

  • パラメーターを表示するために、ベンダーが提供する microcode パッチを適用する必要があります。

s390x

  • s390x は、Spectre (バリアント 1 および 2) の影響は受けますが、Meltdown (バリアント 3) の影響は受けません。
  • この機能がマイクロコードで利用可能な場合は、バリアント 1 (ppa15) の緩和策がアクティブです。これは動的に有効または無効に切り替えることができないため、カーネルパラメーター noaltinstr からは命令パッチを無効するだけできます。
  • バリアント 2 の場、緩和策は bpb 機能から行えます。ppa15 の場合は、この機能がマイクロコードで利用可能な場合は常にアクティブです。これは、動的に有効または無効にすることはできませんが、RHEL では、デフォルトで有効になっているカーネルパラメーター nobp があり、nobp=off から無効にできます (RHEL パッチは big hammer アプローチを採用していますが、これがパフォーマンスに与える影響は非常に大きくなります)。

ppc

  • バリアント 1 および 2 に関するパラメーターの情報は、現在も収集中です。>ベンダーからのパッチも必要になることに注意してください。
  • バリアント 3 は以下で制御されます。

      /sys/devices/system/cpu/rfi_flush
    
  • デフォルトでは有効ですが、カーネルコマンドラインパラメーター no_rfi_flush または nopti でのみ無効にできます。このいずれかを指定するとバリアント 3 が無効になります。

  • /sys/devices/system/cpu/rfi_flush を変更する動的な方法は、RHEL 7.5 以降で利用できます。このバージョン以降では、以下のコマンドを実行すれば変更できます。
 echo 0 > /sys/kernel/debug/powerpc/rfi_flush
 or
 echo 1 > /sys/kernel/debug/powerpc/rfi_flush

自動化のチューニング

次の方法で、カスタマイズした tuned-adm プロファイルに上述のチューニングコマンドを追加すると、この設定を制御できます。

How to create a customized tuned profile

注意: バリアント #1 #2 #3 のセキュリティーフィックスは、デフォルトで有効になります。 したがって、カスタムのプロファイルを作成することは、セキュリティーフィックスを無効にする場合に限り必要になります。

Close

Welcome! Check out the Getting Started with Red Hat page for quick tours and guides for common tasks.