Skip to content

kalloc zone grooming

XNU (iOS/macOS) kernel heap grooming'in kavramsal kataloğu: bir memory-safety bug'ının deterministik hale gelmesi için kalloc/zalloc zone'larını şekillendirme.

Mechanism

Ne yapar ve ne yapmaz

XNU'nun kalloc allocator'ı, allocation'ları boyuta göre bağımsız zone'lara (kalloc.16, kalloc.256, ...) bucket'layan zalloc zone allocator'ı üzerine kurulmuştur. Grooming kendi başına bir güvenlik sınırını geçmez — bu, hangi object'in bozuk slot'a bitişik düştüğünü (veya onu yeniden işgal ettiğini) kontrol ederek mevcut bir overflow / UAF / type confusion'ı güvenilir kılan şekillendirme adımıdır.

Walkthrough

Üst seviye (Project Zero "survey of recent iOS kernel exploits", Azeria Labs):

  1. Freelist'i tüket. Hedef boyutta çok sayıda object allocate et ki zalloc taze, bitişik page'ler oysun.
  2. Placeholder'lar + seçici free'lerle şekillendir. Bir allocation ve free deseni kullan ki seçilmiş bir victim zafiyetli object'in hemen ardında dursun (overflow) veya yeni-free edilmiş bir slot'u yeniden işgal etsin (UAF/type confusion). Yaygın groom araçları: Mach OOL message port array'leri, IOSurface buffer'ları, pipe buffer'ları.
  3. Zone GC'yi yönet. Zone garbage collection tüm-free chunk'ları reclaim edebilir ve zone'lar arası bellek taşıyabilir, bu yüzden attacker'lar ya onu tetiklemekten kaçınır ya da bozmadan önce konsolide etmek için onu kasıtlı olarak zorlar (tarihsel olarak mach_zone_force_gc, sonra port yıkımı / socket baskısı üzerinden).

Detection

  • Cihaz üzerinde corruption öncesi büyük ölçüde görünmez; sinyaller sonuçlardır: zone freelist / element-poisoning / zone_require ihlali loglarıyla kernel panic'leri.
  • Port array'lerinin veya IOSurface'lerin anormal yüksek-oranlı allocation'ı.
  • Panic-log triyajı: panic'teki zone adı ve poisoned-pattern byte'ları.

Mitigation

  • Freelist randomization, element poisoning, freelist canary'leri.
  • zone_require (bir object'in beklenen zone'undan geldiğini doğrular — sahte object'leri yener); per-CPU / sequestered zone'lar.
  • kalloc_type type-ayrımlı allocation'lar cross-type reallocation grooming'ini kırar.
  • PAC / PPL / KTRR, başarılı bir groom-artı-corrupt'ın nihayetinde neyi başarabileceğini sınırlar (bkz. kernel-task-port).

References