[Linux] An Update on Retpoline-enabled Kernels for Oracle Linux

原文はこちら。
https://blogs.oracle.com/linuxkernel/an-update-on-retpoline-enabled-kernels-for-oracle-linux

1月に、研究者らは、MeltdownとSpectreと呼ばれる投機的実行の欠陥を明らかにしました。Oracleは以下のサポート・ノートで公式ガイダンスを公開しました。
Meltdown and Spectre
https://meltdownattack.com/
Responding to the Spectre and Meltdown vulnerabilities (CVE-2017-5715, CVE-2017-5753, and CVE-2017-5754) in Oracle Linux and Oracle VM on Oracle X86 Servers (Doc ID 2370398.1)
https://support.oracle.com/rs?type=doc&id=2370398.1
当時、特別なIntelのマイクロコードに依存したこれらのセキュリティ問題の軽減策をリリースしましたが、最新のカーネルリリースkernel-uek-4.1.12-112.16.4には、Spectre Variant 2(CVE-2017-5715)のより高速な、retpolineベースの軽減が含まれています。
[El-errata] ELBA-2018-4050 Oracle Linux 6 Unbreakable Enterprise kernel bug fix update
https://oss.oracle.com/pipermail/el-errata/2018-March/007581.html
このカーネルは、Oracle Linux 7とOracle Linux 6の両方で使用できます。UEK Release 2、UEK Release 3、そしてOracle Linux 6および7のRed Hat Compatible Kernel向けの既存のパッチとあわせ、Oracle LinuxのSpectre and Meltdownの脆弱性に対する最新のソフトウェア軽減策を提供します。
[El-errata] ELBA-2018-4050 Oracle Linux 6 Unbreakable Enterprise kernel bug fix update
https://oss.oracle.com/pipermail/el-errata/2018-March/007581.html
[El-errata] ELBA-2018-4050 Oracle Linux 7 Unbreakable Enterprise kernel bug fix update
https://oss.oracle.com/pipermail/el-errata/2018-March/007580.html
全てのソースコードはGitHubで公開済みです。
oracle/linux-uek - v4.1.12-112.16.4
https://github.com/oracle/linux-uek/releases/tag/v4.1.12-112.16.4
Development Versions of Oracle Linux UEK now available on GitHub
https://blogs.oracle.com/linuxkernel/development-versions-of-oracle-linux-uek-now-available-on-github
https://orablogs-jp.blogspot.com/2018/04/development-versions-of-oracle-linux.html
Oracleはまた、1月にIBRS/IBPB軽減策を使用してSpectre Variantの緩和策をXenに移植しました。Oracle VM 3.4でXenのretpoline軽減策をリリースしようとしています。これにより、サポートされているすべてのハイパーバイザー(Oracle VM 3.2、Oracle VM 3.3、Oracle VM 3.4、およびkvm)へのMeltdown/Specterタイプの攻撃から完全に保護されます。

Retpolinesの利点については、以下のIntelのホワイトペーパーとgoogle.comのサポート記事を参照してください。
Retpoline: A Branch Target Injection Mitigation
https://software.intel.com/sites/default/files/managed/1d/46/Retpoline-A-Branch-Target-Injection-Mitigation.pdf
Retpoline: a software construct for preventing branch-target-injection
https://support.google.com/faqs/answer/7625886
Retpolinesは、間接的な分岐を投機的な実行から隔離するコンパイラによって実行されるソフトウェアによる軽減策です。"return trampoline"から派生したretpolineを使う軽減策は、マイクロコードベースの軽減策よりも大幅にパフォーマンスのオーバーヘッドが少なく、とあるワークロードでは、パッチ適用前のレベルに近いパフォーマンスが得られる可能性があります。

Retpolinesは、Oracle Linux 7(およびOracle Linux 6)で使用可能なretpoline対応のgccコンパイラを使用して、カーネル(およびカーネルモジュール)を再コンパイルすることで有効になります。
[El-errata] ELBA-2018-0408 Oracle Linux 7 gcc bug fix update
https://oss.oracle.com/pipermail/el-errata/2018-March/007569.html
[El-errata] ELBA-2018-0513 Oracle Linux 6 gcc bug fix update
https://oss.oracle.com/pipermail/el-errata/2018-March/007583.html
Oracleのコンパイラエキスパートは、このサポートをgcc-4.8およびgcc-4.4コンパイラに移植しました。このコンパイラはyum.oracle.comで公開されています。これがOracle Linuxでretpoline対応のカーネルを使用できるようにするための前提条件でした。この結果、Oracle Linuxはコンパイラ機能を使用して、Spectre Variant 2攻撃に対してカーネルを自己保護することができます。アプリケーションの再コンパイルは必要ありません。

