Skip to content

PixieFail: Destination Options infinite loop (CVE-2023-45232)

Quarkslab'in TianoCore EDK II'nin IPv6 stack'indeki denial-of-service'i (CVE-2023-45232): Length alanı 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 */
}
Unknown-option yolu minimum bir ilerlemeyi zorunlu kılmadığı için, tek bir zero-length bilinmeyen option boot'u askıya alır.

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.

References