PixieFail: Destination Options infinite loop (CVE-2023-45232)¶
Quarkslab'in TianoCore EDK II'nin IPv6 stack'indeki denial-of-service'i (CVE-2023-45232):
Lengthalanı 0 olan bir IPv6 Destination Options extension header'ındaki bilinmeyen bir option'ı parse etmek, parse offset'ini değişmeden bırakır ve PXE boot sırasında firmware'i bir infinite loop'a hapseder.
Mechanism¶
Note
PXE/HTTP network boot yapan UEFI firmware, TianoCore EDK II'nin IPv6
stack'ini (NetworkPkg/Ip6Dxe) çalıştırır. Kırılan trust boundary
network-to-firmware'dir: firmware, OS henüz kontrolü ele almadan önce,
link üzerinde kim gönderiyorsa ondan gelen IPv6 paketlerini — extension
header'lar dahil — parse eder.
IPv6 Destination Options (ve Hop-by-Hop Options) header'ları TLV-encoded
bir option listesi taşır: her option [Type][Length][Value] biçimindedir. Bir
parser, offset'ini tekrar tekrar 2 + Length kadar ilerleterek listede
yürür. Loop'un sonlanmasını sağlayan invariant şudur: her adım offset'i en az
bir byte ilerletir. Bilinmeyen option type'ları için eylem Type'ın high
bit'leriyle belirlenir, ama offset yine de option'ı geçecek şekilde
ilerlemelidir.
Bug: EDK II bir bilinmeyen option type ile karşılaştığında, unknown-option
handling yolunda offset'i ilerleterek option'ı geçmez. Özellikle
Length == 0 olan böyle bir option'da offset hiç hareket etmez ve parser aynı
option'ı sonsuza dek yeniden okur — sistemin boot'u tamamlamasını engelleyen bir
infinite loop (CWE-835). Etkilenen mantık
NetworkPkg/Ip6Dxe/Ip6Option.c içindeki Ip6IsOptionValid fonksiyonuna danışan
unknown-option handling yolundadır.
Walkthrough¶
Public Quarkslab advisory'sinden ve Tianocore fix'inden kavramsal bir reprodüksiyon; bu bir DoS'tur, code execution değil.
Parser'a ulaşmak. IPv6 trafiği alan, PXE/HTTP-booting yapan bir hedef,
extension header'ları Ip6Dxe içinde parse eder. Attacker (adjacent network),
crafted bir bilinmeyen option içeren bir Destination Options header'ı bulunan
bir IPv6 paketi gönderir.
İlerlemeyen adım. Option-walk Ip6IsOptionValid'e danışır; Length == 0 olan
bilinmeyen bir type için offset hareket etmez:
Eksik non-zero-length guard'ının kavramsal şekli
/* Destination/Hop-by-Hop option: [Type][Length][Value...] */
while (offset < header_len) {
type = opts[offset];
len = opts[offset + 1];
if (!Ip6IsOptionValid(type, len)) {
/* unknown type handling: MISSING check that 'len' advances offset */
/* with len == 0, offset is not pushed past the option -> spin */
continue; /* re-reads the same option forever */
}
offset += 2 + len; /* normal advance */
}
Etki. Denial of service: makine network boot'u tamamlayamaz (CWE-835, CVSS 7.5, attack vector Network).
Warning
Hedefin IPv6 network boot yapıyor olmasını ve attacker'ın path/segment üzerinde IPv6 paketleri inject edebilmesini gerektirir. Fix public ve patch'li.
Detection¶
- IPv6 PXE/HTTP boot sırasında boot askıda kalması; firmware watchdog timeout'ları.
- PXE segment'inde zero length bilinmeyen option içeren IPv6 Destination/Hop-by-Hop Options header'ları için network monitoring.
Mitigation¶
- Tianocore EDK II fix'ini (GHSA-hc6x-cw6p-gj7h / bugzilla 4518) ve bilinmeyen option'larda forward progress'i zorunlu kılan vendor firmware update'ini uygula.
- Network boot'u devre dışı bırak ya da güvenilir, segment'lenmiş, authenticated ağlarla sınırla.