Dalam dunia pengembangan aplikasi mobile, keamanan merupakan hal yang sangat penting. Salah satu aspek keamanan yang sering diterapkan adalah deteksi root pada perangkat Android. Root detection digunakan untuk mengidentifikasi apakah perangkat yang menjalankan aplikasi tersebut telah di-root atau tidak.
Namun, bagi seorang peneliti keamanan atau pengembang aplikasi yang ingin melakukan pengujian lebih lanjut, root detection dapat menjadi hambatan sehingga diperlukan root detection bypass. Ada beberapa modul untuk melakukan bypass root detection pada aplikasi Android, seperti Magisk, Shamiko, Xposed, dll.
Tapi bagaimana jika didalam aplikasi Android yang kita pakai sudah terdapat function untuk memeriksa dan mengenali modul diatas? Di sinilah peran Frida sebagai alat dynamic instrumentation sangat penting. Dalam artikel ini, kami akan menjelaskan bagaimana menggunakan Frida untuk melakukan bypass root detection pada perangkat Android, membuka peluang untuk menguji aplikasi dengan lebih bebas dan mendalam.
Bypass Root Detection with Frida
Disini saya tidak akan menjelaskan bagaimana cara menginstall ataupun mengkonfigurasi frida maupun frida-server, kalian bisa googling sendiri untuk cara instalasinya. Namun lebih ke bagaimana kita melakukan inspeksi function Root Detection yang ada pada aplikasi, lalu melakukan hooking menggunakan frida untuk membypass function tersebut.
Yang dibutuhkan:
- Jadx-GUI
- Frida
- Android Emulator
Bagi pengguna Kali Linux, jadx
dapat diinstall menggunakan perintah
1
sudo apt update && sudo apt install jadx -y
Untuk pemanasan, kita akan coba untuk melakukan bypass root detection pada aplikasi AndroGoat.
Sebelum memulai tutorial ini, buat satu file .js dengan nama terserah (sebagai contoh disini saya buat dengan nama inori.js), lalu isikan didalamnya:
1
2
3
Java.perform(function () {
// Bypass Root Detection
});
Pertama, buka file .apk menggunakan Jadx-GUI, lalu cari function yang digunakan untuk menjalankan root detection. Berikut beberapa keyword yang mungkin bisa dipakai: “/bin”, “which su”, “rooted”.
Disini terlihat ada dua fungsi yang digunakan untuk mendeteksi root pada device, yakni fungsi isRooted
dan fungsi isRooted1
.
Selanjutnya, klik kanan pada nama fungsi isRooted
lalu klik Copy as frida snippet.
Paste kedalam file .js yang sudah kita siapkan sebelumnya. Ubah nilai return menjadi false. Sekarang kode yang kita miliki menjadi seperti berikut:
1
2
3
4
5
6
7
8
9
10
Java.perform(function () {
// Bypass Root Detection
let RootDetectionActivity = Java.use("owasp.sat.agoat.RootDetectionActivity");
RootDetectionActivity["isRooted"].implementation = function () {
console.log(`RootDetectionActivity.isRooted is called`);
let result = this["isRooted"]();
console.log(`RootDetectionActivity.isRooted result=${result}`);
return false;
};
});
Ulangi langkah sebelumnya ke function isRooted1
. Namun karena RootDetectionActivity
sudah dideklarasikan sebelumnya, hapus untuk yang kedua. Sehingga final script untuk bypass root detection kita menjadi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Java.perform(function () {
// Bypass Root Detection
let RootDetectionActivity = Java.use("owasp.sat.agoat.RootDetectionActivity");
RootDetectionActivity["isRooted"].implementation = function () {
console.log(`RootDetectionActivity.isRooted is called`);
let result = this["isRooted"]();
console.log(`RootDetectionActivity.isRooted result=${result}`);
return false;
};
RootDetectionActivity["isRooted1"].implementation = function () {
console.log(`RootDetectionActivity.isRooted1 is called`);
let result = this["isRooted1"]();
console.log(`RootDetectionActivity.isRooted1 result=${result}`);
return false;
};
});
Selanjutnya kita bisa spawn aplikasi AndroGoat menggunakan perintah:
1
frida -l inori.js -U -f owasp.sat.agoat
“owasp.sat.agoat” adalah nama proses yang bisa dicek menggunakan perintah frida-ps -Uai
.
Ketika kita cek di AndroGoat, maka notifikasi yang muncul ketika kita cek adalah “Device is not rooted” yang menunjukkan bypass root detection kita berhasil.
Jadi teori sederhananya dalam melakukan bypass root detection adalah:
Inspeksi file .apk menggunakan Jadx > Cari fungsi root detection > Copy ke frida snippet > ubah nilai return menjadi false.
Study Case: Bypass iRoot Plugin
Oke, sekarang ke real case dimana aktifitas bypass root detection ini harus dilakukan ketika saya melakukan pentesting mobile apps salah satu client. Namun karena alasan privasi, saya tidak akan me-reveal nama aplikasi maupun tampilan aplikasinya.
Root detection pada aplikasi ini tidak bisa dibypass menggunakan script publik dari Frida CodeShare. Berikut hasil yang didapat ketika mencoba melakukan bypass dengan script antiroot dari Frida CodeShare.
Intinya, ketika aplikasi di spawn menggunakan Frida, root masih terdeteksi dan aplikasi langsung force closed.
Selanjutnya kita cari function Root Detection menggunakan Jadx seperti yang sudah kita bahas sebelumnya.
Disini ketika tau bahwa aplikasi menggunakan plugin iRoot, saya mencoba public script dari Frida CodeShare namun ternyyata masih gagal.
- https://codeshare.frida.re/@JJK96/iroot-root-detection-bypass/
Singkat cerita, ketemulah function untuk mendeteksi root tersebut.
Selanjutnya kita cari lagi dimana class u1.b dipanggil.
Setelah ketemu, kita langsung copy ke frida snippet.
Final script:
1
2
3
4
5
6
7
8
9
10
11
12
Java.perform(function () {
// iRoot Bypass
let IRoot = Java.use("de.cyberkatze.iroot.IRoot");
IRoot["execute"].implementation = function (str, jSONArray, callbackContext) {
console.log(`IRoot.execute is called: str=${str}, jSONArray=${jSONArray}, callbackContext=${callbackContext}`);
let result = this["execute"](str, jSONArray, callbackContext);
console.log(`IRoot.execute result=${result}`);
return false;
};
});
Root bypassed.
Oke mungkin itu saja mengenai bypass root detection menggunakan Frida. Di artikel selanjutnya (jika saya sempat) kita akan membahas mengenai bypass SSL Pinning pada aplikasi.
Thanks buat Mas Firdy dan Mas Suhada serta kawan-kawan ZeroByte lainnya atas diskusi dan juga pencerahannya.