Skip to content

Page Protection Layer (PPL) bypass via debug registers

PPL-protected physical memory'ye yazmak için undocumented CPU/SoC MMIO debug register'larını istismar ederek Apple'ın hardware page-protection boundary'sini yenmek (Operation Triangulation, CVE-2023-38606).

Mechanism

Note

Apple'ın Page Protection Layer (PPL)'ı, kernel'in üstünde oturan hardware-assisted bir boundary'dir: kernel read/write ile bile, bir attacker page table'ları, code-signing state'ini veya diğer PPL-owned page'leri doğrudan modifiye edemez, çünkü MMU ve küçük bir güvenilir PPL monitor'ü o physical bölgelere yapılan her write'ı gate'ler. PPL'in zorladığı invariant şudur: "yalnızca kendi korunan execution mode'unda çalışan PPL kodu, korunan physical page'leri mutate edebilir."

Bypass çalışır çünkü, normal MMU-checked store path'inden geçmeden arbitrary physical adreslere yazabilen ayrı, undocumented bir hardware path'i vardır. Etkilenen Apple A12–A16 SoC'lerinde, bir blok MMIO register'ı (GPU coprocessor ile ilişkili ve DeviceTree'de tanımlanmamış) bir {destination physical address, data, integrity hash} tuple'ı kabul eder ve write'ı doğrudan gerçekleştirir. PPL yalnızca normal CPU store'larına karşı koruduğu için, bu yan kapı, savunması hiç söylenmemiş olan boundary'yi geçer. Bu, physical memory'ye ikinci bir writer'ın, tek, aracılı bir write path'i varsayan bir access-control invariant'ını geçersiz kıldığı bir bug sınıfıdır.

Walkthrough

Üst düzey, Kaspersky'nin CVE-2023-38606'ya dair public Securelist disclosure'undan. Attacker zaten bir kernel read/write primitive'ine sahiptir ama korunan page'leri patch'lemekten PPL tarafından engellenmiştir.

Kavramsal register etkileşimi (gerçek offset'ler değil)
# Undocumented MMIO blocks (public, from the writeup):
#   0x206040000  -> init / coprocessor enable
#   0x206140000  -> control / enable-disable of the write feature
#   0x206150000  -> data submission registers

coproc_init(0x206040000)             # coprocessor init / halt state
enable_feature(0x206140000)          # arm the write feature (control register)
for chunk in payload_blocks:         # data submitted in fixed-size blocks
    h = ecc_hash(chunk)              # custom Hamming/ECC over the block
    submit(dst_phys, chunk, h)       # write tuple to data registers
disable_feature(0x206140000)         # tear down, restore state
  • Bu feature, destination physical address'in yanında doğru bir integrity hash (her data block üzerinde custom bir Hamming/ECC code) gerektirir — muhtemelen bir security control değil, bir debug/test feature'ı için anti-corruption check'i.
  • Bu path'i kullanarak, zincir, normal bir kernel store için reddedilecek olan PPL-protected page-table entry'lerini patch'ler. Bu, bir kernel R/W'yi hardware page-protection layer'ının tam bir bypass'ına dönüştürür.
  • Operation Triangulation'da bu, bir zero-click iMessage zincirindeki bir halkaydı; PPL bypass'ı, implant'a kalan memory protection'larını etkisiz hale getirme ve persist etme yeteneği verdi.

Detection

  • GPU/coprocessor panic'leri: writeup, bu register'lara dokunmanın coprocessor fault'larını (örn. "GFX SERROR Exception") tetikleyebileceğine dikkat çeker. Panic log'larında beklenmedik GPU SERROR veya coprocessor panic string'leri adli bir sinyaldir.
  • Crash/panic log incelemesi: yönetilen filolar için, aynı zaman dilimi etrafında şüpheli process aktivitesiyle (örn. IMAgent, headless Safari render'ları) ilişkili GPU exception'ları için kernel panic log'larını topla ve incele.
  • iOS forensic timelining: Operation Triangulation artifact'ları Shutdown.log, process spawn'larının timeline'ı ve Kaspersky tarafından yayınlanan network IoC'ler üzerinden açığa çıkarıldı — PPL bypass'ının kendisi sessizdir, bu yüzden detection çevreleyen zincire ve panic-log kalıntısına dayanır.
  • Telemetri patch'lenmiş davranışı yansıtsın diye cihazları güncel tut; bu path'i çalıştıran unpatched bir cihaz, temeldeki maruziyettir.

Mitigation

Warning

Bu, sevk edilen bir SoC üzerinde bir hardware feature'ıydı; software tek başına onu tam olarak kapatamazdı. Apple'ın fix'i (iOS 16.6 / CVE-2023-38606), undocumented register'ları attacker-reachable olarak ele alıp gate'leyerek etkilenen MMIO aralıklarına erişimi engelledi.

  • Patch: CVE-2023-38606'yı (ve eşlik eden Triangulation CVE'leri CVE-2023-32434, CVE-2023-32435, CVE-2023-41990) ele alan iOS güncellemesini uygula.
  • Hardware dersi / hardening: physical memory'ye yazabilen undocumented "security through obscurity" debug/test path'leri, production silicon'da devre dışı bırakılmalı veya access-controlled olmalıdır; DeviceTree/firmware, böyle MMIO bloklarını daha az privileged context'lerden erişilebilir bırakmamalıdır.
  • Defense in depth: PPL-tarzı korumalar, korunan physical page'lere yapılan tüm DMA/MMIO write path'lerinin threat model'in parçası olduğunu varsaymalı, yalnızca CPU store'larını değil — ilgili kernel-level R/W istismarına PTE overwrite for SMEP/NX bypass'ta bak.

References