Low Fragmentation Heap (LFH)¶
Aynı boyuttaki allocation'ları hız ve düşük fragmentation için bucket başına UserBlocks içine paketleyen Windows user-mode front-end allocator'ı.
Mechanism¶
Nedir
LFH, küçük ve sık kullanılan boyutlar için fragmentation'ı azaltmak amacıyla
back-end heap'in önünde duran bir front-end allocator'dır. Klasik NT Heap'te
(Valasek) tek front-end manager budur: request'ler
_HEAP_BUCKET.SizeIndex ile bucket'lara ayrılır ve her aktif bucket,
UserBlocks alanı sabit boyutlu block'lar dizisini tutan bir _HEAP_USERDATA_HEADER'ı
işaret eden bir _HEAP_SUBSEGMENT ile desteklenir.
Free pozisyon bir _INTERLOCK_SEQ ile takip edilir (Depth = free sayısı,
FreeEntryOffset); bir sonraki free block
adresi = UserBlocks + FreeEntryOffset * 0x8 ve her free block, bir sonraki
offset'i ilk 2 user-writable byte'ında saklar — singly-linked bir free-index zinciri.
Segment Heap'te (Windows 10, Yason) LFH dört bileşenden biridir ve
yaygın kullanılan <= 16,368 (0x3FF0) byte'lık request'lere hizmet eder; state'i
block başına header yerine block başına bir bitmap (block başına 2 bit) ile takip eder ve
_HEAP_LFH_CONTEXT / _HEAP_LFH_BUCKET / _HEAP_LFH_SUBSEGMENT yapılarını kullanır.
Walkthrough¶
Bu tanımsal bir kayıttır; güvenlik açısından ilgili gerçekler:
- Aktivasyon eşiği (NT Heap): "LFH, aynı boyutta en az 0x12 ardışık allocation yaparak (veya daha önce aktive edilmişse 0x11) aktive edilebilir." Heuristic sayaç allocation'da artar, free'de azalır, dolayısıyla free'ler aktivasyonu engelleyebilir.
- Aktivasyon eşiği (Segment Heap): bir bucket boyutu için 17. aktif allocation onu aktive eder; alternatif olarak o boyuttaki 2,040 allocation request'i, araya giren free'lere bakılmaksızın onu aktive eder.
- Randomizasyon (Win8+/Win10): Segment Heap'te "temiz bir BUSY bit'inin seçimi randomize edilir" — free edilip yeniden allocate edilen block'lar deterministik bir sırada dönmez.
Saldırganlar neden önemser
LFH aynı boyuttaki allocation'ları bitişik paketlediği için, bir hedef boyutun alloc/free'sini
kontrol etmek saldırgana adjacency'yi şekillendirme imkanı verir (bkz. lfh-grooming,
lfh-userblocks-manipulation).
Bu not vs. LFH grooming
Bu kayıt LFH allocator'ının ne olduğunu — yapısını, NT Heap vs Segment Heap iç organizasyonunu ve aktivasyon eşiklerini — tanımlar. Bu yapının deterministik adjacency için nasıl şekillendirileceği (bucket ısıtma, defrag, slot-randomization'ı etkisizleştirme) ayrı bir exploitation primitive'idir: bkz. Low Fragmentation Heap (LFH) grooming.
Detection¶
- Özellikle script-driven context'lerden (browser DOM/JS) gelen, free'lerin izlediği aynı boyutta allocation patlamaları (spray imzaları).
- Test ortamlarında Page-heap / GFlags / Application Verifier; ETW heap event'leri.
Mitigation¶
- Segment Heap LFH allocation randomization deterministik free-block reuse'unu etkisizleştirir.
- Heap address randomization (ASLR) ve subsegment'lerdeki guard page'ler grooming maliyetini yükseltir.
- Hassas object tipleri için izole heap'ler, böylece bunlar asla attacker-controllable buffer'larla aynı bucket'ı paylaşmaz.