Windows Heap Bitmap Desync — NT Heap FreeListInUse / LFH BusyBitmap Flip¶
Allocator'ın busy/free bitmap'ini (classic
FreeListInUsesummary'si ya da LFHBusyBitmap'i) desenkronize ederek defterinin yanlış olmasını sağlamak; eski bir list-head dereference'i ya da bir double-allocation/overlap üretir.
Mechanism¶
Bozulan invariant
Allocator bir busy/free bitmap tutar; invariant, her bit'in gerçek block durumunu sadakatle yansıtmasıdır. İki varyant vardır.
- Classic NT heap
FreeListInUse(128-bit summary, XP/2003): bit N, "FreeList[N]boş değil" anlamına gelir ve bir XOR toggle'ı ile tutulur (FreeListInUse[idx] ^= (1 << bit)). Free edilmiş bir chunk'ın size alanını corrupt etmek, allocator'ın yanlış size-class bit'ini toggle etmesine yol açar; boş bir class'ı "1"e çevirmek, list-head sentinel'ini gerçek bir chunk'mış gibi dereference etmesine neden olur → controlled bir pointer (tarihsel olarakRtlCommitRoutine'e yönlendiriliyordu). - LFH / Segment-Heap
BusyBitmap(subsegment içindeRTL_BITMAP; Segment Heap block başına 2 bit kullanır — BUSY + UNUSED-BYTES): bitmap word'ünü corrupt edip canlı bir block'un BUSY bit'inin 0 okunmasını sağlamak, allocator'ın hâlâ canlı bir block'u yeniden dağıtmasına yol açar → double allocation / overlap.
Walkthrough¶
Kavramsal reproduction (bkz. FuzzySecurity ve Segment Heap internals yazıları):
- Deterministik bir FreeList / subsegment durumuna groom et (LFH: aktive et ve yoğun şekilde doldur — bkz. LFH bucket grooming).
- Size alanına (classic) ya da bitmap word'üne/header'ına (LFH) ulaşan bir corruption primitive'i (overflow ya da UAF) elde et.
-
Defteri desync et:
-
Yeniden allocate et — allocator yanlış deftere güvenir ve hedefi döndürür.
- Bir leak ya da arbitrary write için alias'a farklı tipte bir object spray'le (bkz. overlapping chunks).
Detection¶
- PageHeap / Application Verifier — overlap write'ları fault verir.
HeapValidatehataları veRtlAllocateHeap/RtlpLowFragHeapAllocFromContextiçindenSTATUS_HEAP_CORRUPTION.RtlpLogHeapFailure,RtlpLfhBlockBitmapAllocateiçinde WER/EDR imzaları; double-free assertion'ları.- İki allocation tarafından döndürülen aynı adres; anormal LFH-aktivasyon serileri.
Mitigation¶
- XP SP2+ heap cookie'leri + header encoding, flip'e giden size/header girdisini sertleştirir.
- Vista+ safe unlinking ve sömürülebilir summary-bitmap kısayolunun kaldırılması.
- HeapEnableTerminationOnCorruption (bkz. validate heap integrity).
- Windows 8 → 19H1 randomize edilmiş subsegment-içi allocation
(
RtlpLfhBlockBitmapAllocateFreeHint + randomize edilmiş free-block seçimi), block başına BUSY/UNUSED-BYTES doğrulaması ve guard page'ler; GS/ASLR/CFG control-flow maliyetini artırır.