Arnés headless de QEMU/OVMF que impulsa un arranque PXE y lanza errores ICMP de tamaño excesivo para reproducir el desbordamiento de búfer de EDK II PxeBcSupport (CVE-2026-97631) en un laboratorio local.
⚠️ SOLO LABORATORIO LOCAL. Estas herramientas controlan una VM QEMU local contra un firmware que tú controlas. Nunca apuntes el generador de ICMP a hardware o redes que no sean tuyas.
CVE-2026-97631: un desbordamiento de búfer de 16 años en TianoCore EDK II
(NetworkPkg/UefiPxeBcDxe/PxeBcSupport.c) — un mensaje de error ICMP de tamaño excesivo
durante un arranque de red PXE copia más allá de la estructura EFI_PXE_BASE_CODE_ICMP_ERROR
de 504 bytes, corrompiendo la memoria del firmware en ring 0, antes de que se carguen Secure Boot y TPM.
Corregido por PR #13200 /
#13302; cobertura de la divulgación:
Ars Technica.
Tres pequeñas piezas que solo usan la biblioteca estándar y que llevan una VM OVMF/QEMU sin interfaz gráfica desde el arranque en frío hasta un intento de arranque PXE — con un servidor DHCP y el ataque ICMP en el cable:
| archivo | función |
|---|---|
bridge.py | servidor DHCP mínimo en el cable de QEMU (DISCOVER→OFFER→REQUEST→ACK, espera de TFTP RRQ), luego dispara el ataque: 6× errores ICMP tipo-3 código-1 que citan un datagrama falso de 1200 bytes dentro de la estructura de 504 bytes. --attack activado/desactivado. |
router.py | enrutador de estado de pantalla: clasifica la pantalla de OVMF a partir de las estadísticas de píxeles de screendump (negro = UEFI Shell, azul = página principal / Boot Manager) y maneja la interfaz a través del monitor de QEMU (sendkey) hasta que se ejecuta la opción de arranque PXE. |
drive.py | controlador de teclado paso a paso anterior con detección de la barra de resaltado en PPM (se conserva como referencia). |
Forma de ejecución:
# 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)
Todo hasta el intento de arranque PXE funciona de forma reproducible (enrutamiento por estado de pantalla, captura en el cable, motor DHCP/ataque armado). En las compilaciones de OVMF incluidas con QEMU que probamos (IA32 y X64, q35 e i440fx, TCG), el firmware muestra el banner de PXE y luego no transmite ningún paquete — el DHCP Discover nunca sale del firmware, así que el disparador ICMP nunca llega al manejador vulnerable. Para ir más allá se necesita una compilación de OVMF con depuración por puerto serie o hardware de laboratorio real. El arnés se publica hasta este límite exacto a propósito: las afirmaciones de reproducibilidad deben detenerse donde se detuvo la ejecución.
MIT. Por @slabbdev — complemento de la entrada del blog.