PixieFail: ND Redirect out-of-bounds read (CVE-2023-45231)¶
Bir IPv6 Neighbor Discovery Redirect mesajının içindeki truncated bir option, EDK II'nin option validator'ını atlatıyor; validator daha sonra eksik length byte'ını paketin sonunun ötesinden okuyor — bir out-of-bounds read / information disclosure.
Mechanism¶
Validator'ın asla incelemediği 1-byte'lık bir option
ICMPv6 option'ları TLV-style'dır: byte 0 type, byte 1 ise length'tir.
Ip6IsNDOptionValid() option'ları şu koşulla korunan bir loop ile dolaşır
(aşağıdaki snippet NetworkPkg/Ip6Dxe/Ip6Option.c'den sadeleştirilmiştir —
verbatim kopya değil, illustrative'dir):
Eğer Redirect, yalnızca type byte'ından oluşan tek bir truncated option
taşıyorsa (length byte eksik / paketin sonunun dışında), loop koşulu girişte
false olur, loop body asla çalışmaz ve fonksiyon yine de TRUE (geçerli)
döner. Daha sonra Ip6ProcessRedirect() içindeki işleme, option'ın length
field'ını — ki bu alan alınan buffer'ın ötesinde yer alır — dereference ederek
bir out-of-bounds read gerçekleştirir. Bozulan invariant: "validate edilmiş bir
option'ın tüm header byte'ları mevcuttur."
Zafiyetli kod NetworkPkg/Ip6Dxe/Ip6Nd.c ve Ip6Option.c içinde yaşıyor. Etki:
information disclosure / out-of-bounds read.
Walkthrough¶
Kavramsal reproduction (link-local IPv6, boot link üzerinde OVMF/QEMU hedefi):
1. Target's IPv6 stack is active during network boot.
2. Send a crafted ICMPv6 Neighbor Discovery Redirect whose options section
ends with a single byte (option type only, length byte truncated away).
3. Ip6IsNDOptionValid() returns TRUE; Ip6ProcessRedirect() reads the absent
length byte -> OOB read of adjacent memory.
Quarkslab pixiefail-CVE-2023-45231.py'i sağlıyor. Beklenen sonuç: OOB read;
ifşa olan byte'lar layout'a bağlı olarak reflect/gözlemlenebilir veya bir fault'a
yol açabilir.
Detection¶
- PXE link'inde malformed/truncated option trailer'larına sahip ICMPv6 Redirect frame'lerini izle.
- ND Redirect'leri yalnızca router'lar emit etmeli; host-sourced Redirect'ler şüphelidir.
Mitigation¶
- Header'ı tam olarak mevcut olmayan option'ları validate/parse etmeden önce
reddeden EDK II
NetworkPkgfix'ini uygula. - Access port'larında ICMPv6 Redirect'leri filtrele (RA Guard / ND inspection).