Jailbreak iPhone 4 Bagian 1: Mendapatkan Titik Masuk
(axleos.com)- gala adalah proyek untuk mengimplementasikan sendiri jailbreak iOS 4 untuk iPhone 4, dan bagian 1 berfokus pada proses memperoleh eksekusi kode awal dengan memanfaatkan kerentanan SecureROM pada perangkat lama
- Proses boot iOS dimulai dari SecureROM yang memverifikasi LLB atau iBSS, lalu tahap-tahap berikutnya memverifikasi tahap selanjutnya dalam sebuah chain of trust; SecureROM tidak dapat diganti lewat pembaruan setelah perangkat diproduksi
- limera1n menargetkan SecureROM pada SoC A4 dan menyerang perangkat dalam mode DFU yang sedang menunggu pengiriman iBSS; crash yang ditemukan lewat fuzzing pesan kontrol USB tampaknya berujung pada heap overflow dan eksekusi shellcode
- Dengan merujuk pada SecureROM dumper dari pod2g, alur yang memakai area komunikasi
0x84000000dan permintaan baca USB0xA1:2diimplementasikan ulang untuk mengambil dump SecureROM dan nilai debug ke host - Pipeline dibuat untuk mengekstrak payload yang ditulis dalam Rust dari
__TEXT,__textpada Mach-O sebagai shellcode lalu menjalankannya, tetapi karena string statis ditempatkan di__const, diperlukan pengalamatan relatif terhadap instruction pointer dan penempatan melalui assembly
Titik awal proyek jailbreak iPhone 4
- gala adalah proyek untuk membuat jailbreak iOS 4 untuk iPhone 4, dan dokumen ini adalah bagian 1, “Gaining Entry”
- Pengalaman sebelumnya dalam pengembangan tweak iOS berlanjut ke distribusi Cydia, perubahan fitur SpringBoard, penggunaan langsung runtime Objective-C, dan reverse engineering binary closed-source
- Tujuan menulis jailbreak sendiri adalah memahami bagaimana proses jailbreak benar-benar bekerja
- Pekerjaan ini sangat bergantung pada pengetahuan yang dibagikan sebagai open source oleh p0sixninja dan axi0mX
Memilih iPhone lama dan kerentanan Boot ROM
- Langkah pertama adalah membeli iPhone 4 dan iPhone 3GS di eBay
- Karena Xcode terbaru tidak mengizinkan target versi iOS lama, jalur membangun dan memasang aplikasi dengan cara era 2010-an segera tertutup
- Opsi memasang Mac OS X dan Xcode lama di VM juga dipertimbangkan, tetapi dihentikan
- Tidak jelas juga apakah Apple masih akan menandatangani binary dengan target iOS legacy
- Alternatifnya adalah menargetkan kerentanan Boot ROM secara langsung
- Ini dapat dicoba hanya dengan kode yang berinteraksi dengan perangkat lewat USB dari mesin host, tanpa toolchain lama atau VM
- Kode exploit limera1n ditemukan di bagian
Vulnerabilities and Exploitspada iPhone Wiki
SecureROM dan chain of trust boot iOS
- Dalam istilah Apple, SecureROM adalah tahap pertama proses boot iOS, dan ia memulai tahap boot berikutnya
- SecureROM dapat memuat dua komponen
- Saat boot normal, ia mem-boot
Low Level Bootloader, yaitu LLB, dari partisi disk di NOR - Saat terhubung ke komputer lewat USB dalam mode DFU, ia dapat menerima bootloader
iBoot Single Stage, yaitu iBSS, dalam prosesRestore iPhone
- Saat boot normal, ia mem-boot
- SecureROM memastikan LLB atau iBSS adalah image tepercaya yang ditandatangani Apple
- Setelah itu, LLB dan iBSS juga memverifikasi tahap berikutnya yang mereka muat, membentuk chain of trust
- Karena SecureROM adalah tahap pertama, ia tidak diverifikasi oleh tahap sebelumnya, dan ditanamkan ke memori read-only saat produksi
- Tahap lain dapat diganti lewat pembaruan iOS
- Kerentanan pada versi SecureROM tertentu akan tetap ada secara permanen pada perangkat yang diproduksi dengan versi tersebut
Mendapatkan eksekusi kode pada perangkat DFU dengan limera1n
- limera1n adalah exploit SecureROM yang dipublikasikan oleh geohot pada 2010 dan dikemas sebagai alat jailbreak bernama sama
- limera1n dapat digunakan ketika perangkat dalam mode DFU sedang menunggu menerima iBSS dari host melalui USB
- Karena SecureROM yang disertakan dalam SoC A4 rentan, iPhone 4 menjadi target yang sesuai
- Cara kerja persis limera1n belum sepenuhnya terdokumentasi secara publik
- geohot mengatakan ia tidak tahu mengapa exploit itu bekerja
- p0sixninja menebak teorinya
- Crash ditemukan melalui fuzzing pesan kontrol USB, dan tampaknya merupakan race condition yang berujung pada heap overflow serta memungkinkan injeksi dan eksekusi shellcode
Membaca memori dari perangkat mode DFU
- SecureROM dumper dari pod2g menjadi implementasi referensi yang memperlihatkan implementasi limera1n, contoh payload, dan cara membaca memori berbasis USB
- SecureROM dumper menyalin memori
0x0tempat SecureROM dipetakan ke area penerimaan USB, lalu host membaca data dengan pesan kontrol USB - Alur yang dipahami adalah sebagai berikut
- MMU pada A4 memetakan awal SRAM ke
0x84000000 - Host dapat mengirim image iBSS dalam potongan-potongan dengan paket kontrol USB berisi
request type 0x21,request ID 1 - Data ini disalin ke SRAM mulai dari
0x84000000, dan SecureROM mempertahankan counter internal yang melacak posisi salinan paket berikutnya - Perangkat juga merespons paket kontrol dengan
request type 0xA1,request ID 2, dan mengirim isi memori di0x84000000ke host
- MMU pada A4 memetakan awal SRAM ke
- Fitur baca ini sangat berguna saat dapat mengeksekusi kode di perangkat
- Payload menyalin data yang diinginkan ke
0x84000000 - Host dapat mengambil data tersebut dengan permintaan baca
A1:2
- Payload menyalin data yang diinginkan ke
- Slide presentasi Hack In the Box Malaysia 2013 dari p0sixninja menyebut SecureROM dumper pod2g berbasis SHAtter, tetapi utilitas sebenarnya menggunakan implementasi limera1n
- Dump SecureROM berhasil dilakukan dengan implementasi limera1n sendiri
Debugging payload dengan 0x84000000
- Setelah mendapatkan eksekusi kode, perlu memastikan di mana shellcode dijalankan, di mana posisi stack, dan memori apa yang ditimpa shellcode
- Alur baca SecureROM dumper digunakan ulang untuk output debug
- Payload menyalin nilai instruction pointer dan stack pointer ke
0x84000000 - Kode di sisi host membaca kembali nilai tersebut dengan cara yang sama
- Cara ini berperan sebagai
print()sederhana melalui dump memori
- Payload menyalin nilai instruction pointer dan stack pointer ke
- Skrip otomatis men-dump beberapa word pertama di
0x84000000setelah exploit dijalankan dan menampilkannya di jendela output - Nilai yang dikonfirmasi menunjukkan lokasi eksekusi shellcode dan posisi stack
- Instruction pointer berada di sekitar
0x8402b048 - Stack pointer adalah
0x8403bfa0 - Stack pointer berada di dalam area stack umum yang disetel SecureROM, dan instruction pointer berada di dalam area image yang diterima
- Instruction pointer berada di sekitar
Payload Rust dan ekstraksi shellcode Mach-O
- Alih-alih menulis payload hanya dengan assembly, sistem build disusun untuk membangun payload Rust dan mengubahnya menjadi shellcode
- Rust menghentikan dukungan target
armv7-apple-iospada awal 2020, tetapirustupdapat digunakan untuk beralih ke toolchain lama yang masih mendukungnya - Kompilasi dari bahasa tingkat tinggi menghasilkan binary yang memuat bukan hanya machine code mentah, tetapi juga metadata, informasi pengaturan virtual address space, symbol table, dan informasi linker
- Untuk exploit, yang dibutuhkan hanyalah byte yang akan disuntikkan ke memori dan dilompatkan, sehingga yang diperlukan bukan seluruh Mach-O, melainkan hanya section
__textdari segmen__TEXT - strongarm adalah library analisis Mach-O, dan digunakan dalam sistem build untuk mem-parse Mach-O serta mengekstrak section
__TEXT,__textke sebuah file - Byte dari file yang diekstrak menjadi shellcode yang akan dijalankan di perangkat lewat limera1n
Linker dan masalah data statis
- Binary biasa menggunakan infrastruktur OS dan konvensi simbol entry point seperti
startatau_main, tetapi untuk keperluan shellcode ini simbol seperti itu tidak diperlukan - Secara default linker akan menghasilkan error jika tidak ada
_mainataustart - Dengan mengombinasikan opsi
-U _main,-U start, dan-static, file Mach-O yang tidak memakai dyld dapat dibuat - Awalnya strongarm melempar exception karena tidak dapat menangani binary tanpa load command
LC_DYLD_INFO- Binary tersebut tidak memakai dyld, sehingga tidak memiliki
LC_DYLD_INFO - Patch ditambahkan ke strongarm untuk menanganinya
- Binary tersebut tidak memakai dyld, sehingga tidak memiliki
- Ketika string statis ditambahkan ke kode Rust, payload menjadi rusak
- String statis hasil kompilasi ditempatkan di
__const - Proses ekstraksi shellcode hanya menyisakan
__TEXT,__text, sehingga data__consttidak dimuat ke memori - Akibatnya kode mencoba membaca string dari alamat yang tidak dipetakan dan crash
- String statis hasil kompilasi ditempatkan di
- Solusinya adalah menyertakan data statis di dalam
__TEXT,__textdan menggunakan pengalamatan relatif terhadap instruction pointer agar tidak mengasumsikan alamat load yang stabil - Cara saat ini mendefinisikan string di assembly dan meneruskan alamatnya ke entry point payload Rust
Pipeline eksekusi yang diselesaikan di bagian 1
- Pipeline akhir bekerja dengan urutan berikut
- Mengubah payload Rust
- Menekan tombol untuk mengompilasi payload
- Mengekstrak shellcode dari binary
- Runner menjalankan payload dengan limera1n pada iPhone DFU yang terhubung
- Runner otomatis membaca data dari
0x84000000, yang digunakan sebagai ruang komunikasi, dan menampilkannya sebagai hexdump
- Pada titik ini, kode arbitrer dapat dijalankan di perangkat
- Eksekusi kode arbitrer secara teori memungkinkan banyak hal, tetapi membuat perangkat benar-benar melakukan sesuatu yang menarik tetap menjadi tahap terpisah
- Tahap berikutnya berlanjut ke Part 2: Bypassing the Bootchain
1 komentar
Opini Hacker News
Setelah bertahun-tahun hanya menjadi pembaca diam-diam, akhirnya saya membuat akun Hacker News hanya untuk meninggalkan komentar ini. Terima kasih sudah merangkum sesuatu yang sejak lama menjadi kotak hitam misterius bagi banyak orang
Saya masih ingat jelas betapa tegangnya saya saat melakukan jailbreak pada iPod 4G dengan iOS 4, sambil melihat pesan-pesan terminal bergulir satu demi satu. Setelah itu, saat jam makan siang di sekolah, saya juga melakukannya untuk perangkat teman-teman, sambil khawatir jangan-jangan karena kesalahan saya ponsel mereka rusak dan berubah menjadi perangkat bata seharga ratusan dolar
Setelah bertahun-tahun berlalu, kalau melihat ke belakang, “sihir” menembus tembok Apple dan menjalankan kode pengguna itulah yang membuat saya jatuh cinta pada pemrograman, dan saya sangat berterima kasih kepada semua orang yang terlibat
Terima kasih banyak atas tulisannya. Untuk menjelaskan konsep serumit ini dengan mudah, dibutuhkan pemahaman yang mendalam. Saat membacanya, saya teringat kenangan indah saat begadang meretas proyek jailbreak
Saya benar-benar menikmatinya sepanjang membaca. Terutama karena saya sendiri masih kurang mahir dalam reverse engineering kode native
Ini tampak seperti jailbreak tethered, karena memanfaatkan mekanisme pemulihan sistem untuk memutus rantai kepercayaan dan mem-boot iOS yang sudah dimodifikasi. Kalau begitu, saya penasaran bagaimana jailbreak untethered bekerja. Apakah caranya dengan tidak menyentuh rantai secure boot sama sekali dan membiarkannya apa adanya, lalu mengeksploitasi proses yang memiliki hak istimewa atau proses tanpa hak istimewa pada sistem yang sedang berjalan, kemudian melakukan eskalasi hak akses terpisah? Saya juga penasaran bagaimana persistensi dipertahankan, dan bagaimana pemeriksaan tanda tangan kernel dipatch tanpa mengutak-atik pemeriksaan tanda tangan pada bootloader dan kernel itu sendiri
Tulisan yang benar-benar luar biasa. Senang melihat Anda masih aktif di komunitas
Terima kasih sudah membuat ini. Saya punya iPhone 4s berisi banyak foto istimewa, tetapi entah bagaimana saya lupa PIN-nya, jadi sudah bertahun-tahun harus menunggu
Kalau bukan karena foto-foto itu, saya pasti sudah meresetnya saja, tetapi saya penasaran apakah dengan ini saya bisa mereset PIN dan menyalin foto-fotonya
Edit: Saya bisa saja keliru. Di [0] juga disebutkan bahwa untuk beberapa waktu hanya penyimpanan Mail yang dienkripsi, dan default-nya berubah di iOS 7. Jadi kalau iPhone itu menjalankan iOS <= 6, mungkin metode ini bisa digunakan untuk mengakses perangkat dan menyalin foto. Alat di [1] mungkin bisa membantu
[1] https://code.google.com/archive/p/iphone-dataprotection/
[0] https://darthnull.org/ios-encryption/
Tulisan yang sangat bagus. Namun adegan antarmuka iOS lama yang memperlihatkan kejayaan desain skeuomorphic apa adanya membuat saya mual. Saya jadi kembali menyadari betapa tidak sukanya saya pada John Ive
Mungkin Jony seharusnya terus saja mendesain sandaran pergelangan tangan aluminium setajam silet, bukannya menangani perangkat lunak
Saya membaca beberapa bagian awal dengan sangat menikmati. Keren mengikuti dari sudut pandang seperti ini. Saya juga sering sekali membaca source code untuk mencari tahu bagaimana orang lain mengimplementasikan hal-hal seperti exploit, jadi menyenangkan mengetahui ada orang lain yang juga melakukannya
Saya belum membacanya, tetapi menantikannya. Semua tweak yang disebutkan di awal pernah saya pakai, dan saya ingin mengatakan terima kasih sudah membuatnya. Jailbreak iOS awal benar-benar menyenangkan
Sangat bagus. Saya mencoba menjalankannya, tetapi sayangnya perangkat lama saya sejak awal tidak bisa boot
Saya juga membuat tweak pada masa itu dan menganggap jailbreak seperti ilmu hitam. Setelah membaca tulisan ini pun, sampai batas tertentu saya masih merasa begitu
Terima kasih banyak sudah merangkumnya. Saya sangat tertarik mempelajari hal-hal seperti ini. Terutama hal-hal seperti “membebaskan” kamera keamanan Wi-Fi murah seperti dafang-hacks dengan firmware kustom saya sendiri, atau mempelajari cara membuat exploit baru untuk melakukan root pada tablet Kindle Fire
Namun tulisan yang membahas proses itu secara rinci ternyata sangat sulit ditemukan