House of Atum¶
Bir chunk'ı hem tcache hem fastbin'e free et ve forward pointer'ları arasındaki offset uyumsuzluğunu (tcache
next+0x10'da, fastbinfd+0x0'da) sömürerek çok az allocation'dan overlapping chunk'lar elde et.
Mechanism¶
Note
BCTF 2018'de tanıtılan House of Atum, iki single-linked freelist'in forward
pointer'larını nasıl sakladıklarındaki yapısal farkı hedefler: tcache next'i
chunk'ın user-data offset'inden (chunk+0x10) okurken, fastbin fd'yi
header offset'inden (chunk+0x0) okur. Her iki bin'de de bulunan tek bir chunk
bu yüzden iki farklı offset'te yorumlanır, dolayısıyla yeniden allocation
overlap eden chunk'lar geri verir. Aşılan sınır heap allocator integrity'sidir: sadece
iki kullanılabilir object ve bir UAF/double-free ile offset karışıklığı, attacker'ın bir
komşunun size'ını düzenlemesine, libc'yi leak'lemesine ve son olarak bir allocation'ı
__free_hook gibi hassas bir target'a yöneltmesine izin veren overlapping allocation'lar verir.
Walkthrough¶
Kavramsal reçete (glibc 2.27 dönemi, public writeup'lar):
- UAF/double-free ile bir chunk'ı 7 kez free ederek tcache bin'ini doldur, sonra bir kez daha free et ki fastbin'e düşsün — artık her iki bin'de de var.
- tcache(
+0x10) ile fastbin(+0x0) pointer-offset uyumsuzluğunu sömür ki yeniden allocation overlapping chunk'lar üretsin. - Overlap eden bir chunk'ın
size'ını düzenle (örn.0x91'e) ki bir unsorted-bin chunk'ı forge edesin; onu free et ve geri okuyarak birmain_arenapointer'ı leak'le → libc base. - Overlap'i yeniden kullanarak bir freelist
next/fd'sini poison'la ki sonraki allocation__free_hook'a insin. __free_hook'asystemyaz, sonra"/bin/sh"içeren bir chunk'ıfreeet.
Warning
+0x10/+0x0 offset'leri ve tcache_entry layout'u bu tekniğin hedeflediği
tcache dönemi glibc'sine özgüdür; __free_hook finali glibc
2.34+'a uygulanmaz (hook'lar kaldırıldı).
Detection¶
- glibc'nin kendi tcache double-free detection'ı (
tcache_entry.key, ≥2.29) ve fastbin "double free or corruption" abort'ları. - Freed bir chunk'ın iki bin'de yeniden kullanımını işaretleyen ASAN/UAF detector'ları.
- Birden fazla freelist'te görünen bir chunk üzerinde abort eden allocator hardening'i.
Mitigation¶
- Modern glibc tcache key check'i ve freelist
next/fdpointer'larını encrypt eden Safe-Linking (≥2.32) (safe-linking-bypass.md). __free_hook/__malloc_hook'un kaldırılması (glibc 2.34).- Altta yatan UAF/double-free'yi düzelt; hardened allocator'lar kullan.