Mach port use-after-free (port UAF)¶
Lifecycle reference'ı yanlış yönetilen dangling bir
ipc_port, bir port name'i hâlâ ona referans verirken free edilir, sonra bir fake port sahtelemek ve kernel read/write'a ulaşmak için attacker data'sıyla reclaim edilir.
Mechanism¶
Note
Bir Mach port, XNU'da bir kernel nesnesiyle, struct ipc_port ile temsil edilir; dedike bir zone'dan allocate edilir ve reference counting ile yönetilir (reference field'ının atomik increment/decrement'i, kavramsal olarak ip_reference / ip_release). Bir process kernel nesnesine asla doğrudan dokunmaz: kernel'in nesneye çevirdiği bir port name (right) tutar. İhlal edilen invariant şudur: "nesne, ona referans veren right'lar kadar yaşar." Bir bug reference'ları yanlış saydığında — sızdırılmış bir decrement, count'ın sıfıra overflow'u ya da bir teardown race sırasında eksik bir lock — kernel, bir name/right hâlâ ona işaret ederken ipc_port'u free eder. User/kernel boundary geçilir çünkü userspace artık kernel'in yok olduğuna inandığı bir kernel object slot'una göre davranabilir.
Walkthrough¶
iOS kernel exploit'lerinin public Project Zero survey'inden alınan üst düzey kavramsal akış:
- Reference-counting açığını tetikle, böylece hâlâ named bir
ipc_portfree edilir ve port name üzerinden ulaşılabilir dangling bir object slot bırakır. - Aynı zone/page'e attacker-controlled kernel data spray'leyerek freed slot'u reclaim et, böylece dangling name artık içeriğini attacker'ın seçtiği bir memory'ye resolve eder (bir "fake port").
- Fake port'u daha güçlü bir port type gibi görünecek şekilde şekillendir, sonra arbitrary kernel read'e ve nihayetinde bir fake
kernel_taskport'una (tfp0 eşdeğeri control) escalate et.
Kavramsal reclamation (yalnızca illüstratif)
Named port'u free et, page'in geri dönüştürülmesi için zone garbage collection'ı zorla, sonra freed ipc_port slot'una controlled byte'lar düşürmek için out-of-line port array'leri / data buffer'ları spray'le. Dangling name artık attacker'ın seçtiği field'ları geri okur.
Bu tek bir CVE değil, generic bir primitive ailesidir — birçok tarihsel chain'in temelini oluşturur (ayrıca voucher-swap, async-wake, v0rtex'e bak).
Detection¶
- IPC/port teardown'a, zone integrity'sine ya da
ipc_portuse after free'ye referans veren iOS panic/crash logları; privilege kazanımından kısa süre önce aynı cihazda tekrarlanan kernel panic'leri. zone_require/ zone-pointer-validation panic string'leri, validation'ı geçemeyen bir fake-port reclamation girişimine işaret eder.- Jailbreak/exploit göstergeleri: beklenmedik task port'ların belirmesi,
kernel_task-benzeri erişim elde eden process'ler, integrity-check başarısızlıkları. - MDM / EDR telemetry'si: eski, bilinen-vulnerable OS build'lerinde takılı cihazlar; beklenmedik crash-report hacmi; bir crash'in ardından anormal entitlement ya da sandbox escape'leri.
Mitigation¶
Warning
Güvenilir bir port UAF tipik olarak tam kernel read/write verir; tek kalıcı savunma cihazları patch'lenmiş bir OS'te tutmaktır. tfp0'a ulaşan herhangi bir cihazı kernel düzeyinde ele geçirilmiş olarak ele al.
- Zone separation /
kalloc_typeve dedike port zone'ları,ipc_portallocation'larını ayırır, böylece freed slot'lar attacker-controlled nesnelerle reclaim edilmesi çok daha zor olur. zone_require, port olarak kullanılan pointer'ların gerçekten beklenen port zone'dan geldiğini doğrular ve birçok fake-port sahteciliğini engeller.- PAC, read/write'ı code execution'a çevirmenin maliyetini artırır; PPL, post-exploitation remapping'i sınırlamak için page table'ları korur.
- OS update rehberi: mevcut iOS/macOS update'lerini hemen uygula; alttaki reference-counting ve zone hardening yalnızca güncellenmiş build'lerde gönderilir.