Root check dan jailbreak check pada aplikasi mobile

Artikel ini akan membas mengenai metode untuk mengecek root (pada Android) atau jailbreak (pada iOS) dan mengapa pemeriksaan ini diperlukan. Berikut saya akan membahas bagaimana melakukan bypass pengecekan ini supaya seorang pentester bisa melakukan testing pada aplikasi mobile.

Apa itu rooting/jailbreak?

Baik rooting maupun jailbreak gunanya adalah untuk mendapatkan hak akses setara administrator pada mobile device yang kita miliki. Di Android kita bebas menginstall aplikasi apa saja, di iOS sebuah aplikasi hanya bisa diinstall dalam mode development, dengan jailbreak maka aplikasi tambahan bisa diinstall.

Jika device sudah dijailbreak/root maka sebuah aplikasi kemudian bisa diberi hak untuk melakukan apa saja, termasuk juga membaca data privat aplikasi lain. “Melakukan apa saja” bisa berarti positif, misalnya kita bisa mengganti berbagai aplikasi sistem dengan versi yang lebih baik, menghapus aplikasi bawaan sistem yang tidak terpakai, dsb.

Biasanya seseorang dengan sengaja melakukan rooting/jailbreaking pada devicenya sendiri supaya bisa melakukan hal-hal yang sebelumnya tidak bisa diijinkan oleh sistem. Contohnya: kita bisa mengganti isi file hosts untuk memblokir iklan di berbagai aplikasi, atau meningkatkan privasi dengan menggunakan aplikasi tertentu yang mencegat berbagai kebocoran informasi (misalnya dengan XPrivacyLua), atau bahkan sekedar untuk mencurangi game tertentu.

Tapi proses rooting/jailbreak ini juga bisa dilakukan oleh pihak lain, misalnya penjahat atau agen pemerintahan agar bisa menginstall aplikasi untuk mengendalikan ponsel kita, memata-matai menggunakan kamera/mikrofon, mencuri data bank, dsb. Proses jailbreak/rooting ini kadang bisa dilakukan secara remote (diinstall menggunakan eksploit tertentu tanpa sepengetahuan user), dan bisa juga melalui aplikasi yang diinstall dengan menipu user (contohnya di Android bisa berpura-pura jadi aplikasi cheat untuk game populer).

Memeriksa Jailbreak/rooting

Sebuah aplikasi yang penting (misalnya aplikasi bank) tidak ingin uang nasabahnya dicuri oleh program lain. Jadi logikanya begini:

  • Jika device dijailbreak/root, maka ada program lain yang bisa mencuri/mengubah data di aplikasi banking
  • Ada kemungkinan user tidak tahu bahwa devicenya dijailbreak/root, jadi aplikasi perlu mendeteksi dan memberitahu user

Setelah bisa mendeteksi device dijailbreak atau tidak, maka aplikasi bisa melakukan ini:

  • Meneruskan program, tapi memberi peringatan dulu ke user bahwa device dijailbreak
  • Tidak mau meneruskan, karena ada risiko bahwa user tidak mengerti apa itu root/jailbreak serta risikonya dan jika diberi pilihan dalam bentuk pertanyaan apapun maka user akan menjawab apapun asalkan programnya jalan terus

Proses pemeriksaan jailbreak/rooting

Proses pemeriksaan bisa banyak, ini bisa dilakukan dengan coding manual, atau menggunakan library yang sudah ada untuk mengecek ini (misalnya rootbeer). Apapun yang digunakan, biasanya pemeriksaannya seperti ini:

  • Cek apakah file tertentu ada atau tidak, ada file-file standar yang diciptakan oleh program root/jailbreak
  • Cek apakah ada aplikasi tertentu yang biasanya diinstall bersama dengan root/jailbreak
  • Cek apakah direktori tertentu bisa dibaca/ditulis

Untuk Android, ada juga pemeriksaan level sistem yang bisa dilakukan dengan menggunakan Safety Net.

Rooting/Jailbreak untuk pentesting

Sebagai pentester, memiliki HP dengan akses root/jailbreak sangat membantu untuk banyak hal:

  • Di iOS jailbreak dibutuhkan untuk mendekrip agar aplikasi dari app store bisa dianalisis dengan menggunakan disassembler/decompiler
  • Di Android rooting bisa dipakai untuk menginstall berbagai aplikasi seperti wireshark atau nmap (atau bahkan sebuah distribusi seperti Kali Linux) yang memungkinkan kita menggunakan Android sebagai device pentesting

Anti Rooting/Jailbreak detection

Nah sekarang kita memiliki masalah:

  • Memiliki HP yang diroot/jailbreak membantu proses pentesting
  • Aplikasi tertentu tidak mau jalan karena sudah kita root, dan aplikasi tersebut melalukan root/jailbreak detection

Ada beberapa pendekatan agar aplikasi menyangka bahwa device saat ini tidak diroot/jailbreak

  1. Memakai aplikasi penyembunyi, misalnya di Android ada RootCloak, Magisk dsb, di iOS ada Flex 2, Liberty Lite dsb. Tool-tool ini saling berlomba dengan pembuat detektor jailbreak, jadi di masa depan mungkin akan muncul tool-tool lain
  2. Modifikasi aplikasi agar aplikasi tersebut terus jalan walaupun device sudah diroot/jailbreak. Modifikasi bisa dilakukan temporer (dengan skrip Frida) atau permanen (dengan mengedit file smali-nya).

