Harness headless de QEMU/OVMF que executa um boot PXE e dispara erros ICMP de tamanho excessivo para reproduzir o buffer overflow do EDK II PxeBcSupport (CVE-2026-97631) em um laboratório local.
⚠️ APENAS LABORATÓRIO LOCAL. Estas ferramentas controlam uma VM QEMU local contra um firmware que você controla. Nunca aponte o gerador de ICMP para hardware ou redes que não sejam suas.
CVE-2026-97631: um buffer overflow com 16 anos no TianoCore EDK II
(NetworkPkg/UefiPxeBcDxe/PxeBcSupport.c) — uma mensagem de erro ICMP de tamanho excessivo
durante um boot de rede PXE copia além da struct EFI_PXE_BASE_CODE_ICMP_ERROR de 504 bytes, corrompendo a memória do firmware no ring 0, antes do Secure Boot e do TPM carregarem.
Corrigido pelo PR #13200 /
#13302; cobertura da divulgação:
Ars Technica.
Três pequenas peças que usam apenas a stdlib e levam uma VM OVMF/QEMU headless do boot a frio até uma tentativa de boot PXE — com um servidor DHCP e o ataque ICMP no fio:
| arquivo | função |
|---|---|
bridge.py | servidor DHCP mínimo no fio do QEMU (DISCOVER→OFFER→REQUEST→ACK, espera de RRQ TFTP), depois dispara o ataque: 6× erros ICMP tipo-3 código-1 citando um datagrama falso de 1200 bytes para dentro da struct de 504 bytes. --attack on/off. |
router.py | roteador de estado de tela: classifica a tela do OVMF a partir das estatísticas de pixels do screendump (preto = UEFI Shell, azul = página inicial / Boot Manager) e conduz a UI pelo monitor do QEMU (sendkey) até a opção de boot PXE ser executada. |
drive.py | driver de teclado passo a passo anterior, com detecção da barra de destaque via PPM (mantido como referência). |
Forma de execução:
# VM: OVMF pflash, virtio-net em um netdev de socket UDP (sem instabilidade de mcast),
# captura de pacotes pcap + registro de reset de CPU:
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 + gatilho do overflow ICMP
python3 router.py qmon.sock run.log # navega headless até UEFI PXE IPv4
tcpdump -r dump.pcpa # a verdade do fio
grep -c "CPU Reset" resets.log # sinal de crash (linha de base: 2 em boot limpo)
Tudo até a tentativa de boot PXE funciona de forma reproduzível (roteamento por estado de tela, captura de pacotes, motor DHCP/ataque armado). Nas builds OVMF empacotadas com o QEMU que testamos (IA32 e X64, q35 e i440fx, TCG), o firmware exibe o banner do PXE e então transmite zero pacotes — o DHCP Discover nunca sai do firmware, então o gatilho ICMP nunca chega ao handler vulnerável. Ir além exige uma build OVMF com depuração serial ou hardware de laboratório real. O harness é publicado até esse limite exato de propósito: alegações de reprodutibilidade devem parar onde a execução parou.
MIT. Por @slabbdev — companheiro do artigo do blog.