PixieFail: DHCPv6 proxy Server ID buffer overflow (CVE-2023-45235)¶
Oversized bir Server ID (DUID) option'ı içeren malicious bir DHCPv6 proxy
Advertisemesajı, EDK II'nin PXE client'ındaki sabit 1024 byte'lık bir pool buffer'ı taşırır ve IPv6 network boot sırasında remote code execution verir.
Mechanism¶
Uzak bir length alanına copy boyutu olarak güvenmek
UEFI PXE base-code driver'ı DHCPv6 option'larını, DhcpOptions buffer'ı
1024 byte olan sabit boyutlu bir EFI_PXE_BASE_CODE_DHCPV6_PACKET
yapısında toplar. Proxy Advertise yolu Server ID option'ını kopyaladığında,
option'ın length alanını (OpLen) — uzak DHCPv6 server tarafından tamamen
kontrol edilen bir değer — okur ve onu doğrudan copy length olarak kullanır:
OpLen = NTOHS(((EFI_DHCP6_PACKET_OPTION *)Option)->OpLen);
CopyMem(DiscoverOpt, Option, OpLen + 4); // no bound vs. 1024
Hiçbir şey OpLen'i destination size'a karşı kontrol etmediği için, 1024
byte'tan uzun bir Server ID DhcpOptions'ı aşarak yazar ve komşu pool
memory'sini bozar. Kırılan invariant "network'ten gelen option length
receive buffer ile sınırlıdır" — ki hiç öyle olmadı.
Açıklı fonksiyon NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c içindeki
PxeBcRequestBootService()'tir. Saldırgan, boot network'ünde PXE/DHCPv6'ya cevap
verebilen herhangi bir host'tur (rogue bir DHCPv6 proxy). CVSS 8.3.
Walkthrough¶
Bu bir network-boot yoludur, dolayısıyla "trigger" local bir komut değil, hazırlanmış bir on-wire pakettir. Bir OVMF/QEMU hedefine karşı kavramsal reproduction:
1. Boot the target into IPv6 PXE (PlatformBootManager -> PXEv6).
2. Stand up a rogue DHCPv6 proxy on the link.
3. Answer the client SOLICIT with an Advertise whose Server ID (DUID, option 2)
option length OpLen > 0x400 (e.g. 0x800 bytes of attacker data).
4. PxeBcRequestBootService() CopyMem()s OpLen+4 bytes into the 1024-byte
DhcpOptions buffer -> pool overflow.
Quarkslab'ın PoC repo'su, oversized proxy Advertise'ı forge eden
pixiefail-CVE-2023-45235.py'yi içerir. Patch'lenmemiş bir build'de beklenen
sonuç: pool corruption / firmware crash ve kontrollü bir heap'te, DXE network
stack'inde hijack edilmiş control flow (pre-OS, pre-ExitBootServices).
Warning
Bu, OS'ten önce ve Secure Boot devri teslim etmeden önce çalışır, dolayısıyla başarılı bir overflow tam firmware privilege ile çalışır. Yalnızca izole bir lab VM'inde reproduce edin.
Detection¶
- PXE/DHCPv6 yalnızca güvenilir altyapı tarafından sunulmalıdır; boot VLAN'ında ikinci bir DHCPv6 responder'ı birincil göstergedir.
- Yakalanan DHCPv6
Advertiseframe'lerini, makul DUID boyutlarını aşan Server ID (option 2) length'leri için inceleyin (DUID'ler normalde < 130 byte'tır).
Mitigation¶
- EDK II
NetworkPkgfix'ini uygulayın (CopyMem'den önceOpLen'i destination buffer'a karşı doğrulayın). - Network boot gerekmiyorsa, firmware setup'ta PXE/IPv6 boot'u devre dışı bırakın.
- Provisioning network'ünü ayırın ve DHCP altyapısını authenticate edin.