Безголовый стенд на QEMU/OVMF, который выполняет PXE-загрузку и отправляет ICMP-ошибки увеличенного размера для воспроизведения переполнения буфера в EDK II PxeBcSupport (CVE-2026-97631) в локальной лаборатории.
⚠️ ТОЛЬКО ЛОКАЛЬНАЯ ЛАБОРАТОРИЯ. Эти инструменты запускают локальную ВМ QEMU с прошивкой, которую вы контролируете. Никогда не направляйте генератор ICMP на оборудование или сети, которыми вы не владеете.
CVE-2026-97631: 16-летнее переполнение буфера в TianoCore EDK II
(NetworkPkg/UefiPxeBcDxe/PxeBcSupport.c) — слишком большое сообщение об ошибке ICMP
во время сетевой загрузки PXE копируется за пределы 504-байтовой структуры EFI_PXE_BASE_CODE_ICMP_ERROR,
повреждая память прошивки в ring 0, до загрузки Secure Boot и TPM.
Исправлено в PR #13200 /
#13302; освещение раскрытия:
Ars Technica.
Три небольших компонента, использующих только стандартную библиотеку, которые проводят headless-ВМ OVMF/QEMU от холодной загрузки до попытки загрузки по PXE — с DHCP-сервером и ICMP-атакой в сети:
| файл | роль |
|---|---|
bridge.py | минимальный DHCP-сервер в сети QEMU (DISCOVER→OFFER→REQUEST→ACK, ожидание TFTP RRQ), затем запускает атаку: 6× ошибок ICMP type-3 code-1, цитирующих 1200-байтовый поддельный датаграмм в 504-байтовую структуру. --attack вкл/выкл. |
router.py | маршрутизатор по состоянию экрана: классифицирует экран OVMF по статистике пикселей screendump (чёрный = UEFI Shell, синий = главная страница / Boot Manager) и управляет интерфейсом через монитор QEMU (sendkey), пока не запустится опция загрузки 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/атаки). На протестированных нами сборках OVMF, поставляемых с QEMU (IA32 и X64, q35 и i440fx, TCG), прошивка отображает баннер PXE и затем не передаёт ни одного пакета — DHCP Discover так и не покидает прошивку, поэтому ICMP-триггер никогда не достигает уязвимого обработчика. Для дальнейшего продвижения нужна сборка OVMF с последовательной отладкой или реальное лабораторное оборудование. Стенд опубликован именно до этой границы намеренно: заявления о воспроизводимости должны заканчиваться там, где остановился запуск.
MIT. Автор @slabbdev — дополнение к записи в блоге.