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
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¶
- A survey of recent iOS kernel exploits — Project Zero — https://projectzero.google/2020/06/a-survey-of-recent-ios-kernel-exploits.html
- voucher_swap: Exploiting MIG reference counting in iOS 12 — Project Zero — https://projectzero.google/2019/01/voucherswap-exploiting-mig-reference.html
- machswap README (PsychoTea) — https://github.com/PsychoTea/machswap/blob/master/README.md
- machswap2 (PsychoTea) — https://github.com/PsychoTea/machswap2