VirtualBox & VMware Kernelmodule mit UEFI Secure Boot

  Lioh Möller   Lesezeit: 4 Minuten  🗪 6 Kommentare

Wer VirtualBox oder VMware auf einem UEFI System mit aktiviertem Secure Boot nutzt, muss nach Updates die Kernelmodule selbst signieren. Mit dieser Anleitung wird dies zum Kinderspiel.

virtualbox & vmware kernelmodule mit uefi secure boot

Wer ein UEFI System mit Secure Boot nutzt und die passenden Kernelmodule für VMware Workstation/Player oder Virtualbox selbst compiliert, muss diese signieren, damit sie erfolgreich geladen werden können. Dabei ist insbesondere VMware dafür bekannt, aktuelle Kernelversionen nicht zeitnah zu unterstützen, wobei der Entwickler Michal Kubeček Patches bereitstellt.

Nach einer erfolgreichen Übersetzung der Module muss zunächst einmalig ein Schlüsselpaar erstellt werden:

openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=VMware/"

Der CN (Common Name), kann bei der Verwendung von VirtualBox angepasst werden, zum Beispiel auf VirtualBox oder den Benutzernamen (Beispiel: "/CN=Maria Mustermann/")

Daraufhin können die Kernelmodule signiert werden. Bei VMware erfolgt dies mithilfe der folgenden Befehle:

sudo /lib/modules/`uname -r`/build/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vmmon)
sudo /lib/modules/`uname -r`/build/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vmnet)

Sollte VirtualBox bis zur Version 6.1.40 bzw. 7.0 zum Einsatz kommen, würde der Befehl wie folgt aussehen:

sudo /lib/modules/`uname -r`/build/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxdrv)

Bei aktuellen VirtualBox Versionen werden die Module automatisch signiert, wenn der Schlüssel im Verzeichnis /var/lib/shim-signed/mok liegt.

sudo mkdir -p /var/lib/shim-signed/mok
sudo mv MOK.* /var/lib/shim-signed/mok

UEFI enrollment

Mithilfe von der Applikation mokutil lässt sich der öffentliche Schlüssel zum UEFI BIOS hinzufügen. Installieren lässt sich die Anwendung unter Debian GNU/Linux mithilfe des folgenden Befehls:

sudo apt install mokutil

Der eigentliche Import kann daraufhin wie folgt durchgeführt werden:

mokutil --import MOK.der

Nach einem Neustart des Systems muss der Schlüssel über den integrierten UEFI enrollment Prozess importiert werden.

Dabei muss das zuvor vergebene Schlüsselpasswort eingegeben werden. Da das US-Keyboard Layout zum Einsatz kommt, sollte man ein entsprechend zu merkendes Passwort wählen.

Nach diesen Vorbereitungsarbeiten, muss in Zukunft nach jedem neuen Übersetzen der Kernelmodule ein signieren eben dieser erfolgen. Dies lässt sich auch mithilfe eines Scriptes vereinfachen.

VMware

#!/bin/sh
# filename: signModules.sh
# cd to where you store the MOK.priv MOK.der certs
# run this as root e.g. sudo sh ./signModules.sh
for i in vmmon vmnet
do
    echo Signing $i
    sudo /lib/modules/`uname -r`/build/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n $i)
done

VirtualBox < Version 6.1.40 bzw. < 7.0 (Bei aktuellen VirtualBox Versionen ist dieser Schritt nicht notwendig)

#!/bin/sh
# filename: signModules.sh
# cd to where you store the MOK.priv MOK.der certs
# run this as root e.g. sudo sh ./signModules.sh
for i in vboxdrv
do
    echo Signing $i
    sudo /lib/modules/`uname -r`/build/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n $i)
done

Quellen: https://kb.vmware.com/s/article/2146460, https://toggen.com.au/it-tips/vmware-workstation-pro-on-secure-boot-ubuntu/

Danke an Norman und Thorsten für die wertvollen Hinweise in den Kommentaren.

Tags

VirtualBox, VMware, UEFI, SecureBoot

Norman
Geschrieben von Norman am 11. Januar 2023 um 12:15

Hallo, die für VirtualBox beschriebene Methode funktioniert nur bei einer VirtualBox-Version kleiner 6.1.40 bzw. kleiner 7.0.0. Ab diesen Versionen werden die Module automatisch signiert, wenn der Schlüssel im

richtigen Verzeichnis liegt. Die Befehle dazu lauten:

$ sudo mkdir -p /var/lib/shim-signed/mok $ sudo mv MOK.* /var/lib/shim-signed/mok

Somit kann Signieren nach dem Bauen und das Skript signModules.sh entfallen.

Lioh
Geschrieben von Lioh am 11. Januar 2023 um 12:18

Toll, danke für den Hinweis!

Norman
Geschrieben von Norman am 11. Januar 2023 um 12:21

Bitte. Ich bin auch nur darüber "gestolpert", weil mein Signier-Skript ab einem bestimmten Update nicht mehr funktionierte...

Thorsten
Geschrieben von Thorsten am 11. Januar 2023 um 13:44

Der Pfad "/usr/src/linux-headers-uname -r/..." funktioniert nur unter bestimmten Distributionen (u.a. Debian, Ubuntu). In einer idealen Welt sollte "/lib/modules/uname -r/build/..." überall tun, aber bin mir nicht ganz sicher, ob das wirklich der Fall ist.

Lioh
Geschrieben von Lioh am 11. Januar 2023 um 14:00

Hoi Thorsen.

Vielen Dank für die Ergänzungen.

Lioh
Geschrieben von Lioh am 11. Januar 2023 um 15:57

Ich habe den Artikel entsprechend eurer Kommentare ergänzt und umgeschrieben. Vielen Dank nochmals.