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_ENTRYchunk'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_ENTRYheader'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.