1 poin oleh GN⁺ 2023-10-03 | 1 komentar | Bagikan ke WhatsApp
  • 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 0x84000000 dan permintaan baca USB 0xA1:2 diimplementasikan ulang untuk mengambil dump SecureROM dan nilai debug ke host
  • Pipeline dibuat untuk mengekstrak payload yang ditulis dalam Rust dari __TEXT,__text pada 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 Exploits pada 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 proses Restore iPhone
  • 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 0x0 tempat 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 di 0x84000000 ke host
  • 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
  • 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
  • Skrip otomatis men-dump beberapa word pertama di 0x84000000 setelah 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

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-ios pada awal 2020, tetapi rustup dapat 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 __text dari segmen __TEXT
  • strongarm adalah library analisis Mach-O, dan digunakan dalam sistem build untuk mem-parse Mach-O serta mengekstrak section __TEXT,__text ke 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 start atau _main, tetapi untuk keperluan shellcode ini simbol seperti itu tidak diperlukan
  • Secara default linker akan menghasilkan error jika tidak ada _main atau start
  • 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
  • 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 __const tidak dimuat ke memori
    • Akibatnya kode mencoba membaca string dari alamat yang tidak dipetakan dan crash
  • Solusinya adalah menyertakan data statis di dalam __TEXT,__text dan 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

 
GN⁺ 2023-10-03
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

    • Saat bekerja di industri teknologi, ada banyak hari ketika kita jadi membencinya karena hal-hal yang, meski sudah menetapkan tujuan, tidak bisa kita pahami atau selesaikan. Tapi sesekali membaca tulisan seperti ini membuat saya merasa tidak boleh menyerah pada open source atau komunitas teknologi secara umum
    • Saya suka iPhone, tetapi saya merindukan masa ketika memasang CyanogenMod di berbagai perangkat Android. Rasanya benar-benar keren
    • Saya punya pengalaman serupa. Pada akhirnya saya mulai membuat tweak jailbreak sendiri, dan itu menjadi pemicu saya masuk lebih serius ke pemrograman
  • 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

    • Biasanya sering dikonfigurasi agar kernel dieksploitasi ulang dari userland selama proses boot atau segera setelahnya. Teknik yang saya ingat antara lain menambahkan launch daemon baru, menandatangani aplikasi dengan sertifikat pengembang, dan menaruh binary yang memanfaatkan perilaku unik dynamic linker untuk melewati pemeriksaan tanda tangan
  • 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

    • Sepertinya mungkin sulit. Menurut [0], passcode digunakan untuk melindungi kunci enkripsi filesystem, jadi tanpa passcode file tidak bisa didekripsi. Saya tidak tahu apakah foto disimpan dalam keadaan terenkripsi, tetapi sepertinya memang begitu
      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

    • Maksudmu masa ketika tombol terlihat seperti tombol yang bisa diklik? Berbeda dengan sekarang, ketika karena desain datar yang buruk sekali, akhirnya fitur aksesibilitas harus ditambahkan untuk mengakali kekurangannya
      Mungkin Jony seharusnya terus saja mendesain sandaran pergelangan tangan aluminium setajam silet, bukannya menangani perangkat lunak
    • Menurut saya iPhone mencapai puncaknya pada iPhone 4 dan iOS 4. Setelah itu memang ada peningkatan bertahap, tetapi saat terakhir saya merasa iPhone baru benar-benar merupakan upgrade besar adalah waktu itu. Selain antennagate, desain hardware dan software-nya semuanya terasa pas begitu saja
  • 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