Root Detection — Android ilovalarini superfoydalanuvchi imtiyozlariga ega qurilmalarda ishga tushirishdan himoya qiluvchi mexanizm. Bank, toʻlov va korporativ ilovalar root qilingan qurilmalarda funksionallikni bloklaydi yoki cheklaydi, chunki root kirishi Android sandbox cheklovlarini olib tashlaydi va trafikni tutib olish, jarayonlar xotirasini oʻqish va maʻlumotlarni almashtirish imkoniyatini ochadi. OWASP Mobile Top 10 (2024) maʻlumotlariga koʻra, Root Detectionning yoʻqligi M8 (Security Decisions via Untrusted Inputs) toifasiga kiradi. Root Detection fayl tizimining statik tekshiruvlari va runtime xatti-harakatlarining dinamik tahlili kombinatsiyasiga asoslanadi.
Asosiy ma'lumotlar
Root Detection — Android qurilmasida root kirishi mavjudligini aniqlovchi dasturiy mexanizm. Root kirishi operatsion tizim ustidan toʻliq nazoratni ta'minlaydi, ilovalar va skriptlarga UID 0 bilan buyruqlarni bajarishga imkon beradi. Root qilingan qurilmada ilovalar izolyatsiyasi (Android Sandbox) yoʻqoladi, bu esa klaviatura kiritishini tutib olish, boshqa ilovalarning SQLite ma'lumotlar bazalarini oʻqish, jarayonlarga kod kiritish va ishonchli saqlashda SSL sertifikatlarini almashtirish imkonini beradi.
Moliyaviy va korporativ ilovalar uchun root qilingan qurilmada ishlash qabul qilib boʻlmaydigan xavf hisoblanadi: buzgʻunchi tokenlar, sessiya kalitlari va shaxsiy ma'lumotlarga kirish huquqini oladi. PCI Security Standards Council kabi tartibga soluvchi organlar toʻlov ilovalaridan root kirishini aniqlash va unga munosabat bildirishni talab qiladi. Bunga javoban Android dasturchilari Root Detectionni proaktiv himoya strategiyasining bir qismi sifatida kiritadilar.
Aniqlashning ikki yondashuvi mavjud: fayl tizimi va oʻrnatilgan paketlarni tahlil qiluvchi statik, va runtime-da tekshiruvlarni amalga oshiruvchi dinamik. Kombinatsiyalangan yondashuv eng ishonchli hisoblanadi, chunki u chetlab oʻtishning turli vektorlarini qamrab oladi. NowSecure (2025) tadqiqotiga koʻra, Google Play top-100 dagi bank ilovalarining 76% i qandaydir shaklda Root Detectionni oʻz ichiga oladi.
Statik usullar ilova ishga tushganda bajariladi va root vositalari fayl tizimida qoldirgan root kirishi belgilarini tekshiradi. Bu usullar imtiyozli buyruqlarni bajarishni talab qilmaydi va oddiy ilova kontekstida ishlaydi.
Root kirishining asosiy belgisi — standart yo'llarda su bajariladigan faylining mavjudligi: /system/bin/su, /system/xbin/su, /sbin/su, /su/bin/su. Ilova faylning mavjudligini File.exists() yoki libc dan access() nativ tatbiqi orqali tekshiradi. Qo'shimcha ravishda su --version yoki su -c id bajarishga va chiqish kodini tekshirishga harakat qilish mumkin.
Root kirishini boshqarish uchun odatiy ilovalar: Superuser, SuperSU, Magisk Manager, KingRoot. Ularning mavjudligi PackageManager.getPackageInfo() yoki /data/app/ katalogini oʻqish orqali tekshiriladi. Tekshiriladigan paketlar: com.topjohnwu.magisk, eu.chainfire.supersu, com.noshufou.android.su, com.thirdparty.superuser, com.koushikdutta.superuser, com.zacharee1.systemuituner.
Android tizim holati haqidagi ma'lumotni System.getProperty va Build.TAGS orqali mavjud bo'lgan tizim xususiyatlarida saqlaydi. Build.TAGS qiymati release-keys emas, test-keys ni oʻz ichiga olgan boʻlsa — bu koʻpincha root kirishiga ega bo'lgan maxsus proshivkani koʻrsatadi. Qo'shimcha ravishda ro.build.tags, ro.debuggable va ro.secure /system/build.prop ni oʻqish orqali tekshiriladi.
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 topilmadi
}
}
return false;
}
}
Dinamik usullar ilova ishlayotgan paytda bajariladi va bajarish muhitini tahlil qiladi. Statik usullardan farqli oʻlaroq, ular Magisk Hide yoki Zygisk orqali yashirilgan rootni aniqlay oladi, chunki faqat fayl tuzilmasini emas, balki tizimning xatti-harakatini tekshiradi.
Root kirishi mavjud boʻlganda, ba'zi tizim boʻlimlari ro (read-only) oʻrniga rw (read-write) flagi bilan mount qilinadi. Ilova /proc/mounts ni oʻqiydi va /system ning ro sifatida mount qilinganligini tekshiradi. Agar /system rw sifatida mount qilingan boʻlsa — bu oʻzgartirilgan tizimning belgisidir. Qo'shimcha ravishda Magisk orqali /su mount qilinishining mavjudligi tekshiriladi.
Android Safe Mode uchinchi tomon ilovalarini, shu jumladan root menejerlarini oʻchiradi. Root Detectionning toʻgʻri tatbiqi qurilmaning xavfsiz rejimda ishlayotganligini tekshirishi mumkin. Agar ilova root menejerlari koʻrinmayotganini, ammo su-binar fayli mavjudligini aniqlasa — bu Magisk Hide belgisidir.
ProcessBuilder yoki Runtime.exec orqali su -c id ni bajarishga urinish — root kirishining toʻgʻridan-toʻgʻri testi. Biroq, Magisk bu chaqiruvni tutib olishi mumkin. Ishonchliroq variant — nativ kod orqali tekshirish: /proc/1/limits yoki /proc/self/maps ni ochish va ishlayotgan jarayonlarning UID sini tahlil qilish. Agar ilova UID 0 ga ega boʻla olsa yoki faqat root uchun mavjud fayllarni oʻqiy olsa — qurilma buzilgan.
public boolean checkRootDynamically() {
// Yig'ish flaglarini tekshirish
String buildTags = Build.TAGS;
if (buildTags != null && buildTags.contains("test-keys")) {
return true;
}
// /system mount qilinishini tekshirish
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) {
// mountni o'qishda xato
}
return false;
}
Java da tatbiq qilingan Root Detection Java metodlarini tutib oladigan va qaytariladigan qiymatlarni almashtiradigan Xposed modullari yoki Frida orqali osonlik bilan chetlab oʻtiladi. C++ da JNI orqali nativ tatbiq sezilarli darajada chidamli: Java darajasida ishlaydigan dinamik tahlil vositalari stat, access, popen va dlopen kabi libc nativ chaqiruvlarini koʻrmaydi.
#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;
}
Nativ tekshirish Java API dan foydalanmaydi, bu uni Dalvik/ART darajasida ishlaydigan chetlab oʻtish vositalari uchun koʻrinmas qiladi. Qoʻshimcha himoya uchun konstantalarni (yo'llar ro'yxati) read-only bo'limida emas, balki oddiy qaytariladigan funksiyalar orqali hisoblash tavsiya etiladi. Stat chaqiruvi libc dan to'g'ridan-to'g'ri Linux yadrosiga murojaat qiladi, Java o'ramlarini chetlab o'tadi va uni Xposed orqali tutib olish mumkin emas.
Himoya ishlab chiqaruvchilari chidamli aniqlash tizimini qurish uchun mavjud chetlab o'tish usullarini tushunishlari kerak. Har bir chetlab o'tish usuli tegishli darajada qarshi chora talab qiladi.
Magisk — Android 9–14 da eng mashhur root vositasi. Magisk Hide su ning /proc dan mavjudligini yashiradi va yo'llarni tekshirish natijalarini almashtiradi. Magisk yadro darajasida ishlaydi va ilova ko'rishidan oldin stat() va access() ni tutib oladi. Qarshi chora: /sbin/.magisk mavjudligi yoki o'z maps ni o'qish orqali Magiskning o'zini tekshirish — Magisk o'z kutubxonasini har bir jarayonga joylashtiradi.
Frida — Ptrace yoki Dobby orqali nativ funksiyalarni tutib olishi mumkin bo'lgan dinamik instrumentatsiya vositasi. Frida har bir tekshiruvning qaytariladigan qiymatini almashtiradi, stat natijasini ENOENT ga o'zgartiradi. Qarshi chora: xotiradagi ko'rsatmalarning checksum ini hisoblash orqali nativ funksiyalar yaxlitligini tekshirish va Frida ni /proc/self/maps da frida-agent.so yoki frida-helper mavjudligi uchun tahlil qilish.
Java da tatbiq qilingan Root Detection 2–3 daqiqada olib tashlanadi: APK apktool orqali ochiladi, smali kodida metodning qaytarish qiymati false ga o'zgartiriladi, APK qayta yig'iladi va imzolanadi. Qarshi chora: kritik mantiqni nativ kodga ko'chirish va runtime da Signature API yoki APK hashini serverdagi etalon bilan solishtirish orqali ilovaning raqamli imzosini tekshirish.
Samarali Root Detection ko'p qatlamli arxitekturaga asoslanadi. Hech bir usul alohida yetarli himoya darajasini ta'minlamaydi. Statik va dinamik tekshiruvlar, nativ kod va server tekshiruvi kombinatsiyasi maksimal chidamlilikni beradi.
Faqat client-side tekshiruviga ishonmang. Root Detection natijalarini bir martalik sessiya tokeni bilan birga serverga yuboring. Server bloklash yoki funksionallikni cheklash to'g'risida qaror qabul qiladi. Bu mijoz ilovasi o'zgartirilishi mumkin bo'lgan, ammo server ishonchli tomon bo'lib qoladigan API darajasidagi hujumlarning oldini oladi.
Root Detection kodi obfuskatsiya qilinishi kerak. Agar buzg'unchi jadx da su yo'llarining aniq ketma-ketligini ko'rsa — chetlab o'tish daqiqalar davom etadi. Boshqaruv oqimini chigallashtirish va satrlarni shifrlash uchun ProGuard yoki DexGuard dan foydalaning. Obfuskatsiya himoya kodini tahlil qilish vaqtini bir necha daqiqadan bir necha soatgacha oshiradi.
Tekshiriladigan yo'llar, paketlar va ko'rsatkichlar ro'yxati ilovaning har bir relizi bilan yangilanishi kerak. Yangi root va chetlab o'tish vositalari har oyda paydo bo'ladi. Bir yil davomida o'zgarmagan statik ro'yxat zamonaviy usullarni aniqlamaydi. Tekshiruvlarni amalga oshirishdan oldin ilova ishga tushganda serverdan joriy imzolarni yuklash tavsiya etiladi.
Ko'p beriladigan savollar
Root Detection ilovani Android sandbox o'chirilgan qurilmada ishga tushirishdan himoya qiladi. Root qilingan qurilmada har qanday ilova boshqa ilovalarning ma'lumotlarini o'qiy oladi. Bank va to'lov ilovalari PCI DSS talablari va OWASP Mobile Security tavsiyalariga ko'ra root qilingan qurilmalarda ishni bloklashi shart.
Magisk Hide mount nomlar maydoni (mount namespace) mexanizmidan foydalanadi. Istisnolar ro'yxatida ko'rsatilgan har bir jarayon uchun Magisk izolyatsiyalangan nomlar maydonini yaratadi, unda su-binar fayli ko'rinmas bo'ladi. Bu nomlar maydonida tizim chaqiruvlari stat, access va open Magisk fayllarini ko'rmaydi. Magiskni /proc/self/maps mavjudligi va magisk dump ni qidirish orqali aniqlash mumkin.
Ha, agar ilova o'z kodining yaxlitligini tekshirmasa. Frida orqali Java tekshirish metodini tutib olish va majburan false qaytarish mumkin. Qarshi chora — kritik mantiqni C++ da nativ tatbiq qilish va DEX faylining hashi orqali yaxlitlikni tekshirish. Obfuskatsiyasiz, Java dagi har qanday Root Detection 5–10 daqiqada chetlab o'tiladi.
SafetyNet (eskirgan) va Play Integrity API — bu qurilmaning yaxlitligini tasdiqlovchi Google ning server tekshiruvlari. Ular bootloader, tizim imzosi va root holatini tekshirishni o'z ichiga oladi. Play Integrity API — SafetyNet ga tavsiya etilgan o'rinbosar, uch darajani beradi: BASIC, DEVICE va STRONG. Client tomondagi Root Detection server attestatsiyasini to'ldiradi.
Ilovani haqiqiy root qilingan qurilmaga (masalan, Magisk bilan Pixel) o'rnating. Bloklash ishga tushishini tekshiring. Keyin rootni Magisk Hide orqali ilovangiz uchun yashirishga harakat qiling va testni takrorlang. Chuqur tekshirish uchun maqsadli metodlarni tutib olishda Frida dan foydalaning va nativ himoyaning chetlab o'tib bo'lmasligiga ishonch hosil qiling.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.