4 poin oleh GN⁺ 2025-04-07 | 1 komentar | Bagikan ke WhatsApp

Awal perjalanan emulasi iOS 14 di QEMU

  • Awalnya menggunakan proyek open source alephsecurity/xnu-qemu-arm64, tetapi karena bersifat read-only, ada masalah kurangnya ekstensibilitas
  • Setelah itu beralih ke proyek TrungNguyen1909/qemu-t8030, yang memungkinkan pemanfaatan fitur-fitur berikut:
    • Fitur pemulihan iOS (dengan QEMU pendamping untuk koneksi USB)
    • Menjalankan iOS 14
    • Berbasis versi QEMU terbaru
    • Menyediakan dokumentasi wiki yang rinci
  • Berhasil mendapatkan akses shell dan SSH dengan memodifikasi launchd.plist, menjadikannya titik awal yang baik
  • Tujuannya adalah membangun lingkungan emulasi iOS yang sepenuhnya lengkap, termasuk UI dan kemampuan menjalankan aplikasi

Patch kernel dan adopsi PongoOS

  • Proyek t8030 menggunakan struktur yang mem-patch kernel di dalam QEMU → menimbulkan masalah pemeliharaan dan ekstensibilitas
  • Berdasarkan pengalaman jailbreak, strukturnya diubah untuk menerapkan patch checkra1n melalui PongoOS
  • Menjalankan PongoOS dengan memperbesar ukuran SRAM di QEMU, lalu menyuntikkan modul checkra1n-KPF
  • Saat boot, muncul isu FPU tidak dikonfigurasi karena fitur bootrom/iboot yang hilang, lalu diselesaikan dengan merujuk ke dokumentasi ARM
  • Setelah A13, PAC (Pointer Authentication) diperkenalkan sehingga beberapa patch menjadi tidak berlaku
  • Membandingkan biner sebelum dan sesudah adopsi PAC dengan contoh task_for_pid0 (tfp0)

Pengembangan alat otomatisasi patch kernel

  • Metode patch dinamis checkra1n yang ada sulit dibaca dan tidak nyaman dimodifikasi → diperkenalkan metode patch deklaratif berbasis teks
  • Membandingkan dua biner Mach-O untuk mengekstrak perbedaan assembly lalu menghasilkan patch teks
  • Setelah boot dengan Pongo, memori di-dump untuk menyusun ulang kernel → seluruh patch dirapikan ke dalam file teks dan diberi komentar

Rendering grafis: Metal vs rendering perangkat lunak

  • iOS melakukan seluruh rendering UI melalui API Metal → membutuhkan GPU
  • Karena emulasi GPU rumit, dipertimbangkan beberapa alternatif:
    • Rendering perangkat lunak
    • Meneruskan panggilan Metal ke perangkat fisik sebagai proxy
  • Di iOS 14, bootarg gpu=0 telah dihapus → perilaku fallback dikonfirmasi melalui analisis QuartzCore
  • Dengan mem-patch QuartzCore pada iPhone yang sudah dijailbreak, dipastikan rendering perangkat lunak berfungsi (lambat, tetapi memungkinkan)
  • Opsi proxy Metal juga sempat diuji, tetapi dihentikan karena kompleksitas Objective-C dan API

Debugging framebuffer dan IOSurface

  • QEMU t8030 tidak memiliki implementasi framebuffer → menggunakan fork ChefKissInc/QEMUAppleSilicon
  • Saat boot awal, logo Apple dan indikator progres terlihat, tetapi setelah itu layar menjadi hitam → debugging dimulai
  • Hasil analisis kext IOMFB menunjukkan ada dua mode:
    • Framebuffer dengan alamat tetap (untuk tampilan awal)
    • Konfigurasi multi-plane berbasis DMA
  • Selama boot sistem, mode berbasis DMA digunakan → pengaturan register kernel dikonfirmasi melalui trace di QEMU
  • Namun, tetap tidak ada output di layar

Menonaktifkan randomisasi alamat

  • Randomisasi alamat kernel dapat dinonaktifkan dalam kode inisialisasi board
  • Randomisasi di ruang pengguna dinonaktifkan dengan mem-patch _load_machfile
  • Cache dyld adalah biner besar yang berisi semua pustaka dinamis → dimuat ke alamat tetap saat boot
  • Membuat alat C untuk melakukan dlopen lalu memeriksa alamat dengan fungsi _dyld_*
  • Memungkinkan debugging pustaka dyld dengan GDB → perhatian khusus diberikan pada IOMFB, SpringBoard, dan QuartzCore

