PixieFail: weak PRNG (CVE-2023-45237)¶
EDK II'nin network stack'i security-sensitive identifier'lar (DNS query ID'leri, IP ID'leri, transaction ID'leri, source port'lar, fragment ID'leri) için basit bir linear-congruential generator kullanıyor; bu da bir attacker'ın onun state'ini geri kazanıp eşleşen response'ları forge etmesine olanak tanıyor.
Mechanism¶
Unpredictable ID'ler için kullanılan ders kitabı tarzı bir LCG
Off-path spoofing'e direnmek için birkaç network değerinin unpredictable olması
gerekir: DNS query ID'leri, IPv4 IP ID'leri, DHCP transaction ID'leri, UDP/TCP
source port'lar ve IPv6 fragment ID'leri. EDK II bunları NET_RANDOM() ile
üretiyor:
Bu, system time ve monotonik bir counter'dan NetRandomInitSeed() ile
seed'lenen, tek adımlı bir linear-congruential generator'dır. Uniform bir
dağılım üretmez ve daha kritik olarak, harici bir gözlemci birkaç output'tan
internal state'i geri kazanıp sonrasında tüm gelecekteki değerleri tahmin
edebilir. Bozulan invariant: "bu ID'ler bir CSPRNG'den çekilir."
Vulnerable kod: NetworkPkg/Include/Library/NetLib.h içindeki NET_RANDOM() ve
NetworkPkg/Library/DxeNetLib/DxeNetLib.c içindeki NetRandomInitSeed(). Etki:
DNS cache poisoning, DHCP spoofing, session hijacking, info leakage.
Walkthrough¶
Kavramsal reproduction (boot network'ünde off-path bir attacker):
1. Observe a few NET_RANDOM-derived values (e.g. successive DNS query IDs or
ephemeral source ports during boot name resolution).
2. Solve for the LCG state (multiplier 1103515245, increment 12345 are known).
3. Predict the next DNS query ID + source port and race a forged DNS response
that matches -> DNS cache poisoning of the boot resolver.
Unpatched bir build'de beklenen sonuç: tahmin edilen transaction ID / port eşleştiği için forge edilmiş response'lar kabul edilir ve boot sırasında name resolution'ın redirect edilmesi mümkün olur.
Detection¶
- Protocol-level zafiyet; race'leri kazanan duplicate/forge edilmiş DNS response'larını ya da beklenmedik host'lara işaret eden boot name resolution'ını gözlemleyin.
Mitigation¶
NET_RANDOMseeding/output'unu EFI_RNG_PROTOCOL-backed randomness ile değiştiren EDK II fix'ini uygulayın.- Authenticated boot transport'ları tercih edin ve indirilen image signature'larını doğrulayın; böylece poison'lanmış bir lookup trusted bir image üretemez.