Skip to content

Pointer-array isolation (OOL ports kheap)

XNU, pointer array'lerini — özellikle out-of-line (OOL) Mach port array'lerini — kendi özel kernel heap'lerine (kheap / pointer zone'ları) ayırır; böylece bu tarihsel olarak evrensel use-after-free reallocation primitive'i artık keyfi data object'leriyle karıştırılamaz.

Mechanism

Sınır neden tutuyor

Birçok XNU exploit'i aynı tarifi izler: bir victim object'i free et, sonra aynı belleği saldırgan kontrolündeki byte'larla yeniden tahsis edip sahte bir object forge et (klasik bir use-after-free reclaim'i). Pointer array'leri, özellikle out-of-line Mach port descriptor'ları (ipc_kmsg OOL port'ları), ideal bir generic reclaim object'i oluşturdu: saldırgan, kernel'in daha sonra pointer olarak dereference ettiği büyük, boyutu esnek bir 8-byte slot array'ini kontrol eder — kontrollü pointer değerlerini bir free edilmiş slot'a yerleştirmenin neredeyse evrensel bir yolu.

Pointer-array isolation, bu allocation'ları sıradan data buffer'larından ayrı tutulan kendi kheap'lerine / pointer zone kümelerine taşır. Zone-based sequestering yalnızca belleğin aynı zone'dan gelen allocation'larca reuse edilmesine izin verdiği için, bir data zone'undaki free edilmiş bir object artık bir OOL-ports spray'i tarafından reclaim edilemez ve tersi. Security sınırı spatial type separation'dır: belirli bir free edilmiş allocation'ı muhtemelen alias'layabilecek object kümesi dramatik biçimde küçülür; "tek spray hepsine uyar" primitive'ini kaldırır. Bu, kalloc_type type tabanlı segregation'ı ve kheap segregation'ı tamamlar; pointer array'leri özel muamele görür çünkü hepsi aynı type signature'ını paylaşır ve dolayısıyla yalnızca signature ile çeşitlendirilemez — onlara bir kheap adanarak ayrılırlar.

Walkthrough

Yüksek seviyeli, kavramsal (Apple'ın XNU memory-safety yazısından):

  1. Allocation'ları sınıflandır. Allocator, pointer-array allocation'larını (örn. OOL port array'leri) genel data'dan ayırır; onları paylaşılan data kheap'i yerine özel pointer zone'larına / bir pointer kheap'ine yönlendirir.
  2. Zone'u cache'le. Değişken boyutlu pointer-array allocation'ları tek bir sabit zone'a map'lenmez, bu yüzden hızlı runtime yönlendirmesi için seçilen kheap'in başlangıcının ZONE_ID_* / zone id'si cache'lenir.
  3. Reuse'u kısıtla. Bir data zone'undaki free edilmiş slot'lar yalnızca data allocation'larına geri verilir; OOL port'ları spray eden bir saldırgan, victim data object'ine değil, pointer kheap'ine düşer.
  4. Vuln'a özel iş zorla. Generic spray ortadan kalkınca, bir saldırganın victim ile aynı zone'da bir reclaim object'i bulması gerekir — çok daha az aday, çoğu zaman hiç.
Yalnızca kavramsal yönlendirme

/* general data  -> data kheap / kalloc.type.* zone   */
/* OOL port array -> dedicated pointer kheap (ZONE_ID_*) */
Illustrative shape only — no struct layouts, zone constants, or grooming recipes.

Warning

Isolation, reuse'u küçültür ama ortadan kaldırmaz: bir saldırgan hâlâ free edilmiş bir pointer-array'i başka bir pointer-array ile reclaim etmeye çalışabilir veya zone-içi adaylara pivot edebilir. Etkinlik, doğru allocator benimsemesine ve saldırganların same-zone confusion hedefinden yoksun olmasına bağlıdır — kalloc zone grooming'e bakın.

Detection

  • Yönetilen Apple platformlarında bu büyük ölçüde önleyici bir allocator özelliğidir; runtime strict-free / zone-mismatch kontrolleri, bir object yanlış zone'a free edildiğinde panic verir; bu da corruption veya exploitation denemelerine işaret edebilir.
  • Beklenmedik zone'la ilgili kernel panic'leri ya da yoğun OOL-port / Mach-message spray desenleri, ilişkilendirmeye değer anormalliklerdir.

Mitigation

  • XNU allocator özelliklerini konuşlandırın / güncel tutun: pointer-array isolation, kalloc_type ve kheap segregation modern iOS/macOS ile gelir — desteklenen sürümlerde kalın.
  • Kernel geliştiricileri için: pointer array'lerini typed/pointer allocation API'leri üzerinden yönlendirin ve -Wxnu-typed-allocators'a kulak verin; böylece yeni kod generic bir data zone'una düşmek yerine isolation'ı miras alır.
  • Trust-sensitive kullanım öncesinde object'lerin beklenen zone'larında yaşadığını doğrulamak için zone-require ile birleştirin.
  • Bilinen-bypass uyarısı: segregation maliyeti yükseltir ama bir same-zone reclaim hedefi veya isolate edilmemiş bir allocation site'ı hâlâ UAF exploitation'ı mümkün kılabilir.

References