Skip to content

PixieFail: DHCPv6 IA_NA/IA_TA integer underflow (CVE-2023-45229)

Quarkslab'ın TianoCore EDK II'nin DHCPv6 client'ındaki out-of-bounds read'i (CVE-2023-45229): optlen'i yapısal minimumun altında olan bir IA_NA/IA_TA option'ı parse edilirken bir subtraction underflow'a girer; firmware PXE boot sırasında malicious bir DHCPv6 Advertise mesajını işlerken bu, devasa bir length ve bir out-of-bounds read üretir.

Mechanism

Note

PXE network boot sırasında, UEFI firmware paketleri herhangi bir OS ya da Secure Boot policy tam olarak kontrolü ele almadan önce parse eden tam bir IP stack'i (TianoCore EDK II NetworkPkg) çalıştırır. Kırılan trust boundary network-to-firmware'dir: PXE/HTTP boot yapan bir makine link üzerinde her ne cevap verirse onun DHCPv6 reply'lerini parse eder, dolayısıyla malicious (ya da on-path/komşu) bir DHCPv6 server option byte'larını kontrol eder.

DHCPv6 IA_NA ve IA_TA option'ları bir length alanı (optlen), ardından sabit bir header ve sonra değişken bir sub-option listesi taşır. Parser, sub-option bölgesinin boyutunu sabit header boyutunu optlen'den çıkararak hesaplamalıdır. Başarısız olan invariant: kod, çıkarmadan önce optlen'in en az sabit header kadar büyük olduğunu hiç kontrol etmez.

  • IA_NA için parser, optlen >= 12 kontrolü yapmadan optlen'den 12 çıkarır.
  • IA_TA için, optlen >= 4 kontrolü yapmadan 4 çıkarır.

optlen daha küçük olduğunda (örn. 0), unsigned subtraction çok büyük bir değere (örn. 0xFFFF) underflow eder ve (artık sahte length'li) sub-option bölgesini gezen loop buffer'ın çok ötesine okur — bir out-of-bounds read / information disclosure. Etkilenen logic NetworkPkg/Dhcp6Dxe/Dhcp6Io.c içindeki Dhcp6SeekStsOption'dadır.

Walkthrough

Bu, public Quarkslab advisory'sine ve Tianocore fix'ine dayanan kavramsal bir reproduction yoludur; silahlandırılmış bir zincir değil, bir DoS/infoleak primitive'idir.

Parser'a ulaşmak. Bir hedefi IPv6 üzerinden PXE/HTTP boot ile başlatın ki EDK II Dhcp6Dxe client'ı saldırgan kontrollü server'dan bir DHCPv6 Advertise mesajı solicit edip parse etsin.

Açıklı subtraction. Dhcp6SeekStsOption içinde, IA_NA/IA_TA option'ının işlenmesi inner-options length'ini optlen'den hesaplar:

Eksik minimum-length kontrolünün kavramsal şekli

/* Illustrative: the fix adds the bound the original code lacked. */
/* IA_NA option layout: [option-code][optlen][IAID(4)][T1(4)][T2(4)][sub-options...] */
UINT16 optlen = NTOHS(option->OpLen);

/* MISSING in vulnerable code: if (optlen < 12) -> reject (IA_NA) */
inner_len = optlen - 12;          /* underflows to ~0xFFFF if optlen < 12 */

/* walk 'inner_len' bytes of sub-options -> reads out of bounds */
Dhcp6SeekInnerOptionSafe(..., inner_len, ...);
IA_TA için sabit 12 yerine 4'tür. optlen = 0 ile inner_len bir 16-bit underflow olur ve sub-option walk'u packet buffer'ının sonunun ötesine taşar.

Etki. OOB read komşu firmware memory'sini sızdırır / boot'u crash'ler (CWE-125, CVSS 6.5, attack vector Adjacent). Quarkslab, malicious Advertise'ı hazırlayan bir proof-of-concept (pixiefail-CVE-2023-45229.py) yayınladı.

Warning

Bu, hedefin PXE/HTTP boot yapmasını ve saldırganın segmentte (komşu network) DHCPv6'ya cevap verebilmesini gerektirir. Walkthrough, patch'lenmiş public bug'dır; güvenilir herhangi bir exfiltration zincirini atlar.

Detection

  • PXE network segmentinde Solicit/Information-Request'e cevap veren rogue DHCPv6 server'lar ve undersized optlen'li IA_NA/IA_TA option'ları için izleme yapın.
  • Network boot sırasında DHCPv6 client'ında crash ya da hang gösteren firmware/boot logları.

Mitigation

  • Tianocore EDK II fix'ini (advisory GHSA-hc6x-cw6p-gj7h / bugzilla 4518) ve optlen minimum kontrollerini ekleyen ilgili vendor firmware update'ini uygulayın.
  • PXE/network boot'u devre dışı bırakın ya da güvenilir, authenticated, segmentli network'lerle (örn. 802.1X, ayrı provisioning VLAN) sınırlayın.
  • Signed/HTTPS boot image'larını tercih edin ve DHCPv6'yı kimin sunabileceğini kısıtlayın.

References