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:
- tcache bin'ini doldurmak için (kapasite 7)
0x100boyutunda 7 chunk allocate edip free et. prev(consolidation adayı) vea(victim) allocate et, artıa'dan sonra küçük bir guard chunk ki top chunk onu emmesin.free(a)— tcache dolu, dolayısıylaaunsorted bin'e gider.free(prev)—prev,aile consolidate olupa'yı overlap eden tek bir büyük unsorted chunk olur.- tcache'ten bir chunk çekmek için bir kez
malloc(0x100), sonraa'yı tekrarfreeet — kabul edilir çünküaşu anda bir unsorted-bin chunk'ıdır, bir tcache entry'si değildir. Artıkahem unsorted bin'de hem tcache'te oturur. - Büyük consolidate edilmiş chunk'ı allocate et; hâlâ tcache'te olan
a'yı overlap eder. Overlap üzerinden yazmak,a'nın tcachefd'sini (next) ezer ve sonraki birmalloc'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.