Root Detection — mekanisme perlindungan aplikasi Android dari dijalankan pada perangkat dengan hak istimewa superuser. Aplikasi perbankan, pembayaran, dan korporat memblokir atau membatasi fungsionalitas pada perangkat yang di-root, karena akses root menghilangkan batasan sandbox Android dan membuka kemungkinan penyadapan lalu lintas, pembacaan memori proses, dan pemalsuan data. Menurut OWASP Mobile Top 10 (2024), ketiadaan Root Detection termasuk dalam kategori M8 (Security Decisions via Untrusted Inputs). Root Detection dibangun di atas kombinasi pemeriksaan statis sistem file dan analisis dinamis perilaku runtime.
Poin Utama
Root Detection — mekanisme perangkat lunak yang menentukan keberadaan akses root pada perangkat Android. Akses root memberikan kendali penuh atas sistem operasi, memungkinkan aplikasi dan skrip menjalankan perintah dengan UID 0. Pada perangkat yang di-root, isolasi aplikasi (Android Sandbox) hilang, memungkinkan penyadapan input keyboard, pembacaan database SQLite aplikasi lain, injeksi kode ke dalam proses, dan pemalsuan sertifikat SSL di penyimpanan tepercaya.
Untuk aplikasi keuangan dan korporat, berjalan di perangkat yang di-root merupakan risiko yang tidak dapat diterima: penyerang mendapatkan akses ke token, kunci sesi, dan data pribadi. Regulator, termasuk PCI Security Standards Council, mewajibkan aplikasi pembayaran untuk mendeteksi dan bereaksi terhadap akses root. Sebagai tanggapan, pengembang Android menyematkan Root Detection sebagai bagian dari strategi perlindungan proaktif.
Ada dua pendekatan deteksi: statis, yang menganalisis sistem file dan paket yang terinstal, dan dinamis, yang melakukan pemeriksaan di runtime. Pendekatan gabungan dianggap paling andal karena mencakup berbagai vektor bypass. Menurut penelitian NowSecure (2025), 76% aplikasi perbankan di 100 besar Google Play mengandung suatu bentuk Root Detection.
Metode statis dijalankan saat aplikasi dimulai dan memeriksa tanda-tanda akses root yang ditinggalkan oleh alat root di sistem file. Metode ini tidak memerlukan eksekusi perintah yang memiliki hak istimewa dan bekerja dalam konteks aplikasi biasa.
Tanda utama akses root — keberadaan file yang dapat dieksekusi su di jalur standar: /system/bin/su, /system/xbin/su, /sbin/su, /su/bin/su. Aplikasi memeriksa keberadaan file melalui File.exists() atau implementasi native access() dari libc. Selain itu, dapat mencoba menjalankan su --version atau su -c id dan memeriksa kode keluar.
Aplikasi tipikal untuk mengelola akses root: Superuser, SuperSU, Magisk Manager, KingRoot. Keberadaan mereka diperiksa melalui PackageManager.getPackageInfo() atau membaca direktori /data/app/. Paket yang diperiksa: com.topjohnwu.magisk, eu.chainfire.supersu, com.noshufou.android.su, com.thirdparty.superuser, com.koushikdutta.superuser, com.zacharee1.systemuituner.
Android menyimpan informasi tentang status sistem dalam properti sistem yang dapat diakses melalui System.getProperty dan Build.TAGS. Jika nilai Build.TAGS berisi test-keys, bukan release-keys — ini menunjukkan firmware kustom, seringkali dengan akses root. Selain itu, ro.build.tags, ro.debuggable, dan ro.secure diperiksa melalui pembacaan /system/build.prop.
public class RootDetectionChecker {
private static final String[] SU_PATHS = {
"/system/bin/su",
"/system/xbin/su",
"/sbin/su",
"/su/bin/su",
"/system/sd/xbin/su"
};
public boolean checkRootByFiles() {
for (String path : SU_PATHS) {
if (new File(path).exists()) {
return true;
}
}
return false;
}
public boolean checkRootByPackages(Context ctx) {
String[] packages = {
"com.topjohnwu.magisk",
"eu.chainfire.supersu",
"com.noshufou.android.su",
"com.koushikdutta.superuser"
};
for (String pkg : packages) {
try {
ctx.getPackageManager().getPackageInfo(pkg, 0);
return true;
} catch (PackageManager.NameNotFoundException e) {
// paket tidak ditemukan
}
}
return false;
}
}
Metode dinamis dijalankan selama aplikasi beroperasi dan menganalisis lingkungan eksekusi. Tidak seperti metode statis, metode ini dapat mendeteksi root yang disembunyikan melalui Magisk Hide atau Zygisk, karena memeriksa perilaku sistem, bukan hanya struktur file.
Saat akses root, beberapa partisi sistem di-mount dengan flag rw (read-write) alih-alih ro (read-only). Aplikasi membaca /proc/mounts dan memeriksa apakah /system di-mount sebagai ro. Jika /system di-mount sebagai rw — ini adalah tanda sistem yang dimodifikasi. Selain itu, keberadaan mounting /su melalui Magisk diperiksa.
Android Safe Mode menonaktifkan aplikasi pihak ketiga, termasuk manajer root. Implementasi Root Detection yang benar dapat memeriksa apakah perangkat beroperasi dalam mode aman. Jika aplikasi mendeteksi bahwa manajer root tidak terlihat, tetapi binary su ada — ini adalah tanda Magisk Hide.
Upaya menjalankan su -c id melalui ProcessBuilder atau Runtime.exec — tes langsung akses root. Namun, Magisk dapat mencegat panggilan ini. Opsi yang lebih andal — pemeriksaan melalui kode native: membuka /proc/1/limits atau /proc/self/maps dan menganalisis UID proses yang berjalan. Jika aplikasi dapat memperoleh UID 0 atau membaca file yang hanya dapat diakses root — perangkat telah dikompromikan.
public boolean checkRootDynamically() {
// Pemeriksaan flag kompilasi
String buildTags = Build.TAGS;
if (buildTags != null && buildTags.contains("test-keys")) {
return true;
}
// Pemeriksaan mounting /system
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(new FileInputStream("/proc/mounts"))
);
String line;
while ((line = reader.readLine()) != null) {
if (line.contains("/system")
&& line.contains("rw")) {
reader.close();
return true;
}
}
reader.close();
} catch (IOException e) {
// kesalahan membaca mount
}
return false;
}
Root Detection yang diimplementasikan dalam Java mudah dilewati melalui modul Xposed atau Frida, yang mencegat metode Java dan memalsukan nilai yang dikembalikan. Implementasi native dalam C++ melalui JNI jauh lebih tahan: alat analisis dinamis yang bekerja di tingkat Java tidak melihat panggilan native libc seperti stat, access, popen, dan dlopen.
#include <unistd.h>
#include <sys/stat.h>
#include <cstring>
#include <vector>
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_example_checker_RootCheck_nativeCheck(
JNIEnv* env, jobject instance) {
std::vector<const char*> paths = {
"/system/bin/su",
"/system/xbin/su",
"/sbin/su",
"/data/local/su"
};
struct stat st;
for (const char* path : paths) {
if (stat(path, &st) == 0) {
return JNI_TRUE;
}
}
return JNI_FALSE;
}
Pemeriksaan native tidak menggunakan Java API, membuatnya tidak terlihat oleh alat bypass yang bekerja di tingkat Dalvik/ART. Untuk perlindungan tambahan, disarankan menyimpan konstanta (daftar jalur) tidak di bagian read-only, tetapi menghitungnya melalui fungsi reversibel sederhana. Panggilan stat dari libc langsung mengakses kernel Linux, melewati wrapper Java, dan tidak dapat dicegat melalui Xposed.
Pengembang keamanan perlu memahami metode bypass yang ada untuk membangun sistem deteksi yang tangguh. Setiap metode bypass memerlukan tindakan balasan di tingkat yang sesuai.
Magisk — alat root paling populer di Android 9–14. Magisk Hide menyembunyikan keberadaan su dari /proc dan memalsukan hasil pemeriksaan jalur. Magisk bekerja di tingkat kernel dan mencegat stat() dan access() sebelum dilihat oleh aplikasi. Tindakan balasan: memeriksa keberadaan Magisk itu sendiri melalui keberadaan /sbin/.magisk atau pemeriksaan melalui pembacaan maps sendiri — Magisk menyematkan pustakanya ke setiap proses.
Frida — alat instrumentasi dinamis yang dapat mencegat fungsi native melalui Ptrace atau Dobby. Frida menggantikan nilai kembali setiap pemeriksaan, memalsukan hasil stat menjadi ENOENT. Tindakan balasan: memeriksa integritas fungsi native melalui perhitungan checksum instruksi dalam memori dan mendeteksi Frida melalui analisis /proc/self/maps untuk keberadaan frida-agent.so atau frida-helper.
Root Detection yang diimplementasikan dalam Java dihapus dalam 2–3 menit: APK dibongkar melalui apktool, dalam kode smali nilai kembali metode diubah menjadi false, APK dirakit ulang dan ditandatangani. Tindakan balasan: memindahkan logika kritis ke kode native dan memeriksa tanda tangan digital aplikasi di runtime melalui Signature API atau membandingkan hash APK dengan referensi di server.
Root Detection yang efektif dibangun di atas arsitektur multi-lapis. Tidak ada satu metode pun yang memberikan tingkat perlindungan yang memadai. Kombinasi pemeriksaan statis dan dinamis, kode native, dan verifikasi server memberikan ketahanan maksimum.
Jangan hanya mengandalkan pemeriksaan sisi klien. Kirim hasil Root Detection bersama dengan token sesi sekali pakai ke server. Server mengambil keputusan tentang pemblokiran atau pembatasan fungsionalitas. Ini mencegah serangan di tingkat API, di mana aplikasi klien dapat dimodifikasi, tetapi server tetap menjadi pihak tepercaya.
Kode Root Detection harus di-obfuscate. Jika penyerang melihat di jadx urutan pemeriksaan jalur su yang jelas — bypass akan memakan waktu beberapa menit. Gunakan ProGuard atau DexGuard untuk mengacaukan aliran kontrol dan mengenkripsi string. Obfuscation meningkatkan waktu analisis kode keamanan dari beberapa menit menjadi beberapa jam.
Daftar jalur, paket, dan indikator yang diperiksa harus diperbarui dengan setiap rilis aplikasi. Alat root dan bypass baru muncul setiap bulan. Daftar statis yang tidak berubah selama setahun tidak mendeteksi metode modern. Disarankan untuk memuat tanda tangan terkini dari server saat aplikasi dimulai sebelum melakukan pemeriksaan.
Pertanyaan yang Sering Diajukan
Root Detection melindungi dari menjalankan aplikasi pada perangkat di mana sandbox Android dinonaktifkan. Pada perangkat yang di-root, aplikasi apa pun dapat membaca data aplikasi lain. Aplikasi perbankan dan pembayaran wajib memblokir operasi pada perangkat yang di-root sesuai dengan persyaratan PCI DSS dan rekomendasi OWASP Mobile Security.
Magisk Hide menggunakan mekanisme mount namespace. Untuk setiap proses yang ditentukan dalam daftar pengecualian, Magisk menciptakan namespace terisolasi di mana binary su tidak terlihat. Panggilan sistem stat, access, dan open di namespace ini tidak melihat file Magisk. Magisk dapat dideteksi melalui pemeriksaan keberadaan /proc/self/maps dan pencarian dump magisk.
Ya, jika aplikasi tidak memeriksa integritas kodenya sendiri. Melalui Frida, metode pemeriksaan Java dapat dicegat dan dipaksa mengembalikan false. Tindakan balasan — implementasi native logika kritis dalam C++ dan pemeriksaan integritas melalui hash file DEX. Tanpa obfuscation, Root Detection apa pun di Java dapat dilewati dalam 5–10 menit.
SafetyNet (usang) dan Play Integrity API — ini adalah pemeriksaan server dari Google yang mengonfirmasi integritas perangkat. Mereka mencakup pemeriksaan bootloader, tanda tangan sistem, dan status root. Play Integrity API — pengganti yang direkomendasikan untuk SafetyNet, memberikan tiga tingkat: BASIC, DEVICE, dan STRONG. Root Detection di sisi klien melengkapi attestasi server.
Instal aplikasi pada perangkat yang benar-benar di-root (misalnya, Pixel dengan Magisk). Periksa apakah pemblokiran aktif. Kemudian coba sembunyikan root melalui Magisk Hide untuk aplikasi Anda dan ulangi pengujian. Untuk pemeriksaan mendalam, gunakan Frida untuk mencegat metode target dan pastikan perlindungan native tidak dapat dilewati.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga