Skip to content

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, fastbin fd +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):

  1. 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.
  2. tcache(+0x10) ile fastbin(+0x0) pointer-offset uyumsuzluğunu sömür ki yeniden allocation overlapping chunk'lar üretsin.
  3. 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 bir main_arena pointer'ı leak'le → libc base.
  4. Overlap'i yeniden kullanarak bir freelist next/fd'sini poison'la ki sonraki allocation __free_hook'a insin.
  5. __free_hook'a system yaz, sonra "/bin/sh" içeren bir chunk'ı free et.

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/fd pointer'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.

References