PixieFail: DHCPv6 DNS Servers option buffer overflow (CVE-2023-45234)¶
Quarkslab'ın TianoCore EDK II'nin PXE boot client'ındaki heap buffer overflow'u (CVE-2023-45234): DNS Servers option'ını taşıyan bir DHCPv6 Advertise/Reply işlenirken, firmware bir pool buffer'ı saldırganın option length'inden boyutlandırıyor ama sonra her server için sabit 16 byte
CopyMem'liyor; option fazla küçük olduğunda buffer taşıyor.
Mechanism¶
Note
IPv6 üzerinden PXE/HTTP boot yapan bir UEFI makinesi TianoCore EDK II'nin PXE
client'ını (NetworkPkg/UefiPxeBcDxe) çalıştırır ve DHCPv6 server reply'lerini OS
kontrolü ele almadan önce parse eder. Kırılan trust boundary
network-to-firmware'dir: DHCPv6 server'ının option byte'ları güvensiz/komşu
bir segmentte saldırgan kontrolündedir.
DHCPv6 DNS Servers option'ı (OPTION_DNS_SERVERS) her biri 16 byte olan
bir IPv6 adresi listesi taşır (sizeof(EFI_IPv6_ADDRESS) == 0x10). Tutması
gereken invariant: destination buffer, gerçekten kopyalanan adres sayısı için
yeterince büyük olmalıdır.
Bug bir allocation size ile copy size uyumsuzluğudur. Handler
PxeBcHandleDhcp6Offer (NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c içinde) bir
pool buffer'ı option'ın declare ettiği length'e göre allocate ediyor, ama
sonra her entry'yi 0x10 byte'lık sabit bir CopyMem(..., sizeof(EFI_IPv6_ADDRESS))
ile kopyalıyor. Server 16'nın temiz bir katı olmayan (ya da 16'dan kısa)
bir option length declare ederse, sabit boyutlu copy daha küçük allocation'ın
sonunu aşarak yazar — bir heap (pool) buffer overflow (CWE-119,
CVSS 8.3, attack vector Adjacent), PixieFail setindeki en ciddi write
primitive'i.
Walkthrough¶
Public Quarkslab advisory'sine ve Tianocore fix'ine dayanan kavramsal bir reproduction; controlled-data overflow silahlandırılmış bir zincir olarak değil, yalnızca açıklayıcı amaçla gösteriliyor.
Parser'a ulaşmak. Hedef IPv6 üzerinden PXE/HTTP boot yapar; saldırganın
DHCPv6 server'ı malformed bir OPTION_DNS_SERVERS içeren bir Advertise (ya da
Reply) ile cevap verir.
Size uyumsuzluğu. PxeBcHandleDhcp6Offer option length'inden allocate ediyor
ama adres başına sabit 16 byte kopyalıyor:
Allocation/copy uyumsuzluğunun kavramsal şekli
/* OPTION_DNS_SERVERS: declared length 'OptLen' (attacker controlled). */
buf = AllocatePool(OptLen); /* sized from the option */
for (i = 0; i < num_servers; i++) {
/* fixed-size copy regardless of how big 'buf' actually is */
CopyMem(buf + i * sizeof(EFI_IPv6_ADDRESS),
src + i * sizeof(EFI_IPv6_ADDRESS),
sizeof(EFI_IPv6_ADDRESS)); /* always 0x10 bytes */
}
OptLen, num_servers * 0x10'dan küçükse (örn. server kısa bir option
declare eder ama copy logic'i daha fazlasını gezer, ya da OptLen 16'nın
katı değildir), CopyMem buf'ı aşarak yazar — boot sırasında firmware
heap'inde saldırgan etkili bir pool overflow.
Etki. PXE boot sırasında heap corruption; Quarkslab ve CERT/CC'nin PixieFail için işaret ettiği remote-code-execution riskinin temeli.
Warning
Hedefin IPv6 üzerinden PXE/HTTP boot yapmasını ve saldırganın segmentte DHCPv6 sunabilmesini gerektirir. Bu, patch'lenmiş bug'ı özetler ve güvenilir bir RCE zincirini atlar; pool-grooming detayları reproduce edilmemiştir.
Detection¶
- PXE segmentinde rogue DHCPv6 server'lar ve length'i 16'nın katı olmayan
OPTION_DNS_SERVERSoption'ları için izleme yapın. - IPv6 network boot sırasında firmware crash/hang'leri.
Mitigation¶
- Tianocore EDK II fix'ini (GHSA-hc6x-cw6p-gj7h / bugzilla 4518) ve option length'i copy size'a karşı doğrulayan vendor firmware update'ini uygulayın.
- Network boot'u devre dışı bırakın ya da güvenilir, segmentli, authenticated network'lerle sınırlayın; boot'u yalnızca kontrollü DHCPv6 server'lardan sunun.