
x86プロセッサのSpeculative Store Bypass Disable (SSBD)機能を使用して、CVE-2018-3639(別名Variant 4)に対するLinuxカーネルの緩和策を実行するツール
ssbd-tools プロジェクトは、x86 プロセッサが提供する Speculative Store Bypass Disable (SSBD) 機能を利用するプログラム群です。SSBD は、Variant 4 と呼ばれ CVE-2018-3639 が割り当てられている Speculative Store Bypass 攻撃に対するプロセッサベースの緩和策です。Linux カーネルは SSBD を利用するためのプロセス単位の制御を導入しており、これらのツールはその制御を利用し、正しさを検証するために使用できます。
Linux カーネルは、x86 システム上の SSBD について、起動時に spec_store_bypass_disable カーネルパラメータで選択できる、いくつかの異なる動作モードを提供します。カーネルパラメータのドキュメントにそれらがよく説明されています。以下は、そのドキュメントのオプションの説明からの抜粋です:
on - Unconditionally disable Speculative Store Bypass
off - Unconditionally enable Speculative Store Bypass
auto - Kernel detects whether the CPU model contains an
implementation of Speculative Store Bypass and
picks the most appropriate mitigation. If the
CPU is not vulnerable, "off" is selected. If the
CPU is vulnerable the default mitigation is
architecture and Kconfig dependent. See below.
prctl - Control Speculative Store Bypass per thread
via prctl. Speculative Store Bypass is enabled
for a process by default. The state of the control
is inherited on fork.
seccomp - Same as "prctl" above, but all seccomp threads
will disable SSB unless they explicitly opt out.
Not specifying this option is equivalent to
spec_store_bypass_disable=auto.
Default mitigations:
X86: If CONFIG_SECCOMP=y "seccomp", otherwise "prctl"
SSBD 機能は、プロセッサのモデル固有レジスタ (MSR) 内の 1 ビットを設定/解除することで有効/無効になります。正確な MSR と MSR 内のビット位置は、CPU ベンダー間、単一ベンダー内の CPU ファミリ間、そしてカーネルがハイパーバイザーの下で実行されているかどうかによって異なります。これらのツールは、Intel と AMD が公開しているガイドラインに従って、現在の実行環境で SSBD ビットがどこにあるかを決定します。
一部のシステムでは、SSBD サポートが利用できない場合があります。これには、いくつかの理由が考えられます:
intel-microcode と amd64-microcode) をインストールすることで、更新されたマイクロコードにアクセスできる場合があります。AMD ファミリ 15h、16h、17h のプロセッサは、更新されたマイクロコードを必要としません。ssbd-exec プログラムは、別のプログラムを実行する前に、プロセス単位の SSBD 制御を利用します。PR_SET_SPECULATION_CTRL prctl を使用して、投機実行を許可 (-p enable は PR_SPEC_ENABLE を使用)、SSBD による投機実行を禁止 (-p disable は PR_SPEC_DISABLE を使用)、または SSBD により将来のすべての子プロセスで投機実行を恒久的に禁止 (-p force-disable は PR_SPEC_FORCE_DISABLE を使用) することができます。
また、パーミッシブな seccomp フィルタ (-s empty) をロードすることもできます。これは x86 ではデフォルトで、プロセスを SSBD 緩和策にオプトインさせます。SSBD にプロセスをオプトインさせないパーミッシブなフィルタをロードするオプション (-s spec-allow) もあります。
$ ./ssbd-exec -- grep Spec /proc/self/status
Speculation_Store_Bypass: thread vulnerable
$ ./ssbd-exec -p disable -- grep -e Spec -e Seccomp /proc/self/status
Seccomp: 0
Speculation_Store_Bypass: thread mitigated
$ ./ssbd-exec -s empty -- grep -e Spec -e Seccomp /proc/self/status
Seccomp: 2
Speculation_Store_Bypass: thread force mitigated
ssbd-verify プログラムは、お使いのプロセッサ固有の MSR とビットオフセットにある実際の SSBD ビットが期待どおりの値であることを検証します。0 は SSBD が使用されていないことを意味し、1 は使用されていることを意味します。
このプログラムは、タスクの PR_GET_SPECULATION_CTRL prctl 値が、投機実行を許可 (-p enable は PR_SPEC_ENABLE を検証)、SSBD による投機実行を禁止 (-p disable は PR_SPEC_DISABLE を検証)、または SSBD により将来のすべての子プロセスで投機実行を恒久的に禁止 (-p force-disable は PR_SPEC_FORCE_DISABLE を検証) するように設定されていることを検証するためにも使用できます。
このプログラムは、-t SECONDS オプションを使用して、SSBD ビットの値を繰り返し検証するように設定できます。SECONDS が 0 の場合、プログラムは SSBD ビットを検証しながら無限にループします。SECONDS に 0 以外の値を指定すると、プログラムは指定された時間だけ SSBD ビットを検証します。
このプログラムには、msr カーネルモジュールがロードされていることと、ユーザーが適切な MSR から SSBD ビットを読み取るための root 権限を持っていることが必要です。
$ sudo ./ssbd-verify 0
$ sudo ./ssbd-verify 1
FAIL: SSBD bit verification failed (expected 1, got 0)
$ ./ssbd-exec -p disable -- sudo ./ssbd-verify 1
$ sudo ./ssbd-exec -s empty -- ./ssbd-verify 1
注: 上記のコマンドでは、NO_NEW_PRIVS が seccomp フィルタのロード前に使用されるため、ssbd-exec に sudo を使用する必要があります。NO_NEW_PRIVS が設定された後に sudo を使用しても、特権を昇格できません。
ssbd-toggle プログラムは、プログラムが終了するまで、SSBD ビットをオンとオフに切り替え続けるだけのプログラムです。ssbd-verify と組み合わせて使用すると、カーネルがそのタスクに切り替わるときに、ssbd-verify プロセスが常に期待どおりの SSBD ビット値を持つことを確認できます。
このプログラムには、msr カーネルモジュールがロードされていることと、ユーザーが適切な MSR に対して読み書きするための root 権限を持っていることが必要です。
$ sudo ./ssbd-toggle
^C
ツールをビルドするには、make を実行します:
$ make
システム上で SSBD が期待どおりに動作していることを確認するための基本的な自動テストを実行するには、root として check ターゲットを実行します:
$ sudo make check
PASS