Harnais QEMU/OVMF sans interface graphique qui pilote un démarrage PXE et envoie des erreurs ICMP surdimensionnées pour reproduire le débordement de tampon EDK II PxeBcSupport (CVE-2026-97631) dans un laboratoire local.
⚠️ LABORATOIRE LOCAL UNIQUEMENT. Ces outils pilotent une VM QEMU locale contre un firmware que vous contrôlez. Ne pointez jamais le générateur ICMP vers du matériel ou des réseaux qui ne vous appartiennent pas.
CVE-2026-97631 : un débordement de tampon vieux de 16 ans dans TianoCore EDK II
(NetworkPkg/UefiPxeBcDxe/PxeBcSupport.c) — un message d'erreur ICMP surdimensionné
lors d'un démarrage réseau PXE copie au-delà de la structure EFI_PXE_BASE_CODE_ICMP_ERROR
de 504 octets, corrompant la mémoire du firmware en ring 0, avant le chargement de Secure Boot et du TPM.
Corrigé par PR #13200 /
#13302 ; couverture de la divulgation :
Ars Technica.
Trois petits composants utilisant uniquement la bibliothèque standard qui amènent une VM OVMF/QEMU sans interface graphique du démarrage à froid jusqu'à une tentative de démarrage PXE — avec un serveur DHCP et l'attaque ICMP sur le réseau :
| fichier | rôle |
|---|---|
bridge.py | serveur DHCP minimal sur le réseau QEMU (DISCOVER→OFFER→REQUEST→ACK, attente de RRQ TFTP), puis déclenche l'attaque : 6 erreurs ICMP type-3 code-1 citant un faux datagramme de 1200 octets dans la structure de 504 octets. --attack activé/désactivé. |
router.py | routeur d'état d'écran : classe l'écran d'OVMF à partir des statistiques de pixels de screendump (noir = UEFI Shell, bleu = page d'accueil / Boot Manager) et pilote l'interface via le moniteur QEMU (sendkey) jusqu'à ce que l'option de démarrage PXE s'exécute. |
drive.py | pilote clavier pas à pas antérieur avec détection de la barre de surbrillance PPM (conservé pour référence). |
Forme d'exécution :
# 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)
Tout ce qui précède la tentative de démarrage PXE fonctionne de manière reproductible (routage par état d'écran, capture réseau, moteur DHCP/attaque armé). Sur les builds OVMF fournis avec QEMU que nous avons testés (IA32 et X64, q35 et i440fx, TCG), le firmware affiche la bannière PXE puis n'émet aucun paquet — le DHCP Discover ne quitte jamais le firmware, donc le déclencheur ICMP n'atteint jamais le gestionnaire vulnérable. Aller plus loin nécessite un build OVMF avec débogage série ou du matériel de laboratoire réel. Le harnais est publié jusqu'à cette limite exacte à dessein : les affirmations de reproductibilité doivent s'arrêter là où l'exécution s'est arrêtée.
MIT. Par @slabbdev — complément à l'article de blog.