Skip to content

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:

  1. Groom yap ki target size'ın lookaside list'i attacker-influenced free chunk'ları öngörülebilir bir layout'ta tutsun.
  2. Bir adjacent overflow yoluyla free bir lookaside chunk'ının Flink'ini corrupt et, onu seçilmiş bir target adresiyle değiştir.
  3. List'i boşalt: bir allocation legitimate head'i pop'lar, list head'ini poison'lanmış Flink'e ilerletir.
  4. İkinci allocation target adresini taze heap memory'ymiş gibi döndürür.
  5. 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