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:
- 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). - 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. - 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 * 0x8stride'ı ile paketler). - 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.