linux - 无法签署模块 (vboxdrv)

标签 linux ubuntu virtualbox signing ubuntu-16.04

由于我在 Ubuntu 16.04 上启用了安全启动,因此我需要签署 vboxdrv。

我使用以下方法创建签名 key :

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

然后我签署模块:

sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxdrv)

但是,当我打电话时:

modinfo vboxdrv

模块未确认签名:

$ modinfo vboxdrv filename: /lib/modules/4.4.0-22-generic/updates/dkms/vboxdrv.ko version: 5.0.18_Ubuntu (0x00240000) license: GPL description: Oracle VM VirtualBox Support Driver author: Oracle Corporation srcversion: 316C2AE8082B5DFBAABE7EA depends:<br/> vermagic: 4.4.0-22-generic SMP mod_unload modversions parm: force_async_tsc:force the asynchronous TSC mode (int)

然后我运行:

sudo mokutil --import MOK.der

然后重新启动,这会提示我导入计算机所有者 key 。

但是,这会失败(参数 (2) 无效)。

我认为这是由于模块没有提前签名,因为运行 modinfo vboxdrv 应该确认该模块已签名。

最佳答案

这是由于 Lenovo 固件不支持 EFI_VARIABLE_APPEND_WRITE。一位 shim 开发人员已经重写了 MokManager.efi 以在受影响的 Lenovo 机器上工作,尽管尚不清楚需要多长时间才能将其合并并由 Ubuntu 向下游拉动。您可以在 shim 的 github 问题跟踪器 here 上关注该问题。 .

如果你等不及了(被指控有罪),你可以编译 shim 并自行测试。

如果您没有 gitgnu-efilibnss3-toolspesign,您'需要先安装它们(有关设置 EFI 开发环境的更多信息可以在 here 找到,我正在使用相当新的 Ubuntu 16.04 安装,但可能我已经安装了所需的其他库/工具并忘记了关于它们——只需在编译时查找错误并根据需要安装任何缺少的软件包):

sudo apt-get install git gnu-efi libnss3-tools pesign

接下来,使用补丁克隆 git 存储库的分支:

cd /src
git clone -b fix-lenovo-write https://github.com/lcp/shim.git
cd shim

接下来您需要修改 Makefile(shim 开发人员不使用 Ubuntu)

gedit Makefile

进行以下更改(归功于此post):

-OBJCOPY_GTE224  = $(shell expr `$(OBJCOPY) --version |grep ^"GNU objcopy" | sed 's/^.version //g' | cut -f1-2 -d.` \>= 2.24)
+#OBJCOPY_GTE224  = $(shell expr `$(OBJCOPY) --version |grep ^"GNU objcopy" | sed 's/^.version //g' | cut -f1-2 -d.` \>= 2.24)
+OBJCOPY_GTE224  = 1

-LIB_PATH       = /usr/lib64
+LIB_PATH       = /usr/lib

-EFI_PATH       := /usr/lib64/gnuefi
+EFI_PATH       := /usr/lib

接下来您需要注释掉 shim.c 中未使用的变量:

gedit shim.c

在第 1118 行进行以下更改:

@@ -1118,7 +1118,7 @@ static EFI_STATUS handle_image (void *data, unsigned int datasize,
        EFI_STATUS efi_status;
        char *buffer;
        int i;
-       unsigned int size;
+       //unsigned int size;
        EFI_IMAGE_SECTION_HEADER *Section;
        char *base, *end;
        PE_COFF_LOADER_IMAGE_CONTEXT context;

编译垫片:

make

暂时关闭安全启动:

sudo mokutil --disable-validation

设置密码,重新启动,然后按照说明禁用安全启动(密码很棘手,它要求您输入密码中的某些字符而不是整个内容)。

备份 MokManager.efi 并仔细检查它是否已备份:

sudo mv /boot/efi/EFI/ubuntu/MokManager.efi /boot/efi/EFI/ubuntu/MokManager.efi.bak
sudo ls /boot/efi/EFI/ubuntu/

将 MokManager 的修补版本移至 EFI 分区。

sudo mv ./MokManager.efi.signed /boot/efi/EFI/ubuntu/MokManager.efi

注册您的 key (根据您的 key 所在位置及其名称进行必要的修改):

sudo mokutil --import MOK.der

设置密码,重新启动并按照说明注册 MOK。现在应该可以在联想机器上成功了。

恢复到 MokManager 的原始版本并启用安全启动:

sudo mv /boot/efi/EFI/ubuntu/MokManager.efi ./MokManager.efi.signed
sudo mv /boot/efi/EFI/ubuntu/MokManager.efi.bak /boot/efi/EFI/ubuntu/MokManager.efi
sudo mokutil --enable-validation

设置密码,重新启动,按照说明操作。

签署您的模块,使用 modprobe 加载它们并享受!

注意:希望这将很快在大多数发行版的存储库中得到正式修补。对于那些非常不耐烦的人来说,这个答案是一个选择,他们愿意从源代码构建补丁并对其进行测试。它可以在我的机器(Lenovo P50)上运行,但这并不意味着它适用于所有人。如果您不习惯从源代码构建 efi 应用程序,只需等待修补版本发布到存储库(届时我将更新此答案)。

关于linux - 无法签署模块 (vboxdrv),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37616898/

相关文章:

ubuntu - Selenium 独立服务器不会启动 Firefox,除非在交互模式下(Ubuntu、PHP、Selenium 和 php-webdriver-bindings-0.9.0)

debugging - 如何在 Virtualbox GUI 工具中启动 Debug模式?

regex - 如何为多个目录创建 htaccess 重定向

c - 使用 GCC 编译漏洞时遇到问题

mysql - 无法在 Ubuntu 14.2 上安装 mysql

c - Makefile 适用于 OS X 但不适用于 Ubuntu

linux - 尝试安装 virtualbox-5.1 时出错

c - 带有VirtualBox的虚拟机查找并执行本地C文件

linux - 在 ALSA 中配置 softvol

使用 main() 创建共享库