この文書では、最近発見された MDS / Zombieload の脆弱性を軽減するために、KernelCare を使用して再起動せずに SMT(Simultaneous Multithreading) を無効または有効にする方法について説明します。
CPU 同時マルチスレッド化(SMT)を無効にすることは、最近の MDS の脆弱性(「Zombieload」とも呼ばれる)に対抗するために必要な軽減策の1つです。ホスティングプラットフォームの構成とそのワークロードパターンによっては、パフォーマンスに影響があります。また、ゲストに専用コアを割り当てるなど、他の軽減策の影響も考慮する必要があります(VM など)。
カーネルの sysfs
インタフェースを使ってSMTの状態を制御したり、取得したりできます。2つのファイルがあり、両方とも /sys/devices/system/cpu/smt
ディレクトリにあります。:
control
active
/sys/devices/system/cpu/smt
ディレクトリが見つからない場合は、実行中のカーネルがSMTをサポートしていないことを意味します。この場合、SMTコントロールがシステムで利用可能になるように KernelCareパッチ を適用する必要があります。以下の kcarectrl
コマンドを使用してください。:
kcarectl --update
Kernel is safe
ls -l /sys/devices/system/cpu/smt
-r--r--r-- 1 root root 4096 May 17 13:06 active
-rw-r--r-- 1 root root 4096 May 17 13:06 control
これらのファイルを配置したらすぐに、SMTを無効にすることができます。
/sys/devices/system/cpu/smt/control
このファイルを使用してSMTを有効または無効にし、またその状態も表示できます。値は3つあります。:
on
: CPU は SMT をサポートしており、有効になっています。すべての 論理CPU は、制限なしにオフラインまたはオンラインにできます。off
: CPU は SMT をサポートしていますが、無効になっています。制限なしにオフライン/オンラインにできるのは、いわゆるプライマリ SMT スレッドだけです。非プライマリ兄弟(sibling)スレッドをオンラインにしようとすると拒否されます。notsupported
: CPU は SMT をサポートしていません。制御ファイルに書き込むことはできません。/sys/devices/system/cpu/smt/active
このファイルの内容は、SMT のステータスを示します(たとえば、同じ物理コア上で2つ以上の兄弟(sibling)スレッドがアクティブである場合、このファイルの内容は1で、そうでない場合は0です)。
SMTサポートを制御するためのコマンドがいくつかあります(root権限が必要です)。:
cat /sys/devices/system/cpu/smt/active
echo on > /sys/devices/system/cpu/smt/control
echo off > /sys/devices/system/cpu/smt/control
SMTを無効にし、 マイクロコードを更新し, KernelCare パッチを適用すると、ZombieLoad の脆弱性からシステムが保護されます。仮想システム(VM、VPS、その他のクラウドインスタンスタイプなど)には、後者のアクションのみが適用されます。
この文書では、Linux を実行している Intel CPU のマイクロコードを更新する方法を説明します。
注記
この文書は変更されることがあり、他のディストリビューションのための指示で更新されます。
内容:
注記
あなたのプラットフォーム用のマイクロコードパッケージのダウンロードリンクを探します。
パッケージをダウンロードします。
注記
Debian 9 の例
cd <a temporary directory, e.g. /tmp>
mkdir firmware
cd firmware
wget http://security.debian.org/debian-security/pool/updates/non-free/i/intel-microcode/intel-microcode_3.20190514.1~deb9u1_amd64.deb
md5sum intel-microcode_3.20190514.1~deb9u1_amd64.deb
c7bc9728634137453e0f4821fb6bb436 intel-microcode_3.20190514.1~deb9u1_amd64.deb
チェックサムのリストは Debianパッケージのダウンロードページ にあります。
dpkg -x intel-microcode_3.20190514.1~deb9u1_amd64.deb
ls -l
total 1896
drwxr-xr-x 5 root root 53 May 15 04:18 etc
-rw-r--r-- 1 root root 1940140 May 17 11:42 intel-microcode_3.20190514.1~deb9u1_amd64.deb
drwxr-xr-x 3 root root 22 May 15 04:18 lib
drwxr-xr-x 3 root root 19 May 15 04:18 usr
test -d /lib/firmware/intel-ucode/ && mv /lib/firmware/intel-ucode/ /lib/firmware/intel-ucode.backup
cp -r lib/firmware/intel-ucode/ /lib/firmware/
ls -l /lib/firmware/ | grep intel-ucode
drwxr-xr-x 2 root root 4096 May 17 11:47 intel-ucode
drwxr-xr-x 2 root root 4096 May 16 20:54 intel-ucode.backup
dmesg | grep microcode
[ 2.254717] microcode: sig=0x306a9, pf=0x10, revision=0x12
[ 2.254820] microcode: Microcode Update Driver: v2.01 <tigran@aivazian.fsnet.co.uk>, Peter Oruba
cat /proc/cpuinfo | grep -e microcode
microcode : 0x12
microcode : 0x12
microcode : 0x12
microcode : 0x12
ls -l /sys/devices/system/cpu/microcode/reload
--w------- 1 root root 4096 May 17 11:54 /sys/devices/system/cpu/microcode/reload
echo 1 > /sys/devices/system/cpu/microcode/reload
dmesg | grep microcode
[ 2.254717] microcode: sig=0x306a9, pf=0x10, revision=0x12
[ 2.254820] microcode: Microcode Update Driver: v2.01 <tigran@aivazian.fsnet.co.uk>, Peter Oruba
[ 1483.494573] platform microcode: firmware: direct-loading firmware intel-ucode/06-3a-09
[ 1483.495985] microcode: updated to revision 0x21, date = 2019-02-13
[ 1483.496012] platform microcode: firmware: direct-loading firmware intel-ucode/06-3a-09
[ 1483.496698] platform microcode: firmware: direct-loading firmware intel-ucode/06-3a-09
[ 1483.497391] platform microcode: firmware: direct-loading firmware intel-ucode/06-3a-09
cat /proc/cpuinfo | grep -e microcode
microcode : 0x21
microcode : 0x21
microcode : 0x21
microcode : 0x21
RHEL ベースのディストリビューションの場合は、 microcode_ctl utility
を使用して、マイクロコードを更新できます。
microcode_ctl
パッケージを更新して最新のマイクロコードを入手します。yum update microcode_ctl
force-late-intel–06–4f–01
ファームウェアディレクトリの内側を作成します。
touch /lib/firmware/`uname -r`/force-late-intel-06-4f-01
/usr/libexec/microcode_ctl/update_ucode
echo 1 > /sys/devices/system/cpu/microcode/reload
dmesg | grep microcode
[ 2.254717] microcode: sig=0x306a9, pf=0x10, revision=0x12
[ 2.254820] microcode: Microcode Update Driver: v2.01 <tigran@aivazian.fsnet.co.uk>, Peter Oruba
[ 1483.494573] platform microcode: firmware: direct-loading firmware intel-ucode/06-3a-09
[ 1483.495985] microcode: updated to revision 0x21, date = 2019-02-13
[ 1483.496012] platform microcode: firmware: direct-loading firmware intel-ucode/06-3a-09
[ 1483.496698] platform microcode: firmware: direct-loading firmware intel-ucode/06-3a-09
[ 1483.497391] platform microcode: firmware: direct-loading firmware intel-ucode/06-3a-09
cat /proc/cpuinfo | grep -e microcode
microcode : 0x21
microcode : 0x21
microcode : 0x21
microcode : 0x21
1, microcode_ctl
パッケージを更新して最新のマイクロコードを取得します
yum update microcode_ctl
2, yum update microcode_ctl
が次を出力する場合,
Package(s) microcode_ctl available, but not installed.
No Packages marked for Update
パッケージを手動でインストールする必要があります。
3, microcode_ctl
パッケージをインストールするには、次のコマンドを実行します
yum install microcode_ctl
コマンド出力:
Installed:
microcode_ctl.x86_64 2:1.17-33.11.el6_10
Complete!
4, CPUマイクロコードバージョンを確認します.
cat /proc/cpuinfo | grep microcode
microcode : 9
microcode : 9
microcode : 9
microcode : 9
5, マイクロコードを更新してみてください
microcode_ctl -u
出力が表示される場合:
microcode_ctl: writing microcode (length: 2370560)
microcode_ctl: cannot open /dev/cpu/microcode for writing errno=2 (No such file or directory)
ドライバーのマイクロコードをロードする必要があります。
6, ドライバーのマイクロコードを読み込みます
modprobe microcode
7, マイクロコードをもう一度更新してみてください
microcode_ctl -u
出力が表示される場合
microcode_ctl: writing microcode (length: 2370560)
microcode_ctl: microcode successfully written to /dev/cpu/microcode
更新は成功です。
8, バージョンを確認してください:
cat /proc/cpuinfo | grep microcode
microcode : 17
microcode : 17
microcode : 17
microcode : 17