retpolineを使用する代わりに、IBRS(Indirect Branch Restricted Speculation)を使うこともできます。これはIntelの最新のマイクロコードのアップデートで定義された特別なSPEC_CTRL MSR(モデル固有のレジスタ)を呼び出します。IBRSはマイクロコードを使用してセキュリティ上の脆弱性を軽減します。 IBRSは、とあるワークロードではパフォーマンスが大幅に低下します。retpolineが利用可能である場合でも、もう一つの軽減策であるMSR、IBPB(Indirect Branch Predictor Barrier)も特定のユースケースでは以前として利用されています。

retpolinesを軽減策として利用する上での注意点がいくつかあります。まず、ハードウェアがretpolineをサポートしなければなりません。最新のハードウェアによっては、retpolineの軽減策を無視して命令を推測する場合があります。第2に、ロード可能なカーネルモジュールもretpoline対応のコンパイラでコンパイルする必要があります。そうしないと、カーネルは依然として脆弱なままです。

最新のkernel-uekは、これらの各条件を自動的に検出し、マイクロコードベースのIBRS軽減策を有効にします。フォールバックであるIBRS軽減策の場合、システムにアップデート済みのマイクロコードが存在している必要があります。したがって、ハードウェアベンダーから提供される利用可能な最新のシステムマイクロコードに更新することを常にお勧めします。アップデートされたIntelのマイクロコードには、SPEC_CTRL MSRが導入されていますが、それを呼び出すことはしません。カーネルはMSRを起動する必要があるからです。このカーネルの挙動はユーザーが有効または無効にできます。そのため、IBRSを無効にする予定のシステムに更新されたマイクロコードをロードしてもパフォーマンスに影響はありません。

ゲスト(仮想マシン)システムではマイクロコードを更新する必要はありません。ホストシステムに正しいマイクロコードを有しており、アップデートされたソフトウェア(Xenまたはqemu)があれば、ハイパーバイザーはゲストを保護するために必要なMSRをパススルーします。

サードパーティのカーネルモジュール
サードパーティ製のカーネルモジュールは、retpoline対応のコンパイラで再コンパイルする必要があります。UEKでは、以前にコンパイルされたモジュールがロードされることをkABI(Kernel Application Binary Interface)が保証していますが、これらのモジュールがretpolineに対応していない場合、カーネル全体がIBRS保護を再び有効にし、retpolinesのパフォーマンス上の利点は失われます。

Repolinesは必須ではない
Retpolineが有効になっているカーネルはパフォーマンスが向上しますが、retpolinesがなくてもセキュリティパッチが適用されたカーネル場合、すぐにこれらのパッチを適用することは重要ではありません。

マイクロコードのアップデートは必要
システムがIBRS(マイクロコードベース)の軽減策にフォールバックする必要のある、シナリオが多く存在します。この場合、システムのマイクロコードをアップデートしていない場合は失敗します。retpolinesを利用できる場合でも、マイクロコードをフォールバックとして利用できるようにすることは不可欠です。多数のエッジケース(kvm、強化GPG、Xen、ハードウェア制限など)では、retpolineの緩和策が十分でない場合があります。マイクロコードが期限切れの場合、 'dmesg'出力に表示されるこのメッセージは見たくないでしょう(retpolinesが利用できず、IBRSを利用可能なマイクロコードが利用できない場合のブート時のログです)。
[  358.742211] kmod1: loading module not compiled with retpoline compiler.
[  358.742214] Spectre V2 : Disabling Spectre v2 mitigation retpoline.
[  358.749417] Spectre V2 : Could not enable IBRS.
[  358.754569] Spectre V2 : No Spectre v2 mitigation to fall back to.
[  358.761587] Spectre V2 : system may be vulnerable to spectre
アプリケーションの再コンパイルは不要
カーネルでretpolineを使えるようにアプリケーションを再コンパイルする必要はありません。ロード可能なカーネルモジュールだけを再コンパイルする必要があります。

In summary:

  • UEK 2/3/4、Red Hat Compatible Kernelを使うOracle Linux 6および7はSpectre variant 1/2/3に対応している
  • 最新のUnbreakable Enterprise Kernel release 4には、Spectre variant 2に対応するretpolineベースの軽減策が含まれている
  • retpolineが有効化されたUEK4では、マイクロコードベースのSpectre軽減策を有する以前のリリースに比べてパフォーマンスが大幅に向上している
  • retpolineの軽減策を使うUEK4は特定のハードウェアでのみ動作し、全てのカーネルモジュールをretpoline対応のコンパイラで再コンパイルする必要がある。
  • retpolineの軽減策を使うUEK4は、retpolineのサポートに必要な状況でない場合にはマイクロコードベースの保護策に自動的にフォールバックする。
  • ここに記載した内容全てと詳細は、以下のMy Oracle Supportにドキュメントがある。
    Responding to the Spectre and Meltdown vulnerabilities (CVE-2017-5715, CVE-2017-5753, and CVE-2017-5754) in Oracle Linux and Oracle VM on Oracle X86 Servers (Doc ID 2370398.1)
    https://support.oracle.com/rs?type=doc&id=2370398.1

0 件のコメント:

コメントを投稿