Yalu102 (CVE-2017-2370)¶
iOS 10.x jailbreak'i (Luca Todesco / qwertyoruiopz), XNU'daki
mach_voucher_extract_attr_recipe_trapiç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
- 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.
- 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.
- Mesajı receive ederek sahte port'a bir send right elde et; field'ları artık attacker-controlled.
- 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_tasktarzı), kernel text base'ini bulmak için geriye doğru tara ve KASLR'ı kır. - 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_recipefault'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.