⚠️ 仅限本地实验环境。 这些工具驱动的是本地 QEMU 虚拟机,针对你自行掌控的固件。切勿将 ICMP 生成器指向你不拥有的硬件或网络。
CVE-2026-97631:TianoCore EDK II 中一个存在了 16 年的缓冲区溢出漏洞(NetworkPkg/UefiPxeBcDxe/PxeBcSupport.c)——在 PXE 网络启动期间,一条超大的 ICMP 错误消息会越过 504 字节的 EFI_PXE_BASE_CODE_ICMP_ERROR 结构体进行复制,从而在 ring 0 中破坏固件内存,且发生在 Secure Boot 和 TPM 加载之前。该漏洞已由 PR #13200 / #13302 修复;相关披露报道:Ars Technica。
三个仅依赖标准库的小型组件,可将一台无头 OVMF/QEMU 虚拟机从冷启动推进到 PXE 启动尝试——同时在线路上运行 DHCP 服务器并实施 ICMP 攻击:
| 文件 | 作用 |
|---|---|
bridge.py | 在 QEMU 线路上运行的最小 DHCP 服务器(DISCOVER→OFFER→REQUEST→ACK,等待 TFTP RRQ),随后发起攻击:发送 6 条 ICMP type-3 code-1 错误消息,其中引用一个 1200 字节的伪造数据报,将其写入 504 字节的结构体。--attack 用于开启/关闭。 |
router.py | 屏幕状态路由器:根据 screendump 的像素统计对 OVMF 屏幕进行分类(黑色 = UEFI Shell,蓝色 = 首页 / 启动管理器),并通过 QEMU monitor(sendkey)驱动 UI,直到 PXE 启动选项被执行。 |
drive.py | 早期逐步键盘驱动程序,带有 PPM 高亮条检测(保留以供参考)。 |
运行方式:
# VM: OVMF pflash, virtio-net on a UDP socket netdev (no mcast flakiness),
# pcap wire tap + CPU-reset logging:
qemu-system-x86_64 -machine q35 -m 512 -display none \
-drive if=pflash,format=raw,readonly=on,file=$FW-code.fd \
-drive if=pflash,format=raw,file=$FW-vars.fd \
-netdev socket,id=n0,udp=127.0.0.1:5555,localaddr=127.0.0.1:6666 \
-device virtio-net-pci,netdev=n0,bootindex=0 \
-object filter-dump,id=f1,netdev=n0,file=dump.pcap \
-monitor unix:qmon.sock,server,nowait -serial none -d cpu_reset -D resets.log &
python3 bridge.py --attack & # DHCP + ICMP overflow trigger
python3 router.py qmon.sock run.log # navigate headlessly to UEFI PXE IPv4
tcpdump -r dump.pcpa # wire truth
grep -c "CPU Reset" resets.log # crash signal (baseline: 2 on clean boot)
直到 PXE 启动尝试之前的所有环节均可复现(屏幕状态路由、线路抓包、DHCP/攻击引擎已就绪)。在我们测试过的 QEMU 自带 OVMF 构建(IA32 和 X64、q35 和 i440fx、TCG)上,固件会显示 PXE 横幅,然后不发送任何数据包——DHCP Discover 从未离开固件,因此 ICMP 触发消息从未到达存在漏洞的处理程序。若要继续推进,需要带串口调试的 OVMF 构建或真实的实验硬件。本测试框架特意只发布到这个边界:可复现性声明必须止步于运行实际停止的位置。
MIT。作者 @slabbdev —— 博客文章的配套项目。