Cara pertama merupakan cara termudah, tinggal install aplikasi tertentu dan harapannya aplikasi akan mau terus berjalan. Sayangnya ini tidak selalu berhasil. Beberapa aplikasi memiliki proses deteksi yang sering tetap bisa mendeteksi anti jailbreak ini. Sebagai catatan: untuk saat ini Magisk bisa tersembunyi dari hampir semua aplikasi. Kelemahan Magisk adalah: kita tidak bisa menginstallnya bersamaan dengan XPosed Framework, jika diinstall bersamaan, maka akan terdeteksi dengan metode Safety Net.

Cara patching selalu berhasil, tapi masalahnya adalah ini tidak mudah. Diperlukan skill reverse engineering untuk mencari tahu di mana proses deteksi dilakukan, dan bagaimana modifikasinya agar aplikasi tetap jalan terus.

Jika aplikasi sifatnya tidak diobfuskasi (not obfuscated), maka pemeriksaan ini biasanya mudah dicari, apalagi jika namanya sangat jelas. Contohnya jika aplikasi memakai library RootBeer, pemeriksaannya sangat jelas karena nama methodnya “isRooted” mudah dilihat.

Pemeriksaan root dengan RootBeer

Tapi jika sebuah aplikasi sudah diobfuskasi (obfuscated), maka semua nama menjadi kurang jelas. Jika kode diatas sudah obfuscated, maka bisa muncul kira-kira seperti ini:

Kode yang sama, obfuscated, tentunya komentar tidak akan muncul ketika kode didekompilasi

Biasanya kode seperti ini bisa dicari dengan melihat berbagai string yang ada. Contohnya, jika root ketemu, maka aplikasi menampilkan dialog dengan string “Ponsel Anda diroot”. Untuk ini kita hanya perlu mencari string “Ponsel Anda diroot” dan bisa ditebak kondisi “if” mana yang perlu diubah.

Tentunya programmer bisa membuat pengecekan ini ini jadi semakin sulit. String bisa dienkripsi, jadi jika dicari tidak akan ketemu (kecuali kita dekrip dulu). Proses pemeriksaan root dan pengecekan juga bisa dipisah. Misalnya di kelas utama hanya mengeset variabel “z” menjadi true jika diroot. Di View yang lain baru kita cek isi variabel z. Proses pemeriksaan bisa dipanggil beberapa kali (jadi perlu dicek dibypass di banyak tempat, misalnya di waktu login, awal transaksi dan di akhir transaksi). Dan masih banyak lagi cara mempersulit agar pemeriksaan root tidak gampang dibypass.

Meski tidak gampang, tapi cara patching ini selalu berhasil jika penyerang cukup bisa memahami aplikasnya. Agar lebih sulit lagi, sebuah aplikasi kadang melakukan pemeriksaan terhadap signature packagenya, agar yakin bahwa aplikasi tersebut tidak diubah (ketika di-sign ulang, signature akan berubah). Dalam kasus ini pemeriksaan signature ini harus dipatch juga oleh pentester.

Protektor

Saat ini ada beberapa software protektor komersial yang memiliki proteksi yang cukup sulit. Contoh bentuk proteksinya:

  • File DEX dienkrip dan diload ketika aplikasi berjalan (runtime)
  • Pemeriksaan dilakukan di native library (harus memahami assembly)
  • Digunakan berbagai teknik antidebug dan anti tamper untuk mempersulit modifikasi

Semua proteksi ini bisa dibypass, tapi akan butuh waktu. Kadang ada orang yang menuliskan dengan detail teknik bypass protektor tertentu, tapi menurut saya ini agak sia-sia: setiap kali ada tulisan seperti itu, pembuat protektor akan mengubah sesuatu (kadang kecil sekali) sehingga langkah detail yang diberikan tidak lagi bisa dipakai.

Menurut saya yang lebih perlu adalah mengajarkan langkah umum bagaimana melakukan reversing. Dengan ini jika ada perubahan maka ilmunya akan tetap terpakai. Saya pernah menuliskan ini di blog saya yang lain.

Penutup

Banyak pentester pemula yang masih bingung dengan teknik pengecekan rooting seperti ini, jadi semoga artikel ini bisa membantu. Saat ini jika Anda tidak memakai XPosed Framework, maka Magisk bisa menyelesaikan 99% masalah deteksi rooting.

Di kesempatan lain saya berencana akan menulis lebih banyak mengenai SSL Pinning dan bagaimana melakukan unpinning. Topik SSL pinning ini merupakan topik sejenis yang sering dianggap sulit oleh pentester pemula. Tidak seperti rooting yang bisa diselesaikan dengan Magisk, berbagai aplikasi memakai teknik SSL pinning yang tidak standar sehingga butuh lebih banyak teknik manual.

Tinggalkan Balasan

This site uses Akismet to reduce spam. Learn how your comment data is processed.