Skip to content

LFH bucket grooming

Belirli bir LFH size-class bucket'ını groom et ki kontrol edilebilir bir obje same-size bir victim'e komşu düşsün.

Mechanism

Suistimal edilen invariant

LFH allocation'ları size class'a göre key'lenmiş bucket'lara böler (NT Heap: _HEAP_BUCKET.SizeIndex; Segment Heap: LfhContext.Buckets, per-size _HEAP_LFH_BUCKET'lardan oluşan bir array). İki allocation yalnızca aynı bucket'a düşerse bir UserBlock/subsegment paylaşır. Dolayısıyla grooming belirli size class başına yapılmalıdır: attacker hem vulnerable objenin hem de victim objenin kapladığı bucket'ı seçer (aynı size class olmalıdırlar), sonra tam o size'ı spray'ler.

Walkthrough

Üst düzey, Valasek ve Yason'dan:

  1. Vulnerable objenin byte size'ını (header rounding'inden sonra) belirle ve aynı bucket'a yuvarlanan bir victim obje seç (Valasek'in örneği 0x30-byte / 0x6-block bir bucket, SegmentInfo[0x6] kullanır).
  2. Bucket'ı aktif etmek ve hole'ları tüketmek için o size class'ı spray'le (bkz. lfh-grooming), böylece subsegment same-size block'larla yoğun şekilde paketlenir.
  3. Interleave/replace yap ki kontrol edilebilir bir obje contiguous run içinde victim'in hemen önüne düşsün (Segment Heap LFH subsegment başına tek bir size gruplar; NT Heap FreeEntryOffset * 0x8 stride'ı ile paketler).
  4. Bug'ı tetikle ki overflow/UAF komşu same-size victim'e ulaşsın.

Detection

  • Olağandışı tek bir size class'a yoğunlaşmış spray (allocation'lara hâkim olan tek bir hot bucket); per-size allocation-rate anomalileri.
  • Same-size adjacency overflow'larını yakalamak için QA'de page-heap / Application Verifier; komşu bir same-size objenin corruption'ını gösteren crash bucketing.

Mitigation

  • Isolated / segregated heap'ler ile sensitive obje tiplerinin asla attacker-controllable buffer'larla bir bucket paylaşmamasını sağla (type isolation).
  • LFH allocation randomization (Segment Heap) deterministic same-size reuse'u kırar.
  • Guard page'ler kontrolden çıkan same-size overflow'larını sınırlar; size-class'a özgü hardening.

References