返回

文章详情

UEFI HTTPS 启动简介与 QEMU/OVMF

Hacker News2026年6月12日 14:50

网络启动的历史首选方案是 PXE。PXE 基于 DHCP 和 TFTP。正确配置它有点棘手,要使其高度可用更是困难,而这个明文且未签名的协议的安全性更是不容乐观。现代网络早已用 TLS 证书在 HTTPS 上达成共识,以确保服务器认证、完整性和机密性。此外,当谈到 HTTPS 时,高可用的设置已经是一个解决好的问题。更棒的是,数据加密层使得通过互联网启动变得实际可行,而无需立即面对 TFTP 简陋协议可能存在的中间人攻击(请记住,TFTP 的 t 代表“简单”,而不是“安全”)。好消息是,大多数现代基于 UEFI 的系统支持通过 HTTP(S) 启动。在这篇文章中,我们将直接从官方网站启动 netboot.xyz 的 snponly 变体。准备好享受与 HTTPS 的乐趣。除非另有说明,所有这些测试均在 Ubuntu 26.04 上进行,使用的是提供的 1:10.2.1+ds-1ubuntu3 的 QEMU 和 2025.11-3ubuntu7 的 OVMF 软件包。请注意,由于后文将解释的原因,旧版本可能工作得更好 🙃。从简单的案例开始:通过 DHCP 发现 HTTP 启动(理所当然地)怀疑 HTTPS 变体可能难以对抗,我开始了这个经过绕过证书信任及其他问题的测试之旅。启动固件的 URL 是:http://boot.netboot.xyz/ipxe/netboot.xyz-snponly.efi。这里的目的是演示一个最小化的设置,使其更易于集成到您自己的环境中。我们将使用一个非根 QEMU 机器,具有基于用户空间的 SLIRP 网络,而不使用额外设备,例如存储。整个系统将在内存中运行。让我们以以下内容开始第一次迭代:OVMF 固件,未启用安全启动以保持简单;一个将模拟 DHCP 服务器并指向 UEFI 到 HTTP 启动目标的网络卡;控制台输出:1 qemu-system-x86_64 \ 2 -drive if=pflash,format=raw,readonly=on,file=/usr/share/OVMF/OVMF_CODE_4M.fd \ 3 -nic user,bootfile=http://boot.netboot.xyz/ipxe/netboot.xyz-snponly.efi \ 4 -nographic。这很有希望,但它未能通过网络启动:1 BdsDxe: 找不到可启动选项或设备。2 BdsDxe: 按任意键进入启动管理菜单。这是因为 OVMF 中的网络栈需要随机数生成器设备才能正常工作。仔细想想,这几乎是显而易见的。网络栈的每一层几乎都需要随机性,从以太网碰撞避免到 TLS,再到 DHCP 本身。这可以通过在 QEMU 命令行中添加以下标志来非常轻松地启用:1 -device virtio-rng-pci。任何其他提供随机数生成器的配置更改也同样有效。例如,可以启用 KVM 并使用 -cpu host,这样可以访问 CPU 的随机数生成指令。虽然这看起来有些显而易见,但由于缺乏错误日志,这个问题相当难以排除。在这种情况下,我通过询问 Claude 的免费版得到了帮助。我想知道人们如何能够通过归纳/演绎推理来找出这一点,而不是用一个(非常有帮助的)LLM 进行暴力破解。结果发现,这个依赖项在 NetworkPkg/Library/DxeNetLib/DxeNetLib.inf 的 [Depex] 部分中声明:1 [Depex] 2 gEfiRngProtocolGuid。在底层,这将 EFI 随机数生成协议的 GUID 推送到依赖关系堆栈上,因此任何引用 DxeNetLib 的 EFI 软件包在分派程序在运行时评估依赖关系时将隐式地需要它。作为未来参考(为了我自己),可以通过在 OvmfPkg/OvmfPkgX64.dsc 中启用 gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel 的“DEBUG_DISPATCH”标志来在运行时从调试日志中找出依赖关系。准备好进入一个基于 GUID 的调试世界吧!(如果您对暴力破解方法感到沮丧,而更愿意看到基于日志的方法,请继续关注 HTTPS 部分。)有了这个,轰隆隆的声音!1 >> 通过 IPv4 启动 PXE。2 站点 IP 地址是 10.0.2.15。3 4 服务器 IP 地址是 10.0.2.2。5 NBP 文件名是 http://boot.netboot.xyz/ipxe/netboot.xyz-snponly.efi。6 NBP 文件大小是 0 字节。7 PXE - E23: 客户端从服务器接收 TFTP 错误。8 BdsDxe: 无法从 PciRoot(0x0)/Pci(0x3, 0x0)/MAC(525400123456, 0x1)/IPv4(0.0.0.0, 0x0,DHCP, 0.0.0.0, 0.0.0.0, 0.0.0.0): 找不到 Boot0002 "UEFI PXEv4 (MAC:525400123456)"。9 10 >> 通过 IPv6 启动 PXE。11 PXE - E16: 未收到有效的报价。12 BdsDxe: 无法从 PciRoot(0x0)/Pci(0x3, 0x0)/MAC(525400123456, 0x1)/IPv6(0000:0000:0000:0000:0000:0000:0000:0000, 0x0,Static, 0000:0000:0000:0000:0000:0000:0000:0000, 0x40, 0000:0000:0000:0000:0000:0000:0000:0000): 找不到 Boot0003 "UEFI PXEv6 (MAC:525400123456)"。13 14 >> 通过 IPv4 启动 HTTP ...

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