Skip to content

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):

  1. 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.
  2. Hedef bir FreeList[n] ya da lookaside list head'inin Flink'ini, kontrol ettiğin bir fake chunk'ı gösterecek şekilde overwrite et:

    Temsili mantık (çalışan bir exploit değil)
    ListHead->Flink = &fake_chunk;   // poison the anchor
    // ptr = ListHead->Flink  ->  allocator returns attacker_ptr
    
  3. Eşleşen size class'tan bir allocation iste; allocator senin fake chunk adresini döndürür.

  4. Ç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.
  • _HEAP control 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.

References