PixieFail: PadN option infinite loop (CVE-2023-45233)¶
Bir IPv6 Destination Options header'ındaki length'i
0xFEolan bir PadN option, birUINT8offset counter'ının sıfıra wrap etmesine neden olarak EDK II'nin option parser'ını sonsuz bir döngüde hapsediyor — network boot'u kilitleyen bir denial of service.
Mechanism¶
İlerlemek yerine wrap eden 8-bit'lik bir offset
Ip6IsOptionValid(), her option'ı geçecek şekilde bir offset'i ilerleterek
IPv6 extension-header option'ları üzerinde iterate eder. Offset bir UINT8
içinde tutulur ve şöyle ilerletilir:
Bir PadN option (type 1) için Option + Offset + 1'deki length byte
attacker-chosen'dır. Eğer bu 0xFE ise, Offset == 0 için yeni değer
(UINT8)(0 + 0xFE + 2) = (UINT8)0x100 = 0x00 olur. Offset asla hareket etmez;
while-loop asla sonlanmaz. Bozulan invariant: "her iterasyon offset'i en az bir
option kadar ilerletir." 8-bit'lik bir counter +0x100 adımını temsil edemez,
bu yüzden sessizce truncate olup hiç ilerleme kaydetmez.
Zafiyetli kod: NetworkPkg/Ip6Dxe/Ip6Option.c içindeki Ip6IsOptionValid().
Etki: denial of service (firmware boot süresiz olarak kilitlenir).
Walkthrough¶
Kavramsal reproduction (boot link üzerinde OVMF/QEMU hedefi):
1. Target's IPv6 stack processes an inbound packet during PXE boot.
2. Send an IPv6 packet with a Destination Options extension header containing
a PadN option (type 0x01) whose length byte is 0xFE.
3. Ip6IsOptionValid() computes (UINT8)(0 + 0xFE + 2) == 0 and loops forever.
Quarkslab pixiefail-CVE-2023-45233.py'i sağlıyor. Beklenen sonuç: target'ın
firmware'i Ip6IsOptionValid() içinde döner ve network boot asla tamamlanmaz
(reset gerektiren hard hang).
Detection¶
- Boot hang'e neden olan tek bir crafted IPv6 paketi semptomdur; PXE link'inde
trafiği yakala ve length'i
0xFEolan Destination Options PadN'i ara.
Mitigation¶
- Offset type'ını genişleten / option length'i validate ederek counter'ın her
zaman ilerlemesini sağlayan EDK II
NetworkPkgfix'ini uygula. - Network edge'inde anormal PadN option'ları içeren IPv6 extension header'ları drop et.