Skip to content

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ış:

  1. Reference-counting açığını tetikle, böylece hâlâ named bir ipc_port free edilir ve port name üzerinden ulaşılabilir dangling bir object slot bırakır.
  2. 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").
  3. 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_task port'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_port use 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_type ve dedike port zone'ları, ipc_port allocation'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.

References