Windows ListHead Overwrite¶
Classic heap'in base/control region'ındaki FreeList / Lookaside ListHead anchor'larını overwrite ederek, allocator'ın attacker-controlled list head'leri dereference edip bir fake chunk döndürmesini sağlamak.
Mechanism¶
Bozulan invariant
FreeList[] head array'i ve lookaside (HeapLookasideList) head pointer'ları,
heap'in base/control region'ında (_HEAP yapısı) yaşar, tek tek chunk
header'larında değil. Allocator'ın dayandığı invariant, bu control
yapılarının güvenilir olması ve corruption'a karşı doğrulanmamasıdır — classic
heap'te tahmin edilebilir (ASLR öncesi) adreslerde otururlar.
Bu ListHead yapılarına ulaşan bir overflow ya da arbitrary write, attacker'a
allocator'ın dereference ettiği anchor'ların ta kendisini kontrol etme imkânı
verir. Boş bir FreeList[n] bucket head'i kendine geri işaret ettiği ve allocator
bir isteği karşılamak için ListHead->Flink'i dereference ettiği için, bir head
pointer'ını corrupt etmek, bitişik bir free chunk'a ihtiyaç olmadan
allocation/free'yi doğrudan zehirler.
Walkthrough¶
Kavramsal reproduction (bkz. McDonald & Valasek):
- Heap base region'ına bir write elde et — erken bir chunk'tan linear bir overflow ya da unlink / FreeList[0] insert / lookaside primitive'lerinden controlled bir write-4.
-
Hedef bir
FreeList[n]ya da lookaside list head'ininFlink'ini, kontrol ettiğin bir fake chunk'ı gösterecek şekilde overwrite et: -
Eşleşen size class'tan bir allocation iste; allocator senin fake chunk adresini döndürür.
- Çağıran
ptrüzerinden user verisi yazar (controlled bir write) ya da type confusion için oraya bir fake object / vtable koyarsın (bkz. arbitrary write primitive).
Detection¶
!heap -s/ PageHeap tarafından rapor edilen heap base/control-structure corruption'ı.- Herhangi bir heap segment'inin dışındaki adresleri döndüren allocation'lar.
- Head dereference'inde
RtlAllocateHeap'in derinliklerinde AV'ler. _HEAPcontrol page'ine bir write'ın ardından non-segment bir pointer döndüren bir allocation gözlemleyen EDR.
Mitigation¶
- Heap base randomization (ASLR, Vista+) tahmin edilebilir hedef adresi ortadan kaldırır.
- Heap control alanlarının Header/metadata ve pointer encoding'i (Vista/Win7).
- HeapEnableTerminationOnCorruption (bkz. validate heap integrity).
- LFH /
_HEAP_LIST_LOOKUP(Win7) ve Segment Heap (Win10) içindeki yapısal değişiklikler, metadata'yı yeniden konumlandırır ve guard-page'ler.