Skip to content

Landa (kfd PUAF)

XNU'da bir VM-copy race'i (CVE-2023-41974), freed physical page'lere işaret eden dangling page-table entry'leri bırakır — kfd'nin kernel read/write'a çevirdiği bir physical use-after-free.

Mechanism

Note

Bir PUAF ("physical use-after-free"), sıradan bir UAF gibi dangling bir virtual pointer değildir; dangling bir physical page'dir. Attacker, bir physical page'e hâlâ read/write veren bir page-table entry (PTE) ile kalır, oysa aynı page çoktan kernel'in free list'ine geri dönmüştür. Kernel sonra o page'i herhangi bir subsystem'e verebilir, ama attacker onu stale PTE üzerinden okumaya ve yazmaya devam eder — user/kernel boundary'sini physical-memory düzeyinde geçer. Landa bu state'e XNU'nun VM copy path'indeki bir race ile ulaşır: P0 issue 2361'de olduğu gibi, destination-entry validation'ı ve physical page copy'si tek bir sürekli lock altında tutulmaz, dolayısıyla map lock işlem ortasında bırakılabilir. Landa, read-only mapping'ler yerine "in transition" state'indeki map entry'lerini hedefler.

Walkthrough

Public kfd landa.md writeup'ından kavramsal adımlar:

  1. Setup: copy'nin slow path'i almasını sağlamak için, dikkatle düzenlenmiş map entry'leriyle (biri yarışan wiring'i engellemek için wired, biri shared ve büyük bir clipped range) source ve destination virtual-memory region'larını crafted et.
  2. Race: source'tan destination'a bir VM copy'yi bir memory-wiring (mlock tarzı) spinner thread'i ile eşzamanlı çalıştır. Copy, bir page'i fiziksel kopyalamak için map lock'u bıraktığında, spinner object reference'ları uzlaştırılmadan önce page'leri temizlenmiş PTE'lere wire'lar.
  3. Trigger: son destination entry'sini deallocate et, böylece backing object'i mapping'leri kesmeden reap edilir. Physical page'ler free list'e dönerken PTE'ler onlara hâlâ read/write referans verir — PUAF.
  4. PUAF'tan R/W'ye: kfd-shared aşaması, freed page'leri kontrol edilebilir kernel nesneleri olarak reallocate eder, içlerindeki non-PAC pointer'ları syscall'lar yoluyla corrupt eder ve stabil arbitrary kernel read/write'ı bootstrap eder.
Neden tekrarlanabilir (illüstratif)

Kaybedilen bir race kernel state'ini corrupt etmeden bırakır, dolayısıyla attacker basitçe retry eder; kazanılan bir race sınırlı bir page kümesi üzerinde bir PUAF verir. Başarısızlık güvenli olduğu ve post-exploit temizlik gerekmediği için, tüm dizi kernel R/W elde edilene kadar döngüye girebilir.

Detection

  • iOS version/patch state'i en güçlü sinyaldir: iOS 17.0 / macOS 14.0'dan eski bir build'deki bir cihaz Landa'ya (CVE-2023-41974) karşı vulnerable'dır.
  • Exploitation zamanı civarında VM map entry consistency'sine, "page still has mappings"'e ya da PPL free-list check'lerine referans veren kernel panic'leri.
  • Retry edilen bir race ile tutarlı, tekrarlanan, hızlı panic-and-recover döngüleri; MDM/EDR telemetry'sinde beliren jailbreak/exploit artifact'ları ve beklenmedik kernel read/write yeteneği.

Mitigation

Warning

Bir PUAF, attacker'a ham physical-page read/write verir, ki bu büyük ölçüde virtual-memory mitigation'larını bypass eder (KASLR ve kalloc_type pek yardımcı olmaz; PPL bu tekniğe karşı "çok az şey yapar"). Alttaki race'i patch'lemek gerçek çözümdür.

  • Apple patch: vm_map copy race'i fix'lendi; Landa (CVE-2023-41974) iOS 17.0 ve macOS 14.0'da patch'lendi. Eşlik eden kfd PUAF'leri physpuppet ve smith daha önce patch'lendi (sırasıyla iOS 16.4 ve 16.5.1).
  • OS update rehberi: cihazları iOS 17.0 / macOS 14.0 veya sonrasında tut; fleet policy'si bilinen-vulnerable build'lerde takılı cihazların enrollment'ını engellemeli ya da işaretlemeli.
  • Data-pointer PAC ve zone_require, PUAF-to-R/W dönüşümünün maliyetini artırır ama primitive'i ortadan kaldırmaz — patch'lenmiş race kalıcı mitigation'dır.

References