Skip to content

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.

References