Skip to content

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:

#define NET_RANDOM(Seed) \
  ((UINT32)((UINT32)(Seed) * 1103515245UL + 12345) % 4294967295UL)

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_RANDOM seeding/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.

References