Akses log USB dan bypass lockdownd

  • Di perangkat fisik, log sistem dapat dikumpulkan dengan idevicesyslog → membutuhkan autentikasi USB
  • lockdownd menggunakan keybag yang memerlukan SEP untuk penyimpanan kunci → tidak ada di emulator
  • Menyisipkan shellcode ke lokasi fungsi yang ada agar kunci dimuat langsung dari file key
  • Berhasil melewati autentikasi kunci antara QEMU yang terhubung lewat USB → log dapat dikumpulkan
  • Terkonfirmasi bahwa QuartzCore diinisialisasi dengan benar dan rendering perangkat lunak digunakan

Bypass PAC (Pointer Authentication)

  • Saat memodifikasi backboardd, terjadi error PAC → fitur keamanan yang diperkenalkan di ARMv8.3
  • Mengganti instruksi PAC dengan NOP terlalu invasif
  • Instruksi PAC dapat dikompilasi dengan cara yang kompatibel → jika QEMU mengabaikan PAC, eksekusi tetap bisa berjalan
  • QEMU 7 tidak dapat melewati PAC → migrasi ke QEMU 8.2.1
  • Diperlukan porting banyak kode kustom QEMU, termasuk instruksi khusus Apple dan exception level GL
  • Hasilnya, iOS berhasil boot di QEMU 8 dan PAC dapat dinonaktifkan secara efektif

Verifikasi backboardd dan output grafis

  • backboardd berjalan tetapi tidak ada tampilan di layar → ada berbagai kemungkinan penyebab
  • Bahkan setelah melakukan dump memori DMA, tidak ada output yang bermakna
  • Alamat diperiksa di iosurface_lock dan frame di-dump, tetapi tampaknya dikirim ke GPU dalam bentuk terkompresi
  • Di iPhone X (t8015), output tanpa kompresi terkonfirmasi → DTB QEMU dimodifikasi untuk mengubah chip-id dari t8030 → t8015
  • Hasilnya, logo Apple muncul setelah boot

Melacak progress bar dan error sistem

  • Setelah logo, progress bar putih ditampilkan → berhenti di 90%
  • Dari analisis log ditemukan masalah pada mobileactivationd dan SpringBoardFoundation → setelah dipatch, UI berubah
  • Untuk menyelesaikan masalah boot yang macet, diperlukan analisis banyak log sistem

Otomatisasi patch cache dyld dan ruang pengguna

  • Seperti pada kernel, ruang pengguna juga menggunakan metode patch berbasis teks
  • Cache dyld berukuran 2GB sehingga tidak efisien untuk dimodifikasi → alat internal ditingkatkan untuk:
    • Melacak offset di dalam dyld
    • Mem-patch langsung posisi tertentu dengan perintah dd
  • Patch untuk melewati pemeriksaan tanda tangan kernel juga perlu dilakukan secara paralel

Menjalankan PreBoard dan memverifikasi UI

  • Aplikasi PreBoard adalah aplikasi sistem yang ditampilkan saat terjadi error → dapat dijalankan secara langsung
  • Menambahkan server VNC dan mencoba membuka kunci layar dengan keyboard
  • Setelah unlock, framework vImage menggunakan instruksi AMX (Apple Matrix Coprocessor) → tidak didukung oleh QEMU
  • Masalah diselesaikan dengan mem-patch jalur fallback perangkat lunak di vImage
  • Setelah patch, berhasil menampilkan layar hingga tahap bisa memasukkan teks

Kesimpulan

  • Sudah mencapai tepat sebelum menjalankan SpringBoard → kini hanya masalah waktu sampai UI sepenuhnya berjalan
  • Melakukan analisis dan patch dari berbagai sisi, mencakup kernel, ruang pengguna, grafis, dan fitur keamanan seperti PAC
  • Mengonfirmasi kemungkinan lingkungan praktis berbasis QEMU untuk debugging dan pengujian aplikasi iOS

1 komentar

 
GN⁺ 2025-04-07
Opini Hacker News