Intel Microcode unter Linux aktualisieren

Aus Thomas-Krenn-Wiki
Zur Navigation springen Zur Suche springen

Zahlreiche Linux Distributionen installieren standardmäßig bereits den Intel Microcode Update Treiber. Dadurch werden während des Startvorgangs automatisch neue Intel Microcode Versionen (die über die Linux Distribution bereit gestellt werden) eingespielt. In diesem Artikel zeigen wir anhand eines Servers mit Ubuntu 18.04.1 wie Sie die Microcode Version überprüfen können und bei Bedarf noch neuere Microcode Versionen einspielen (welche bereits von Intel, jedoch noch nicht von der Linux Distribution bereitgestellt werden).

Beispielsetup

In diesem Beispiel verwenden wir folgendes Setup:

Das Beispiel wurde am 23.08.2018 mit dem zu diesem Zeitpunkt aktuellsten verfügbaren BIOS-, Microcode- und Software-Versionen durchgeführt. Es zeigt damit anschaulich wie in sicherheitskritischen Umgebungen die neuesten Sicherheitsupdates sowohl in Bezug auf den Microcode, als auch in Bezug auf Software-Updates eingespielt werden können.

BIOS Version auslesen

Zuerst überprüfen wir das vorhandene Mainboard und die BIOS Version:

tk@p10s-m:~$ sudo dmidecode -t Baseboard | grep -E 'Manufacturer|Product|Version'
        Manufacturer: ASUSTeK COMPUTER INC.
        Product Name: P10S-M Series
        Version: Rev 1.xx
tk@p10s-m:~$ sudo dmidecode -t BIOS | grep -E 'Version|Date'
        Version: 4401
        Release Date: 03/05/2018

Falls es sich um ein System von Thomas-Krenn handelt, ist die neuste BIOS Version für das Mainboard im Artikel BIOS Sicherheitsupdates zu finden. In diesem Beispiel ist bereits die aktuellste verfügbare BIOS-Version vorhanden.

Aktuelle Microcode Version auslesen

Intel führt im Microcode Update Guidance vom 08.08.2018 (siehe Intel Microcode - Microcode Versionen) die neue Microcode Version 0x8E für den hier im Beispiel verwendeten Xeon E3-1220 v6 Prozessor an.

Die aktuell vorhandene Microcode Version kann über die virtuelle Datei /proc/cpuinfo ausgelesen werden. Diese enthält unter anderem Informationen zu Family/Model/Stepping sowie zur aktuell verwendeten Microcode Version der verwendeten CPU(s):

tk@p10s-m:~$ grep -E 'family|model|stepping|microcode' /proc/cpuinfo | head -5
cpu family      : 6
model           : 158
model name      : Intel(R) Xeon(R) CPU E3-1220 v6 @ 3.00GHz
stepping        : 9
microcode       : 0x84

In diesem Beispiel ist aktuell die Microcode Version 0x84 vorhanden.

Intel stellt Informationen zu verfügbaren Microcode Versionen im Dokument Microcode Update Guidance bereit (siehe Intel Microcode - Microcode Versionen). In diesem Dokument werden CPUs anhand ihrer CPUID angeführt (nicht anhand von Familiy/Model/Stepping). Die CPUID lässt sich auf folgende Art anhand von Familiy/Model/Stepping bestimmen:

  1. Notieren Sie Family/Model/Stepping im Hex-Format. Die Datei /proc/cpuinfo gibt die Werte im Dezimal-Format aus:
    • Family: 6 -> 0x6
    • Model: 158 -> 0x9e
    • Stepping: 9 -> 0x9
  2. Die CPUID hat den Aufbau 0FFM0FMS. Gehen Sie nun von hinten nach vorne, um die CPUID aus Family/Model/Stepping zu bestimmen:
  3. S (Stepping) = 9
  4. M (hintere Ziffer von Model) davor: e9
  5. F (Family) davor = 6e9
  6. Die Ziffer 0 davor = 06e9
  7. Model (vorletzte Ziffer von Model) davor = 906e9

Bei einer Suche nach 906e9 im Dokument Microcode Update Guidance vom 08.08.2018 ist in der Spalte New Production MCU Rev die Microcode Version 0x8E angeführt. Intel stellt also in diesem Fall eine neuere Microcode Version bereit, als sie aktuell am Beispielsystem vorhanden ist.

Microcode Update Version der Distribution

Zahlreiche Distributionen installieren standardmäßig bereits den Intel Microcode Update Treiber. Ob dieser beim Startvorgang den Microcode aktualisiert hat, lässt sich mit dem dmesg Kommando überprüfen. In diesem Beispiel hat der Treiber keinen neueren Microcode eingespielt - die Version 0x84 wurde daher bereits durch die verwendete BIOS-Version 4401 eingespielt:

tk@p10s-m:~$ dmesg | grep -i microcode
[    1.487040] microcode: sig=0x906e9, pf=0x2, revision=0x84
[    1.492402] microcode: Microcode Update Driver: v2.2.

Über das dpkg Kommando kann die Version des Pakets intel-microcode abgefragt werden. In diesem Fall stammen die Intel Microcodes, die von Ubuntu bereitgestellt werden, vom 25.04.2018 (Version 20180524):

