Trigon (CVE-2023-32434)¶
XNU'nun
mach_make_memory_entry_64memory-entry bounds check'indeki, Operation Triangulation'da kullanılan ve iOS/macOS'ta deterministik bir PUAF-tarzı kernel read/write primitive'i veren bir integer overflow.
Mechanism¶
Bug class: bir Mach memory-entry bounds check'inde integer overflow
XNU, user space'in mach_make_memory_entry_64 / mach_make_memory_entry_internal üzerinden named memory entry'ler (bir address space'in aralıklarına handle'lar) oluşturmasına izin verir. Bir parent entry'den bir sub-entry oyulduğunda, kernel istenen window'un parent'ın içine sığdığını doğrular. Açıklanan root cause, bu validation'ın attacker'ın etkilediği 64-bit miktarların bir unchecked addition'ı olmasıdır; kavramsal olarak şu biçimde:
/* representative of the vulnerable check */
if ((offset + *size + parent_entry->data_offset) > parent_entry->size)
return KERN_INVALID_ARGUMENT;
offset ve size caller tarafından kontrol edildiği ve toplam modüler 64-bit aritmetikte (CWE-190) hesaplandığı için, bir attacker 2^64'ün ötesine wrap eden değerler seçebilir. Maksimuma yakın bir size (örn. 0xFFFF…C000), küçük bir offset ile birleştiğinde offset + *size'ın > parent_entry->size testini geçen ufak bir sayıya overflow etmesini sağlar. Kernel sonra, nominal olarak parent'tan astronomik miktarda daha fazla memory'yi kapsayan bir memory entry'ye güvenir (writeup'lar ~18 PB'lik bir aralıktan bahseder).
Kırılan güvenlik sınırı virtual-to-physical mapping invariant'ıdır: backing aralığı parent'ından daha büyük olan bir memory entry, daha sonra process'e hiç verilmemiş physical page'lere referans verecek şekilde map'lenebilir. (Kernel page-table page'lerini koruyan panic-on-OOB check'leri tetikleyecek olan) "internal" flag'inden kaçınmakla birleştiğinde, aşırı boyutlu entry, arbitrary physical address'leri process'e map etmenin bir yolu haline gelir; bu da heap metadata'sını asla corrupt etmeyen ve asla panic vermeyen deterministik bir kernel R/W primitive'inin temelidir.
Walkthrough¶
Bu, kamuya dokümante edilmiş Trigon chain'inin (alfiecg_dev) kavramsal yeniden inşasıdır. Bilinçli olarak yüksek seviyelidir — offset veya gadget chain yok.
- Aşırı boyutlu bir memory entry forge et. Memory-entry creation path'ini, bounds check'i overflow edecek şekilde seçilmiş bir
offset/sizeçiftiyle çağır; parent olarak bir graphics/IOSurface destekli object kullan ki entry non-internalolsun ve kernel page-table page'lerini koruyan panic check'lerinden kaçınsın. - Arbitrary physical memory map'le. Forge edilmiş entry'yi map'le ve aşırı büyük window'u kullanarak parent'ın gerçek backing'inin dışındaki physical address'lere referans ver. Bir
MAPPING_BASE, zaten map'lenmiş memory içinde bilinen handoff yapılarını (DRAM sınırlarını) bularak dinamik olarak türetilir; böylece bir hedef physical address o base'den bir offset olarak erişilir. - Kernel'i bul. KTRR ile korunan A10(X) sınıfı cihazlarda, writeup kernel'in physical bölgesini sınırlamak için MMIO limit register'larını okur, sonra Mach-O header'ını (
MH_EXECUTE) tarar ve kernel virtual base'ini__TEXTsegment'inden geri elde eder. - Stable kernel R/W. Page table'ları doğrudan okumak (ki bu panic verir) yerine teknik, page-table olmayan page'leri bulmak için physical-to-virtual defterini yürür, orada yaşayan IOSurface object'lerini belirler ve kontrollü kernel read/write elde etmek için onların pointer'larını corrupt eder.
Savunucular için \"deterministik\" neden önemli
Race- veya heap-corruption tabanlı exploit'lerin aksine, bu chain asla başarısız olmayan ve asla panic vermeyen olarak tarif edilir. Sonradan tespit edilecek hiçbir crash artifact'ı yoktur — exploit'in gizliliği tam olarak blue team'lerin sıklıkla güvendiği kararsızlığın yokluğudur. Bu nedenle detection panic loglarına değil, patch durumuna ve davranışsal telemetriye dayanmalıdır.
Bu primitive'in genelleştirdiği page-UAF-tarzı primitive sınıfı için puaf-primitive.md'ye, page-uaf.md'ye ve böyle R/W primitive'lerinin beslediği türden tam-kernel-kontrol hedefi için kernel-task-port.md'a da bak.
Detection¶
- Önce patch / versiyon telemetrisi. Düzeltilmiş build'lerin (iOS/iPadOS 15.7.7 veya 16.5.1; macOS 11.7.8 / 12.6.7 / 13.4.1; watchOS 8.8.1 / 9.5.2) altındaki herhangi bir cihaz açıktır. Güncel olmayan OS build'lerini işaretleyen MDM ve envanter tooling'i en güvenilir sinyaldir.
- Operation Triangulation IOC'leri. Bu bug, Triangulation chain'i içinde dağıtıldı; Kaspersky ve Apple ağ ve cihaz üzerinde göstergeler yayınladı (örn. anormal
Data Usage/networkd desenleri, şüpheli process'ler ve triangle_check artifact'ları). Bug'ın kendisini değil, o yayınlanan IOC kümeleriyle av yap. - Başarılı bir R/W primitive'inin davranışsal anomalileri. Aniden kernel-seviyesi yetenek kazanan bir process, downstream etkiler sergileyebilir — beklenmedik entitlement kullanımı, security daemon'larına tampering veya persistence girişimleri — ki memory bug iz bırakmadığında bile EDR/MDM compliance check'leri bunları yüzeye çıkarabilir.
- Crash logları burada büyük ölçüde sessizdir. Teknik deterministik olduğu için, olağan
kernel panic/Jetsamforensic izi güvenilmezdir; panic'lerin yokluğu, yokluğun kanıtı değildir.
Mitigation¶
- Vendor patch'ini uygula. Apple, memory-entry bounds check'ine iyileştirilmiş input validation ekleyerek CVE-2023-32434'ü düzeltti. Yukarıdaki düzeltilmiş build'lere güncellemek kesin mitigation'dır.
- Cihazları desteklenen-güncelleme durumunda tut MDM üzerinden ki acil patch'ler hızla insin; bu sınıftaki in-the-wild 0-day yalnızca OS güncellemesiyle kapatılır.
- Aynı donanımda çıtayı yükselten defense-in-depth: KTRR (read-only kernel text) ve PPL (Page Protection Layer), bir R/W primitive'inin yapabileceklerini kısıtlar — chain bunların etrafından dolaşmak zorunda kaldı; bu yüzden kernel text'i patch'lemek yerine physical mapping ve IOSurface object'lerini hedef alır. Lockdown Mode, böyle spyware tarafından hedef alınan yüksek riskli kullanıcılar için remote attack surface'i azaltır.
- Bug class için compiler/OS hardening: user'ın kontrol ettiği size/offset aritmetiğinde overflow-checked aritmetik ve saturating bounds check'leri, CWE-190 memory-entry karışıklıklarının altında yatan wrap'i önler.