Intel Microcode unter Linux aktualisieren
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:
- Server mit ASUS P10S-M Mainboard mit BIOS Version 4401
- Ubuntu 18.04.1:
- Kernel Version 4.15.0-32-generic
- Microcode Paket intel-microcode von Ubuntu (Version 3.20180425.1~ubuntu0.18.04.2)
- Microcode direkt von Intel (Version 20180807)
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
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:
- 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
- Die CPUID hat den Aufbau 0FFM0FMS. Gehen Sie nun von hinten nach vorne, um die CPUID aus Family/Model/Stepping zu bestimmen:
- S (Stepping) = 9
- M (hintere Ziffer von Model) davor: e9
- F (Family) davor = 6e9
- Die Ziffer 0 davor = 06e9
- 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
- ↑ Intel Processor Microcode Package for Linux (Version: 20180807) (downloadcenter.intel.com, 07.08.2018)
- ↑ Intel untersagt Benchmarks und härtet nächste Generation (golem.de, 23.08.2018)
- ↑ Intel rips up microcode security fix license that banned benchmarking (theregister.co.uk, 23.08.2018)
- ↑ Debian Bug report logs - #906158 intel-microcode: Update intel-microcode to 20180807 (bugs.debian.org)
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.
|
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. |