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
Opini Hacker News