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 >= 12kontrolü yapmadanoptlen'den 12 çıkarır. - IA_TA için,
optlen >= 4kontrolü 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, ...);
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
optlenminimum 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.