Skip to content

PixieFail: DHCPv6 proxy Server ID buffer overflow (CVE-2023-45235)

Oversized bir Server ID (DUID) option'ı içeren malicious bir DHCPv6 proxy Advertise mesajı, 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 Advertise frame'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 NetworkPkg fix'ini uygulayın (CopyMem'den önce OpLen'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.

References