Skip to content

kalloc_type

XNU/iOS'ta type tabanlı kernel-heap zone segregation'ı; uyumsuz memory-layout signature'larına sahip allocation'ları izole ederek use-after-free reallocation'ını kısıtlar.

Mechanism

Güvenlik invariant'ı

kalloc_type, free edilmiş bir object'in yalnızca memory-layout signature'ı onunla uyumlu başka bir object tarafından yeniden allocate edilebilmesini zorunlu kılar. Klasik UAF/type-confusion primitive'i — "object A'yı free et, sonra aynı boyutta object B'yi spray et ki B'nin data'sı A'nın free edilmiş pointer'ının hâlâ işaret ettiği yere düşsün" — A ile B'nin aynı heap zone'unu paylaşmasına bağlıdır. Her allocation'ı yalnızca boyutuna değil, type'ının pointer/data layout'una göre türetilmiş bir zone'a bağlayarak kalloc_type, bir saldırganın dangling object'i geri almak için kullanabileceği type kümesini küçük, randomize ve layout-uyumlu bir alt kümeye indirir. Bu, çıtayı yükseltir çünkü saldırgan artık kontrol ettiği data'nın (örn. bir OSData blob'u) aynı boyuttaki hassas bir object'in (örn. bir task) yanına ya da üzerine düşeceğini garanti edemez.

Bu özellik bir heap segregation hardening'idir; freelist randomization ve pointer-array isolation'ı tamamlar. Bug'ı durdurmaz; bug'ı kontrol edilebilir bir type confusion'a çeviren güvenilir groom'u ortadan kaldırır.

Walkthrough

Üst düzeyde, Apple'ın public write-up'ından ve açık kaynak XNU kalloc.c'sinden yola çıkarak:

  1. Compile-time type signature'ları. Bir compiler builtin'i (__builtin_xnu_type_signature), allocation type'ı başına her 8-byte granule için bir sınıflandırma yayar — pointer, data ya da signed/PAC pointer. Bu signature'lar, özel bir kernel section'ına yerleştirilen kalloc_type_view kayıtlarında tutulur.
  2. Boot-time zone ataması. Boot sırasında runtime, type'ları her size class içinde signature'a göre kümeler ve signature gruplarını sabit bir zone bütçesine randomize, eşit dağıtılmış bir atamayla yayar. Aynı signature'a sahip type'lar bir zone'u paylaşabilir; bucket üyeliği her boot'ta randomize edilir, yani layout cihazlar/boot'lar arasında deterministik değildir.
  3. Sequestering. Virtual address aralıkları, fiziksel page'ler zone garbage collection ile geri alındıktan sonra bile kendi köken zone'larına bağlı kalır. Bu yüzden free edilmiş bir virtual address farklı bir zone'a yeniden verilmez ve cross-zone (cross-type) reallocation bloklanır.
  4. Pointer-array isolation. Pointer array'leri kendi kheap'lerine yönlendirilir (bkz. pointer-array-isolation.md) çünkü pointer array'leri bilhassa güçlü bir exploitation primitive'idir; değişken uzunluklu allocation'lar kısıtlı header/element desenlerine uyar.
Public olarak belgelenmiş bypass sınıfları

Apple'ın kendi analizi residual zayıflıkları sıralar, yani bunlar defensive farkındalık maddeleridir, bir reçete değil: signature collision'ları (pek çok type aynı signature grubunu paylaşır, yani bir miktar aynı-layout reallocation hâlâ mümkün); data field'larında gizli pointer'lar (annotate edilmedikçe plain integer olarak tanımlanmış pointer-typed bir değer yeniden sınıflandırmadan kaçar); saf data submap'lerinin daha zayıf isolation'ı; ve kalan pointer/data union'ları. Her biri, önceki sınırsız aynı-boyut groom yerine dar bir uyumlu reclaim type kümesi bırakır.

Detection

  • Source/version kontrolü: kalloc_type iOS 15 ile geldi ve sonraki sürümlerde genişledi; bir kernelcache içinde kalloc_type_view / KALLOC_TYPE_* sembollerinin ve özel __DATA_CONST type-view section'ının varlığı bu özelliğe işaret eder.
  • Runtime davranışı: önceden başarılı olan type-confused reallocation girişimleri artık farklı bir zone'a düşer ya da sequester edilmiş virtual aralıklara çarpar; bu, bir araştırma cihazında sessiz overlap yerine allocation başarısızlıkları ya da beklenmedik panic'ler olarak görünür.
  • Telemetri: zone/element-type uyumsuzluklarına ya da freelist corruption kontrollerine atıf yapan kernel panic'leri, segregation invariant'larının ihlal edildiğinin sinyalidir.

Mitigation

  • kalloc_type'ı tek bir katman olarak ele al; onu freelist randomization (slab-freelist-randomization.md), pointer-array isolation (pointer-array-isolation.md) ve daha geniş kheap segregation (kheap-segregation.md) ile birlikte kullan.
  • Driver/kext yazarları için: pointer taşıyan field'ları annotate et ki compiler onları doğru sınıflandırabilsin; pointer'ları opak integer olarak tanımlamaktan kaçın.
  • Cihazları güncel OS sürümlerinde tut, çünkü Apple kalloc_type kapsamını giderek genişletti ve union/data-field boşluklarını sıkılaştırdı.
  • Control-flow ve pointer-integrity mitigation'larıyla (PAC) birleştir ki hayatta kalan bir overlap bile control-flow hijack'e çevrilmesi daha zor olsun.

References