制作带有额外模块且经过 MOK 签名的 GRUB

制作带有额外模块且经过 MOK 签名的 GRUB

我遇到了局域网唤醒的情况,我想让 GRUB 发出网络请求来决定“我应该启动 Windows 吗?”,也许是通过load_env (http,192.168.1.123)/grubenv(这样我就可以在唤醒机器之前写入该文件)。不幸的是,默认的 Ubuntu 签名 GRUB 缺少诸如http和 之类的模块tftp,并且在启用安全启动的情况下,它将拒绝从磁盘加载它们。

因此,我认为注册 MOK 并签署独立版本的 GRUB 是一个解决方案,但我收到了一个蓝色的文本模式对话框,我相信它来自 shim,上面写着:

验证失败:(0x1A)安全违规

随后出现了“Shim UEFI 密钥管理”对话框,我可以通过该对话框注册哈希值,但奇怪的是,这样做之后,我在下次启动时仍然得到相同的结果,并且所呈现的哈希值与 grubx64.efi 或中的任何其他文件的grubx64.efi直接值不匹配。sha256sum/boot/efi

我的 MOK 有“X509v3 扩展密钥用法:代码签名,1.3.6.1.4.1.311.10.3.6”,即才不是具有与发行版生成的 ID 类似的“1.3.6.1.4.1.2312.16.1.2”ID,这会将其限制为内核模块签名。

这是我所做的:

# cat >grub-initial.cfg <<EOF
search.fs_uuid [……/boot uuid……] root
set prefix=($root)/grub
configfile $prefix/grub.cfg
EOF

# MODULES="tpm part_gpt lvm ext2 fat chain linux efifwsetup \
  efi_uga efi_gop efinet configfile normal gzio gfxterm ls cat \
  test echo http gfxterm_background png gfxterm_menu gfxmenu \
  sleep videoinfo gettext loadenv search luks password_pbkdf2 \
  extcmd terminal play linuxefi search_fs_uuid search_label \
  search_fs_file regexp reboot halt memdisk lsefi"

# grub-mkstandalone --compress=xz -O x86_64-efi -o grubx64.unsigned \
  --install-modules="$MODULES" --modules="$MODULES" --themes="" \
  --locales="en@quot" boot/grub/grub.cfg=grub-initial.cfg

# sbsign --key /etc/keys/MOK.priv --cert /etc/keys/MOK.pem \
  --output grubx64.efi grubx64.unsigned

# mokutil --test-key /etc/keys/MOK.der
/etc/keys/MOK.der is already enrolled

# sbverify --cert /etc/keys/MOK.pem /boot/efi/EFI/bifrost/grubx64.efi
Signature verification OK

# mkdir /boot/efi/EFI/bifrost
# cp grubx64.efi /boot/efi/EFI/bifrost/
# cp /boot/efi/EFI/ubuntu/{shimx64.efi,mmx64.efi} /boot/efi/EFI/bifrost/

# efibootmgr -c -d /dev/nvme0n1p1 -L "bifrost auto select" -l "\EFI\bifrost\shimx64.efi"

# efibootmgr -v
[…]
Boot0001* bifrost auto select   HD(1,GPT,[……ESP uuid……],0x800,0x82000)/File(\EFI\BIFROST\SHIMX64.EFI)
Boot0002* ubuntu    HD(1,GPT,[……ESP uuid……],0x800,0x82000)/File(\EFI\UBUNTU\SHIMX64.EFI)..BO
[…]

...然后重新启动并手动选择新的启动项,现在。

我认为正在发生的情况是:

  • 启动原装 GRUB 时:Boot0002-> Ubuntu shim -> Ubuntu GRUB -> Linux 或 Windows
  • 启动本地 GRUB 时:Boot0001-> Ubuntu shim 的副本 -> 拒绝我的 GRUB,但我不知道为什么

可能的理论:

  • 我正在以某种方式在某处启动其他垫片?
  • 复制的 Ubuntu shim 是否正在尝试启动除grubx64.efi其旁边的其他程序?
  • 复制的 Ubuntu shim 是否以某种方式期望与所mokutil查看的密钥不同?
  • ...或者,最有可能的是,我误解了某件事。

答案1

事实证明我需要添加SBAT(安全启动高级目标)这基本上是一种版本信息,以便可以更有效地撤销易受攻击的软件上的签名。如上所述在 Arch wiki 上,shim 版本 15.3 及以上版本将无法启动没有有效.sbat部分的 EFI 二进制文件。grub-mkstandalone我上面使用的两者grub-mkimage都有一个添加它的选项:

--sbat some-sbat-file.csv

上面的第一个链接包含几个示例 SBAT CSV 文件。我认为最好使用我使用的 Ubuntu GRUB 包中的信息,该包没有将此信息打包为单独的文件,但可以提取:

objcopy -O binary --only-section=.sbat grubx64.efi /dev/stdout
sbat,1,SBAT Version,sbat,1,https://github.com/rhboot/shim/blob/main/SBAT.md
grub,3,Free Software Foundation,grub,2.06,https://www.gnu.org/software/grub/
grub.ubuntu,1,Ubuntu,grub2,2.06-2ubuntu14.1,https://www.ubuntu.com/

相关内容