Skip to content

machswap / machswap2 (CVE-2019-6225)

Ben Sparkes'in iOS 11–12.1.2 kernel exploit'leri: task_swap_mach_voucher()'daki bir MIG reference-counting bug'ını dangling bir voucher'a, sonra fake bir kernel task port'una (tfp0) çevirir.

Mechanism

Suistimal edilen invariant

Mach Interface Generator (MIG) stub'ları ve çağırdıkları rutinler, object reference count'larını tam dengede tutmalıdır: içeri geçirilen bir nesne, tam olarak retain edildiği kadar release edilir. task_swap_mach_voucher(), ipc_voucher reference counting'i yanlış ele aldı, dolayısıyla kernel hiç sahip olmadığı bir reference'ı drop edebildi — bir voucher'ı over-release edip, ona bir pointer çağıran thread'in ith_voucher field'ında hâlâ yaşarken onu free etti.

O dangling ipc_voucher boundary kırılmasıdır. Oradan machswap port-oriented tekniği uygular (mach-port-oriented-programming.md): freed voucher slot'unu attacker byte'larıyla reclaim et, bir adres disclose et ve kademeli olarak kernel'in kernel task port olarak ele aldığı bir nesne sahtele. Bu, voucher-swap.md (Brandon Azad) ile aynı bug ailesidir, farklı bir exploitation rotasıyla; strateji ayrıca daha erken v0rtex.md voucher çalışmasından da yararlanır.

Walkthrough

Tarihsel, patch'lenmiş (iOS 12.1.3) — yalnızca inceleme

Public README/survey'den kavramsal akış. Offset'ler ve zone boyutları version'a özgüdür ve atlanmıştır.

1. Voucher'ları spray'le ve free et. Çok sayıda ipc_voucher nesnesi allocate et, sonra over-release'i tetikle, böylece thread hâlâ ith_voucher üzerinden ona referans verirken bir voucher free edilir — klasik bir ../primitive/use-after-free.md.

Primitive'in şekli
spray ipc_voucher objects
call task_swap_mach_voucher -> extra release -> voucher freed
free the remaining sprayed vouchers, force zone GC
-> ith_voucher now dangles into a reusable slot

2. Reclaim et ve disclose et. Freed slot'u controlled data ile reallocate et, sonra thread_get_mach_voucher() çağır, böylece kernel bir pointer'ı (voucher'ın port'u) geri yazar — bir address leak'i ve sınırlı read'i bootstrap eder.

3. Bir fake port inşa et. Fake voucher'ın port field'ını attacker'ın tamamen kontrol ettiği bir region'a yönelt — machswap'te IOSurface property byte'ları, machswap2'de pipe buffer'ları — içeriği doğrudan düzenlenebilir bir port verir.

4. tfp0 sahtele. O controlled port'u bir fake task port'a şekillendir ve onu yukarı bir fake kernel task port'una oku, kernel memory üzerinde genel bir ../primitive/arbitrary-read-primitive.md ve ../primitive/arbitrary-write-primitive.md ver.

machswap vs machswap2

machswap, non-SMAP cihazları (A9 ve öncesi) hedefler: fake port'u user memory'ye yerleştirebilir çünkü kernel user page'leri dereference edebilir. machswap2, resmi README'ye göre daha geniş bir cihaz yelpazesinde (A7–A11) çalışır: fake-port backing'ini kernel memory'sinde (pipe buffer'ları) tutarak, machswap'in kapsamını SMAP-class cihazlara da genişletir — Apple'da SMAP muadili olan PAN (Privileged Access Never) A10 ile geldiği için SMAP-class kısım A10/A11'dir; A9 ve öncesi PAN'siz kalır. Kernel-backed fake port, PAN kernel'in user page'lere erişimini yasakladığında da geçerli olduğundan hem PAN'li hem PAN'siz cihazları kapsar.

Detection

  • Userspace'in task_swap_mach_voucher / voucher MIG rutinlerini yüksek hacimde egzersiz etmesi, ardından voucher-zone garbage collection gelmesi.
  • Voucher free'lerinin hemen ardından IOSurface property'leri ya da pipe buffer'ları yoluyla voucher slot'una boyutlanmış reclaim spray'leri.
  • Backing memory'si meşru port zone'ların dışına düşen bir task/kernel-task port (mach-port-oriented-programming.md ile paylaşılan fake-port imzası).

Mitigation

Apple tarafından fix'lendi

CVE-2019-6225, iOS 12.1.3'te MIG path'indeki voucher reference-count handling'i düzeltilerek patch'lendi.

  • MIG stub'larını ve callee'lerini dengeli retain/release için denetle (root fix).
  • Type-stable, isolated voucher/port zone'ları, freed bir slot'u yabancı data ile reclaim etmeyi zorlaştırır.
  • SMAP/PAN ve pointer authentication (../mitigation/arm-pointer-authentication.md), daha yeni donanımda user-backed-fake-port ve pointer-forging adımlarının çıtasını yükseltir.

References