Linux 无法对模块(vboxdrv)进行签名

Linux 无法对模块(vboxdrv)进行签名,linux,ubuntu,virtualbox,signing,ubuntu-16.04,Linux,Ubuntu,Virtualbox,Signing,Ubuntu 16.04,因为我在Ubuntu 16.04上启用了安全引导,所以我需要签署vboxdrv 我使用以下方法创建签名密钥: 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/sig

因为我在Ubuntu 16.04上启用了安全引导,所以我需要签署vboxdrv

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

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
文件名:/lib/modules/4.4.0-22-generic/updates/dkms/vboxdrv.ko
版本:5.0.18_Ubuntu(0x0024000)
许可证:GPL
描述:Oracle VM VirtualBox支持驱动程序
作者:甲骨文公司
SRC版本:316C2AE8082B5DFBAABE7EA
取决于:
vermagic:4.4.0-22-通用SMP模块卸载模块版本 parm:force\u async\u tsc:force异步tsc模式(int)

然后我运行:

sudo mokutil --import MOK.der
和重新启动,这会提示我导入一个计算机所有者密钥

但是,此操作失败(参数(2)无效)


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

这是由于联想固件不支持EFI\u VARIABLE\u APPEND\u WRITE。shim的一位开发者已经重写了MokManager.efi,以便在受影响的联想机器上工作,尽管尚不清楚Ubuntu需要多长时间才能将其合并并向下游推出。您可以在shim的github问题跟踪器上跟踪问题

如果您不能等待(指控有罪),您可以编译shim并自己测试它

如果您没有
git
gnuefi
libnss3工具
pesign
,则需要先安装它们(关于设置EFI开发环境的更多信息,可以找到,我正在使用一个全新的Ubuntu 16.04安装,但我可能已经安装了所需的其他库/工具,并且忘记了它们——只需在编译时查找错误,必要时安装任何缺失的包即可):

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

cd /src
git clone -b fix-lenovo-write https://github.com/lcp/shim.git
cd shim
接下来,您需要修改Makefile(shim开发人员不使用Ubuntu)

进行以下更改(计入此项):

接下来,您需要注释掉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
注册密钥(根据密钥的位置和名称进行必要的修改):

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

恢复到MokManager和renable secure boot的原始版本:

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加载它们,然后尽情享受吧


注意:希望这将很快在大多数发行版的回购协议中得到正式修补。对于非常不耐烦的人来说,这个答案是一个选择,他们乐于从源代码构建修补程序并进行测试。它在我的机器上运行(联想P50)但这并不意味着它适用于所有人。如果您对从源代码构建efi应用程序感到不舒服,只需等待修补后的版本到达repos(此时我将更新此答案).

我在这里针对
mokutil
提出了一个bug:在这里针对
shim
这已经被一个shim开发人员修补过了(我测试了它,它工作了)。我相应地更新了我的答案。也许我发布的答案可以帮助解决这个问题。PPA修复了吗?
sudo mv /boot/efi/EFI/ubuntu/MokManager.efi /boot/efi/EFI/ubuntu/MokManager.efi.bak
sudo ls /boot/efi/EFI/ubuntu/
sudo mv ./MokManager.efi.signed /boot/efi/EFI/ubuntu/MokManager.efi
sudo mokutil --import MOK.der
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