Skip to content

extra_recipe (CVE-2017-2370)

XNU mach_voucher_extract_attr_recipe_trap'inde tam kontrollü bir kernel heap overflow'u; ipc_kmsg corruption'ı ve exception-oriented exploitation aracılığıyla kararlı bir iOS kernel read/write'ına dönüştürülür.

Mechanism

Kırılan invariant

CVE-2017-2370, XNU mach trap'i mach_voucher_extract_attr_recipe_trap'te tam kontrollü bir kernel heap buffer overflow'udur. Kod (host_create_mach_voucher_trap'ten copy-paste edilmiş) bir size'ı validate etti ama sonra copyin'e validate edilmiş, cap'lenmiş değer yerine attacker'ın verdiği args->recipe_size'ı geçirdi; böylece bir kalloc allocation'ı attacker-controlled byte'larla taşırılır. Kırılan invariant "kopyalanan byte == validate edilmiş/allocate edilmiş size"'tır. Overflow, bitişik bir ipc_kmsg'in ikm_size field'ını bozmak için kullanılır ve kernel'a bir message buffer'ının olduğundan büyük olduğunu düşündürür (bkz. ipc_kmsg ikm_size corruption).

Walkthrough

Project Zero writeup'ından alınmış kavramsal tekrar.

  1. Trap'e unprivileged bir context'ten ulaş ve bir kalloc buffer'ını kontrollü veriyle komşu bir ipc_kmsg'e taşır, onun ikm_size'ını boz.
  2. Heap'i öyle groom et ki bozulmuş ipc_kmsg, bir exception handler port'una iliştirilmiş preallocate edilmiş bir message buffer olsun.
  3. O port'u bir thread'in exception handler'ı olarak register et, sonra kasıtlı olarak bir thread'i fault'a sok (kontrollü register state); böylece kernel exception message'ını (attacker register değerleriyle) şişirilmiş ikm_size aracılığıyla out of bounds yazar — bug'ı yeniden tetiklemeden tekrarlanabilir kontrollü bir OOB write.
  4. Bunu kullanarak bitişik bir IOKit user-client object'ini (örn. bir AGXCommandQueue) boz, onun vtable'ını fake / kendine-referanslı bir object'e yönlendir.
  5. Fake object'i, iki kontrollü argümanla küçük bir memmove wrapper'ı çağıran bir OSSerializer::serialize tarzı call gadget'ı üzerinden sür.
  6. Hem arbitrary kernel read hem write elde etmek için argüman sıralamasını değiştir, sonra kararlı bir kernel memory R/W (ve canlı introspection) primitive'i kur.

Detection

  • Tarihsel bir iOS bug'ı (iOS 10.2.1'de düzeltildi). Cihaz üzerinde: tek bir uygulamadan tekrarlanan thread fault'ları/exception'ları ve Mach exception-port hareketliliği; IOKit user client'larına (AGX) ya da ipc_kmsg'e referans veren crash log'ları.
  • MDM/telemetry: end-of-life iOS < 10.2.1 çalıştıran cihazlar; jailbreak göstergeleri / beklenmedik task-port edinimi.
  • Crash-reporter ani artışları (teknik kasıtlı kontrollü crash'lere dayanır).
  • Non-system uygulamalardan low-level mach trap'leri / voucher API'larının anormal kullanımı.
  • Post-exploitation işaretleri: imzasız kod yürütme, sandbox escape'leri, persistence artefaktları.

Mitigation

  • Apple'ın fix'ini uygula (iOS 10.2.1 / karşılık gelen macOS güncellemesinde yamalandı) — size validation artık cap'lenmiş değeri kullanır.
  • Cihazları güncel iOS/macOS'ta tut; EOL OS sürümlerini MDM zorlamasıyla emekliye ayır.
  • Tekniği körelten platform savunmaları: zone/kalloc hardening'i, ipc_kmsg integrity check'leri ve vtable/pointer hijack'ine direnmek için yetenekli donanımda PAC / KTRR / KPP.
  • Güvenilmeyen uygulama kurulumunu kısıtla / sınırla; app review ve sandboxing'e güven.

References