tk@p10s-m:~$ dpkg -s intel-microcode | grep Version
Version: 3.20180425.1~ubuntu0.18.04.2

Ob neuere Versionen von der Distribution bereitgestellt werden, kann über das apt-cache Kommando überprüft werden:

tk@p10s-m:~$ sudo apt update
tk@p10s-m:~$ apt-cache show intel-microcode | grep Version
Version: 3.20180425.1~ubuntu0.18.04.2
Version: 3.20180425.1~ubuntu0.18.04.1
Version: 3.20180312.0~ubuntu18.04.1

In diesem Fall ist also bereits die aktuellste Paketversion installiert.

Microcode von Intel einspielen

Intel stellt mit der Microcode Version 20180807 für die hier im Beispiel verwendete CPU die neuere Microcode Version 0x8e bereit, wie der Auszug aus den Changelogs zeigt:[1]

  • KBL-H/S/E3 B0 6-9e-9/2a 00000084->0000008e Core Gen7; Xeon E3 v6

Hinweis: In der Regel stellen die Linux Distributionen sehr zeitnah aktualisierte Microcode-Pakete bereit. Im hier gezeigten Beispiel führten neue Lizenz-Bedingungen dazu, dass Debian und Ubuntu den neuen Microcode nicht verteilen konnten.[2] Die Lizenz wurde daraufhin von Intel erneut angepasst, um eine Verteilung wieder zu ermöglichen.[3][4] Die folgenden gezeigten Schritte sollten also nur in seltenen Fällen erforderlich sein. Wenn die neueste Microcode Version von der Linux Distribution bereitgestellt wird, sind diese manuellen Schritte nicht erforderlich.

Der neuere Microcode von Intel kann wie folgt manuell eingespielt werden:

tk@p10s-m:~$ wget https://downloadmirror.intel.com/28039/eng/microcode-20180807.tgz
tk@p10s-m:~$ tar xzf microcode-20180807.tgz
tk@p10s-m:~$ diff intel-ucode/06-9e-09 /lib/firmware/intel-ucode/06-9e-09
Binary files intel-ucode/06-9e-09 and /lib/firmware/intel-ucode/06-9e-09 differ
tk@p10s-m:~$ cp -a /lib/firmware/intel-ucode/ intel-ucode.distro
tk@p10s-m:~$ sudo cp intel-ucode/06-9e-09 /lib/firmware/intel-ucode/
tk@p10s-m:~$ grep -i microcode /proc/cpuinfo | sort | uniq
microcode       : 0x84
tk@p10s-m:~$ echo 1 | sudo tee /sys/devices/system/cpu/microcode/reload
1
tk@p10s-m:~$ grep -i microcode /proc/cpuinfo | sort | uniq
microcode       : 0x8e

Damit bei einem Neustart dieser neue Microcode geladen wird, muss die Initial Ramdisk neu erstellt werden:

tk@p10s-m:~$ sudo update-initramfs -u
update-initramfs: Generating /boot/initrd.img-4.15.0-32-generic
W: Possible missing firmware /lib/firmware/ast_dp501_fw.bin for module ast

Nach einem Reboot zeigt die Ausgabe von dmesg, dass der Microcode Update Treiber beim Starten die neue Microcode Version automatisch lädt:

tk@p10s-m:~$ sudo reboot
[...]
tk@p10s-m:~$ dmesg | grep -i microcode
[    0.000000] microcode: microcode updated early to revision 0x8e, date = 2018-03-24
[    1.488165] microcode: sig=0x906e9, pf=0x2, revision=0x8e
[    1.493567] microcode: Microcode Update Driver: v2.2.

Einzelnachweise


Foto Werner Fischer.jpg

Autor: Werner Fischer

Werner Fischer arbeitet im Product Management Team von Thomas-Krenn. Er evaluiert dabei neueste Technologien und teilt sein Wissen in Fachartikeln, bei Konferenzen und im Thomas-Krenn Wiki. Bereits 2005 - ein Jahr nach seinem Abschluss des Studiums zu Computer- und Mediensicherheit an der FH Hagenberg - heuerte er beim bayerischen Server-Hersteller an. Als Öffi-Fan nutzt er gerne Bus & Bahn und genießt seinen morgendlichen Spaziergang ins Büro.


Foto Thomas Niedermeier.jpg

Autor: Thomas Niedermeier

Thomas Niedermeier arbeitet im Product Management Team von Thomas-Krenn. Er absolvierte an der Hochschule Deggendorf sein Studium zum Bachelor Wirtschaftsinformatik. Seit 2013 ist Thomas bei Thomas-Krenn beschäftigt und kümmert sich unter anderem um OPNsense Firewalls, das Thomas-Krenn-Wiki und Firmware Sicherheitsupdates.

Icon-Twitter.png 

Das könnte Sie auch interessieren

Intel Mikroarchitekturen
Sicherheitshinweise zu Intel Produkten 2020-11-10 2020.2 IPU
Sicherheitshinweise zu Intel Produkten 2022-11-08 2022.3 IPU