LookAside List (LAL) abuse¶
Free bir pre-Vista lookaside chunk'ının doğrulanmamış singly-linked Flink'ini poison'la ki sonraki allocation attacker-chosen bir adres döndürsün.
Mechanism¶
Kırılan invariant
Pre-Vista Windows'ta (NT 4 – XP SP3 / Server 2003), user-mode heap'in bir front-end
allocator'ı vardı: lookaside list (_HEAP_LOOKASIDE) — yakın zamanda free edilmiş
chunk'ların per-size singly-linked free list'lerinden oluşan bir array, kavramsal
olarak glibc fastbin'inin Windows analogu. Free edilmiş bir lookaside chunk, user-data
alanında tek bir forward pointer — Flink — saklar. Allocation'da heap manager önce
lookaside list'i kontrol eder, head'i pop'lar ve head'i o chunk'ın sakladığı Flink'e
doğrulama olmadan ayarlar. Back-end FreeList'lerin aksine, lookaside path safe-unlinking
ve header-cookie check'i yapmaz — dolayısıyla overwrite edilmiş bir Flink, tıpkı fastbin /
tcache poisoning gibi bir write-what-where / arbitrary-allocation primitive'idir.
Walkthrough¶
Üst düzey, FuzzySecurity "Heap Overflows For Humans" tutorial'larından:
- Groom yap ki target size'ın lookaside list'i attacker-influenced free chunk'ları öngörülebilir bir layout'ta tutsun.
- Bir adjacent overflow yoluyla free bir lookaside chunk'ının Flink'ini corrupt et, onu seçilmiş bir target adresiyle değiştir.
- List'i boşalt: bir allocation legitimate head'i pop'lar, list head'ini poison'lanmış Flink'e ilerletir.
- İkinci allocation target adresini taze heap memory'ymiş gibi döndürür.
- Oraya bir sensitive pointer yazarak control flow'a çevir — bu adım klasik bir
write-what-where / arbitrary-write primitive'idir. Klasik pre-Vista target'lar
normal execution sırasında ulaşılan process-wide function pointer'lardı — örn. PEB lock
routine'i (
FastPEBLockRoutine,RtlAcquirePebLocküzerinden).
Doğrulanmamış pop mantığı (illustrative-only — çalışan exploit değildir)
Aşağıdaki pseudo-C, lookaside path'in allocation sırasında neden Flink'i körlemesine güvendiğini gösterir. Gerçek offset / gadget / payload yok — sadece allocator'ın safe-unlinking yapmayan pop logic'i:
// ILLUSTRATIVE ONLY — pre-Vista lookaside pop, simplified.
// No bounds/cookie check on the stored forward pointer (Flink).
void *lal_alloc(_HEAP_LOOKASIDE *Lookaside)
{
void *chunk = Lookaside->Next; // pop current head
if (chunk != NULL)
Lookaside->Next = chunk->Flink; // advance head to chunk's Flink — UNVALIDATED
return chunk;
}
// İlk pop legitimate head'i döndürür ama list head'ini, corrupt edilmiş Flink'in
// gösterdiği attacker-chosen adrese ilerletir. Bir sonraki pop o adresi taze bir
// allocation gibi döndürür:
// first = lal_alloc(L); // benign head; L->Next now = poisoned Flink
// second = lal_alloc(L); // returns attacker-chosen pointer as a "fresh" chunk
Karışıklığı giderme
Bu entry user-mode lookaside list'idir. Windows kernel pool'unun da ayrı bir
lookaside kavramı vardır (_GENERAL_LOOKASIDE) — bunları birbirine karıştırma.
Detection¶
- Application Verifier / PageHeap + "terminate-on-heap-corruption" poison'lanmış bir free list'in ürettiği tutarsız metadata'yı yakalar.
- Sahip olan heap'in region'larının dışına ya da image/stack/PEB range'lerine işaret eden bir Flink/lookaside pointer'ı güçlü bir corruption sinyalidir.
- Allocation churn'ünün hemen ardından bilinen bir sensitive pointer'a yapılan bir write anormaldir.
Mitigation¶
- Yapısal kaldırma (anahtar olan): MSRC'ye göre, lookaside list'ler "kaldırıldı … Low Fragmentation Heap (LFH) ile değiştirildi" — LFH front-end'i doğrulanmamış singly-linked Flink'i açığa çıkarmaz.
- Daha geniş heap için heap header cookie'leri, safe unlinking, heap-metadata XOR randomization ve termination-on-corruption.
- Bu allocator'ı hâlâ çalıştıran, kalan XP/2003 dönemi sistemleri envanterle/denetle.
References¶
- Microsoft MSRC — Preventing the exploitation of user mode heap corruption vulnerabilities (2009)
- FuzzySecurity — Heap Overflows For Humans 102 (mr_me)
- FuzzySecurity — Heap Overflows For Humans 102.5 (mr_me)
- Windows Heap Overflows — David Litchfield (Black Hat 2004)
- Understanding the Low Fragmentation Heap — Chris Valasek (Black Hat USA 2010)