Skip to content

Kernel Low Fragmentation Heap (kLFH) exploitation

Modern Windows pool internals'ının (Windows 10 19H1+ / Windows 11) sub-0x200 pool overflow'ları ve UAF'lerinin groom edilip exploit edildiği kavramsal kataloğu.

Mechanism

Bağlam, bir bug değil

19H1 ile user-mode segment heap tasarımı kernel'e taşındı: her pool bir _SEGMENT_HEAP tarafından yönetilir ve küçük allocation'lar (genellikle sub-0x200) kernel Low Fragmentation Heap (kLFH) tarafından servis edilir; bu da allocation'ları sabit size-class bucket'larına sıralar. kLFH komşu free chunk'ları coalesce etmez, bu da same-bucket adjacency'yi öğrenilebilir kılar. Pratik bir ayrıntı: bir kLFH bucket'ı genellikle o boyutun 17. aktif allocation'ı civarında "activate" edilir; activation'dan önce allocation'lar bir variable-size (VS) subsegment'ten gelir.

Exploitation açısından önemi şu: bucket randomisation'ı yenmek deterministic grooming ile başarılır — same-size-class allocation'ları sistematik biçimde doldurup serbest bırakarak layout'u düzleştir, böylece adjacency güvenilir hale gelir.

Walkthrough

Üst düzey (r0keb, Connor McGarr, insideyourkernel):

  1. Vulnerable allocation'ın tam size class'ını paylaşan, user mode'dan allocate edilebilen, aynı pool type'ında (örn. NonPagedPoolNx) ve kullanışlı bir member'a (size field ya da pointer) sahip bir manipulation object seç.
  2. Fragmentation boşluklarını doldurmak ve bucket'ı activate etmek için bu tür nesnelerden çok sayıda spray'le; tahmin edilebilir delikler açmak için alternating bir pattern ile free et.
  3. Overflow/UAF seçilen bir komşuya düşecek şekilde vulnerable allocation'ı yerleştir.
  4. Arbitrary read/write inşa etmek, kernel base'i leak etmek ve sonunda bir token çalmak için komşunun metadata'sını (örn. bir _POOL_HEADER ya da bir NP_DATA_QUEUE_ENTRY length/Flink) corrupt et.

Detection

  • Hemen ardından seçici free'ler gelen, aynı boyutlu kernel nesnelerinin (Events, named pipe'lar) büyük spray'leri.
  • Special Pool altında pool-corruption bugcheck'leri.
  • Low-integrity bir process'ten gelen same-size-class allocation churn'ü.
  • Free sırasında tespit edilen corrupt _POOL_HEADER / object length field'ları.

Mitigation

  • Segment-heap / kLFH integrity check'leri ve pool-header cookie'leri.
  • NonPagedPoolNx (non-executable pool); randomize edilmiş LFH bucket placement'ı.
  • Sprayable nesneleri kısıtlayan low-integrity / AppContainer kısıtlamaları.
  • Post-corruption execution adımını engellemek için SMEP / HVCI / kCET.
  • Geliştirme sırasında overflow'ları yakalamak için Driver Verifier Special Pool.

References