Skip to content

Kernel task port (tfp0)

iOS/macOS kernel task port'unun kavramsal kataloğu — kernel_task'in Mach port'una arbitrary kernel read/write veren bir send right, kanonik post-exploitation "kazanım" primitive'i.

Mechanism

Neden tamamen total

Her XNU task bir task port ile temsil edilir; bir task'in port'una bir send right, sahibinin task/VM Mach API'lerini ona karşı çağırmasına izin verir. Kernel'in kendisi de bir task'tir (kernel_task, PID 0). Dolayısıyla kernel_task'in port'una bir send right, bir user process'inin mach_vm_read / mach_vm_write (ve mach_vm_allocate) çağrılarını kernel address space'ine karşı yapmasına izin verir — arbitrary kernel memory read/write, artı code injection. task_for_pid(0) tarihsel API path'idir, "tfp0" adı buradan gelir.

Bu, user/kernel isolation boundary'sini tamamen geçer: bir kez ele geçirildiğinde, sonraki her adım (patching, injection, persistence) sadece memory access'tir.

Walkthrough

Üst düzey (iPhone Wiki, Project Zero):

  1. İnşa et, isteme. Apple, iOS'ta gerçek kernel_task port'unu user space'ten esirger, dolayısıyla modern exploit'ler vm_map field'ı kernel'in map'ine işaret eden bir fake task / fake Mach port sahteler (mach-port-use-after-free'e bak).
  2. O fake port'a bir send right ekle, attacker'ın port namespace'ine.
  3. Kullan. mach_vm_read / mach_vm_write temiz, arbitrary R/W verir; exploitation fiilen bitmiştir.
  4. (Eski jailbreak'ler bunun yerine kernel'i task_for_pid(0)'ı tekrar izin verecek şekilde patch'lerdi — "tfp0 patch".)

Detection

  • Non-kernel bir process'te kullanılabilir bir kernel_task send right'ı tek başına anomalidir.
  • Fake-port / zone_require validation'dan gelen panic'ler.
  • Modified kernel text ya da task structure'ları bulan integrity check'leri; macOS'ta beklenmedik caller'lardan processor-set API'leri yoluyla kernel_task istekleri.

Mitigation

  • Apple gerçek kernel_task port'una erişimi hardened/zeroed yaptı; zone_require ve fake-port hardening sahte task port'larını çok daha zor kılar.
  • PAC, kernel pointer'larını/vtable'larını imzalar ve R/W'den code execution'a pivot'u engeller.
  • PPL, kernel R/W ile bile page table'ları / code-signing state'ini korur; KTRR kernel text'i donanımsal read-only yapar.
  • iOS 13/14 sonrası eğilim, bir kernel bug'ından sonra tek bir global tfp0'ı açığa çıkarmama yönünde.

References