Skip to content

Windows Heap Bitmap Desync — NT Heap FreeListInUse / LFH BusyBitmap Flip

Allocator'ın busy/free bitmap'ini (classic FreeListInUse summary'si ya da LFH BusyBitmap'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 olarak RtlCommitRoutine'e yönlendiriliyordu).
  • LFH / Segment-Heap BusyBitmap (subsegment içinde RTL_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ı):

  1. Deterministik bir FreeList / subsegment durumuna groom et (LFH: aktive et ve yoğun şekilde doldur — bkz. LFH bucket grooming).
  2. Size alanına (classic) ya da bitmap word'üne/header'ına (LFH) ulaşan bir corruption primitive'i (overflow ya da UAF) elde et.
  3. Defteri desync et:

    Temsili mantık (çalışan bir exploit değil)
    FreeListInUse[wrong_idx] ^= (1 << bit);   // classic: flip wrong class
    // or, on LFH/Segment Heap:
    clear_busy_bit(&subseg.BusyBitmap, target_block);
    
  4. Yeniden allocate et — allocator yanlış deftere güvenir ve hedefi döndürür.

  5. 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.
  • HeapValidate hataları ve RtlAllocateHeap / RtlpLowFragHeapAllocFromContext içinden STATUS_HEAP_CORRUPTION.
  • RtlpLogHeapFailure, RtlpLfhBlockBitmapAllocate iç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 (RtlpLfhBlockBitmapAllocate FreeHint + 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.

References