Skip to content

NT Heap (backend allocator)

LFH front-end'inin servis etmediği şeylere hizmet eden eski Windows back-end user-mode heap'i (_HEAP, encode edilmiş _HEAP_ENTRY chunk'ları, doubly-linked free list'ler).

Mechanism

Nedir

Back-end NT Heap, _HEAP yapısı tarafından yönetilir. Free chunk'lar, ListHints'i ve doubly-linked free chunk'lardan oluşan bir ListHead'i işaret eden BlocksIndex (bir _HEAP_LIST_LOOKUP) ile takip edilir. "1. BlocksIndex" 0x400 byte'tan küçük chunk'ları yönetir; "2.", 0x400–0x4000 (16k) aralığını yönetir. Her chunk 8-byte'lık bir _HEAP_ENTRY header'ı taşır (ilk 4 byte encode'lu). VirtualMemoryThreshold üstündeki allocation'lar virtual-alloc'lı block'lara gider. Bir _HEAP_BUCKET taşıyan bir ListHint->Blink, o boyut için LFH front-end'inin aktif olduğunu işaret eder.

Walkthrough

Bu, tanımsal bir kayıt artı tarihsel saldırı/mitigation yayıdır (Microsoft'un MSRC analizine göre):

  • Klasik saldırı: bir free chunk'ın Flink/Blink'ini corrupt et, böylece coalescing/allocation sırasında unlink attacker-controlled bir write yapsın — "unlink write-4 primitive."
  • Safe unlinking (XP SP2 / 2003 SP1): unlink'ten önce E->F->B == E->B->F == E'yi doğrula, list pointer'larının karşılıklı tutarlı olduğunu garanti et — arbitrary write'ı etkisizleştirir.
  • Header cookie (XP SP2): her heap-entry header'ına eklenen, free'de doğrulanan 8-bit'lik rastgele bir değer.
  • Header encoding (Vista / 2008 / Win7): heap-entry header'ı heap başına/process başına rastgele bir değerle XOR'lanır; cookie kontrolleri daha fazla alana/yere genişletildi.
Artık maruziyet

Yason, Segment Heap backend block'larının "arkalarında bir guard page'e sahip olmadığını, böylece bir overflow'un bitişik" backend block'ları corrupt etmesine izin verdiğini belirtir — adjacency overflow, encode edilmiş header'larla bile bir endişe olmaya devam eder.

Detection

  • Page-heap / GFlags / Application Verifier (full-page heap guard page'ler yerleştirir ve header'ları doğrular); free-list integrity assertion'ları.
  • ETW heap-corruption event'leri; "termination on corruption" bir fail-closed sinyal işlevi görür; başarısız safe-unlink ya da cookie kontrollerini gösteren crash-dump triage'ı.

Mitigation

  • Safe unlinking, encode edilmiş _HEAP_ENTRY header'ları, header cookie'leri, heap-base ASLR (~5 bit), non-deterministik allocation, termination-on-heap-corruption ve eski exploit edilebilir yapıların (lookaside/array list'leri) kaldırılması.
  • Modern kod için: uygun olduğunda Segment Heap'i etkinleştir; izole heap'ler; VS/LFH subsegment'leri için guard page'ler.

References