Skip to content

House of Botcake

Bir chunk'ı unsorted bin üzerinden yönlendirerek tcache'in double-free guard'ını bypass etmek ve overlapping chunk'lar üretmek.

Mechanism

House of Botcake, bir chunk'ı unsorted bin üzerinden yönlendirerek tcache'in double-free detection'ını (glibc 2.29'da eklenen per-entry key field'ı) bypass eder; böylece chunk hâlâ referans verilirken tcache'e meşru biçimde yeniden girebilir — overlapping chunk'lar ve bir UAF / arbitrary-write primitive'i üretir. how2heap README bunu şöyle çerçeveler: "Bypass double free restriction on tcache. Make tcache_dup great again."

Note

glibc 2.26'dan (tcache'in tanıtımı) itibaren çalışır; bakımı yapılan örnek glibc_2.35/house_of_botcake.c'de yaşar. Hile: unsorted bin'deki bir chunk bir tcache entry'si değildir, dolayısıyla ikinci free, e->key == tcache check'ine takılmaz.

Walkthrough

Kanonik how2heap dizisi:

  1. tcache bin'ini doldurmak için (kapasite 7) 0x100 boyutunda 7 chunk allocate edip free et.
  2. prev (consolidation adayı) ve a (victim) allocate et, artı a'dan sonra küçük bir guard chunk ki top chunk onu emmesin.
  3. free(a) — tcache dolu, dolayısıyla a unsorted bin'e gider.
  4. free(prev)prev, a ile consolidate olup a'yı overlap eden tek bir büyük unsorted chunk olur.
  5. tcache'ten bir chunk çekmek için bir kez malloc(0x100), sonra a'yı tekrar free et — kabul edilir çünkü a şu anda bir unsorted-bin chunk'ıdır, bir tcache entry'si değildir. Artık a hem unsorted bin'de hem tcache'te oturur.
  6. Büyük consolidate edilmiş chunk'ı allocate et; hâlâ tcache'te olan a'yı overlap eder. Overlap üzerinden yazmak, a'nın tcache fd'sini (next) ezer ve sonraki bir malloc'u arbitrary bir adrese yönlendirir.

Mitigation

Teknik özellikle tcache double-free key check'ini (glibc 2.29) atlatır. glibc ≥ 2.32'de safe-linking tcache/fastbin fd'sini mangle eder (fd = (chunk_addr >> 12) ^ fd), dolayısıyla ezilen next pointer encode edilmeli ve bir heap leak gerekir (bkz. safe-linking-bypass); alignment check'leri ek kısıtlamalar getirir. Savunma amaçlı detection: overlap eden canlı allocation'lar ya da hem unsorted-bin hem tcache traversal'larından erişilebilen bir chunk.

References