Skip to content

Yalu102 (CVE-2017-2370)

iOS 10.x jailbreak'i (Luca Todesco / qwertyoruiopz), XNU'daki mach_voucher_extract_attr_recipe_trap içinde bir copyin length-confusion heap overflow üzerine kuruluydu; Google Project Zero tarafından kamuya açık biçimde analiz edildi.

Mechanism

Invariant: userspace'ten kopyalanan byte sayısı allocation ile eşleşmeli

Bir Mach trap (mach_voucher_extract_attr_recipe_trap), bir kernel buffer'ını bir değere göre boyutlandırarak allocate ediyor; ancak bir copy-paste refactoring hatası yüzünden copyin() çağrısını, daha önce okunmuş ve sınırlandırılmış boyut yerine indirection'dan geçmemiş, attacker-controlled bir size argümanıyla yapıyor. Sonuç klasik bir copy-length mismatch heap buffer overflow: allocation'ın tuttuğundan daha fazla attacker byte'ı yazılıyor.

Bu, sandboxed/unprivileged context'lerden erişilebilen standart bir Mach syscall olduğu için (yalnızca geçerli bir voucher port'u gerekiyor), bug user→kernel sınırını hiçbir özel privilege olmadan geçiyor. Exploit, linear ve kontrollü bir heap overflow'un Mach port mekanizmasını bozarak nasıl tam kernel R/W'ye dönüştüğünü gösteriyor — bir out-of-line (OOL) port array'i ve preallocate edilmiş bir port'un güvenilen size field'ını (ikm_size) overwrite ederek kernel'in sonraki mesajları yanlış boyutlandırmasını sağlıyor ve böylece sahte, attacker-controlled bir Mach port elde ediliyor.

Walkthrough

Üst düzey, Project Zero writeup'ından

  1. Unprivileged bir process'ten, savunmasız voucher trap'ini çağırarak bir kernel buffer allocate et ve kontrollü data ile dışına overflow yap. Userspace page'lerini map/unmap ederek kernel'in over-read'inin tahmin edilebilir bir boundary'de durmasını sağla, böylece overflow uzunluğunu kontrol et.
  2. Overflow'u, bitişik bir mesajdaki bir OOL ports array'ini overwrite edecek şekilde konumlandır; içeriği userspace'te duran sahte bir Mach port'a bir pointer yerleştir.
  3. Mesajı receive ederek sahte port'a bir send right elde et; field'ları artık attacker-controlled.
  4. Sahte port'u yeniden type'la (örn. bir clock port olarak) ve clock_sleep_trap()'i kötüye kullanarak bir kernel pointer'ı brute-force et / leak et; ardından bunu bir sahte task port'a dönüştürerek bellek oku (pid_for_task tarzı), kernel text base'ini bulmak için geriye doğru tara ve KASLR'ı kır.
  5. Arbitrary kernel read/write sağlayan bir sahte task port ile yetkiyi yükselt ve jailbreak'in patch'lerini yükle.

Detection

Mobile/EDR bağlamı

Yönetilen Apple filolarında pratik sinyaller dolaylıdır:

  • Jailbreak/integrity attestation (MDM, DeviceCheck, app tarafı kontroller) başarısız olması — beklenmedik root, devre dışı bırakılmış code-signing/AMFI ya da filesystem remount.
  • Pre-fix build'lerde mach_voucher_extract_attr_recipe fault'larına veya Mach port / mesaj corruption panic'lerine referans veren crash log'ları.
  • Patch'ler yayınlandıktan çok sonra hâlâ iOS ≤ 10.2'de takılı kalmış cihazlar, ayrıca sideload edilmiş jailbreak IPA'ları.

Mitigation

  • Apple temeldeki bug'ı düzeltti; patch'lenmiş bir iOS sürümüne güncelle (iOS 10.2.1 zaman diliminde düzeltildi). Bu sınıf, doğru sınırlandırılmış boyutu kopyalayarak kapatılıyor.
  • Sonraki iOS sürümlerinde bu exploit sınıfını sertleştiren defense in depth önlemleri: zone_require / kalloc zone ayrımı, PAC (pointer authentication) ve tek bir overflow'dan kaynaklanan port-fakery'ye direnen daha sıkı Mach port reference yönetimi.
  • MDM minimum-version politikaları ile güncel OS'i zorunlu kıl ve hassas uygulamalar için jailbreak detection kullan.

References