Heap grooming / feng shui¶
Heap allocation'larını öyle düzenle ki attacker-controlled bir chunk bir victim object'in bitişiğine (ya da onunla overlap edecek şekilde) düşsün.
Mechanism¶
Heap feng shui (diğer adıyla heap grooming), deterministik bir heap layout'u zorlamak için "dikkatle seçilmiş boyutlarda heap allocation'ları yaparak" "exploit'lerde arbitrary code execution'ı kolaylaştırmak için kullanılan bir tekniktir". Amaç, attacker-controlled bir chunk'ı bir victim object'in hemen bitişiğine — ya da onunla overlap edecek şekilde — yerleştirmektir; böylece ayrı bir corruption primitive faydalı bir hedefe düşer.
Note
Grooming kendi başına bir bug değildir; mevcut bir heap-buffer-overflow,
use-after-free ya da double-free'yi güvenilir kılan layout manipülasyonudur.
Allocator bin'lerinin/size-class'larının determinizmini suistimal eder: aynı boyuttaki
free'ler ve allocation'lar bin sırasını kontrol eder, böylece bir sonraki request
öngörülebilir bir slot döndürür.
Walkthrough¶
Kanonik hamle: bir heap overflow'un tehlikesi "data'yı, en önemlisi pointer'ları overwrite etmektir", dolayısıyla saldırgan hassas code pointer'ları (bir vtable ya da function pointer) içeren bir object'i overflow edilebilir object'in hemen ardına konumlandırmak için heap'i groom eder; overflow sonra o pointer'ın içine yürür. Dokümante edilmiş feng-shui örneği "bir dangling pointer'ı … attacker-controlled bir chunk'ın bir kısmıyla" hizalar — yani seçilen bir sırada free edip yeniden allocate ederek bir UAF dangling pointer'ının kontrol edilen byte'larla overlap etmesini sağlamak.
glibc tcache/fastbin terimleriyle bu şu demektir: victim'in size class'ından çok sayıda
object allocate et, bin'i şekillendirmek için onları kontrollü bir sırada free et, sonra
yeniden request et ki bir sonraki malloc hedefin bitişiğindeki ya da onunla overlap eden
slot'u döndürsün.
Warning
Grooming allocator'a özgüdür. tcache LIFO davranışı, fastbin sıralaması ve kernel SLUB
per-CPU freelist'lerinin her biri farklı bir şekillendirme tarifi gerektirir;
mass-allocation reclaim varyantı için heap-spray'e bak.
Detection¶
Grooming'in kendisi bir hata üretmez. Tespit edilebilir olan, mümkün kıldığı
corruption'dır — ASan heap-buffer-overflow/heap-use-after-free ya da
corrupted size vs. prev_size gibi glibc integrity abort'ları.
Mitigation¶
Allocator randomization/hardening'i (heap layout randomization, randomize edilmiş slab/bucket cache'leri), safe-unlinking ve bin integrity check'leri, ve komşuluğun daha az işe yaraması için attacker-influenced allocation'ları hassas object'lerden ayırmak.