Root Detection ایک حفاظتی طریقہ کار ہے جو Android ایپلیکیشنز کو سپر یوزر مراعات والے آلات پر چلنے سے روکتا ہے۔ بینکنگ، ادائیگی اور کارپوریٹ ایپلیکیشنز روٹڈ ڈیوائسز پر فعالیت کو بلاک یا محدود کرتی ہیں، کیونکہ روٹ رسائی Android سینڈ باکس کی پابندیاں ہٹا دیتی ہے اور ٹریفک کو روکنے، پروسیس میموری پڑھنے اور ڈیٹا میں ردوبدل کا امکان کھول دیتی ہے۔ OWASP Mobile Top 10 (2024) کے مطابق، Root Detection کی عدم موجودگی زمرہ M8 (Security Decisions via Untrusted Inputs) میں آتی ہے۔ Root Detection فائل سسٹم کے جامد معائنے اور رن ٹائم رویے کے متحرک تجزیے کے امتزاج پر مبنی ہے۔
اہم نکات
Root Detection ایک سافٹ ویئر طریقہ کار ہے جو Android ڈیوائس پر روٹ رسائی کی موجودگی کا پتہ لگاتا ہے۔ روٹ رسائی آپریٹنگ سسٹم پر مکمل کنٹرول فراہم کرتی ہے، جس سے ایپلیکیشنز اور اسکرپٹس UID 0 کے ساتھ کمانڈز چلا سکتی ہیں۔ روٹڈ ڈیوائس پر، ایپلیکیشن آئسولیشن (Android Sandbox) ختم ہو جاتی ہے، جس سے کی بورڈ ان پٹ روکنا، دوسری ایپس کے SQLite ڈیٹا بیس پڑھنا، پروسیسز میں کوڈ داخل کرنا اور قابل اعتماد اسٹور میں SSL سرٹیفکیٹ تبدیل کرنا ممکن ہو جاتا ہے۔
مالیاتی اور کارپوریٹ ایپلیکیشنز کے لیے، روٹڈ ڈیوائس پر چلنا ناقابل قبول خطرہ ہے: حملہ آور ٹوکنز، سیشن کیز اور ذاتی ڈیٹا تک رسائی حاصل کر لیتا ہے۔ ریگولیٹری ادارے، بشمول PCI Security Standards Council، ادائیگی کی ایپلیکیشنز کو روٹ رسائی کا پتہ لگانے اور اس کا جواب دینے کا پابند کرتے ہیں۔ اس کے جواب میں، Android ڈویلپرز فعال تحفظ کی حکمت عملی کے حصے کے طور پر Root Detection کو شامل کرتے ہیں۔
پتہ لگانے کے دو طریقے ہیں: جامد، جو فائل سسٹم اور انسٹال کردہ پیکجز کا تجزیہ کرتا ہے، اور متحرک، جو رن ٹائم میں جانچ کرتا ہے۔ مشترکہ طریقہ کار کو سب سے زیادہ قابل اعتماد سمجھا جاتا ہے، کیونکہ یہ نظرانداز کرنے کے مختلف ویکٹرز کا احاطہ کرتا ہے۔ NowSecure (2025) کی ایک تحقیق کے مطابق، Google Play کے ٹاپ 100 میں 76% بینکنگ ایپس میں Root Detection کی کوئی نہ کوئی شکل موجود ہے۔
جامد طریقے ایپلیکیشن شروع ہونے پر عمل میں آتے ہیں اور روٹنگ ٹولز کے فائل سسٹم میں چھوڑے گئے روٹ رسائی کے نشانات کی جانچ کرتے ہیں۔ ان طریقوں کو مراعات یافتہ کمانڈز چلانے کی ضرورت نہیں ہوتی اور یہ عام ایپلیکیشن کے سیاق و سباق میں کام کرتے ہیں۔
روٹ رسائی کا بنیادی اشارہ معیاری راستوں میں su قابل عمل فائل کی موجودگی ہے: /system/bin/su، /system/xbin/su، /sbin/su، /su/bin/su۔ ایپلیکیشن File.exists() یا libc سے access() کے مقامی نفاذ کے ذریعے فائل کے وجود کی جانچ کرتی ہے۔ مزید، su --version یا su -c id چلانے اور ایگزٹ کوڈ چیک کرنے کی کوشش کی جا سکتی ہے۔
روٹ رسائی کے انتظام کے لیے عام ایپلیکیشنز: Superuser، SuperSU، Magisk Manager، KingRoot۔ ان کی موجودگی PackageManager.getPackageInfo() کے ذریعے یا /data/app/ ڈائرکٹری پڑھ کر جانچی جاتی ہے۔ جانچنے کے لیے پیکجز: com.topjohnwu.magisk، eu.chainfire.supersu، com.noshufou.android.su، com.thirdparty.superuser، com.koushikdutta.superuser، com.zacharee1.systemuituner۔
Android سسٹم کی خصوصیات میں سسٹم کی حالت کی معلومات محفوظ کرتا ہے، جو System.getProperty اور Build.TAGS کے ذریعے قابل رسائی ہیں۔ اگر Build.TAGS میں release-keys کے بجائے test-keys ہوں، تو یہ ایک کسٹم فرم ویئر کی نشاندہی کرتا ہے، جس میں اکثر روٹ رسائی ہوتی ہے۔ مزید، /system/build.prop پڑھ کر ro.build.tags، ro.debuggable اور ro.secure کی جانچ کی جاتی ہے۔
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) {
// package not found
}
}
return false;
}
}
متحرک طریقے ایپلیکیشن کے آپریشن کے دوران عمل میں آتے ہیں اور عملدرآمد کے ماحول کا تجزیہ کرتے ہیں۔ جامد طریقوں کے برعکس، وہ Magisk Hide یا Zygisk کے ذریعے چھپی ہوئی روٹنگ کا پتہ لگا سکتے ہیں، کیونکہ وہ صرف فائل ڈھانچہ نہیں بلکہ سسٹم کے رویے کی جانچ کرتے ہیں۔
روٹ رسائی کے ساتھ، کچھ سسٹم پارٹیشنز ro (صرف پڑھنے) کے بجائے rw (پڑھنے لکھنے) کے جھنڈے کے ساتھ ماؤنٹ ہوتے ہیں۔ ایپلیکیشن /proc/mounts پڑھتی ہے اور جانچتی ہے کہ /system ro کے طور پر ماؤنٹ ہے۔ اگر /system rw کے طور پر ماؤنٹ ہے، تو یہ تبدیل شدہ سسٹم کی نشاندہی کرتا ہے۔ مزید، Magisk کے ذریعے /su ماؤنٹنگ کی موجودگی کی جانچ کی جاتی ہے۔
Android محفوظ موڈ تیسرے فریق کی ایپلیکیشنز کو غیر فعال کرتا ہے، بشمول روٹ مینیجرز۔ ایک درست Root Detection نفاذ جانچ سکتا ہے کہ آیا ڈیوائس محفوظ موڈ میں چل رہی ہے۔ اگر ایپلیکیشن یہ پتہ لگاتی ہے کہ روٹ مینیجرز نظر نہیں آ رہے لیکن su بائنری موجود ہے، تو یہ Magisk Hide کی علامت ہے۔
ProcessBuilder یا Runtime.exec کے ذریعے su -c id چلانے کی کوشش روٹ رسائی کا براہ راست ٹیسٹ ہے۔ تاہم، Magisk اس کال کو روک سکتا ہے۔ زیادہ قابل اعتماد طریقہ مقامی کوڈ کے ذریعے جانچ ہے: /proc/1/limits یا /proc/self/maps کھولنا اور چلنے والی پروسیسز کے UID کا تجزیہ کرنا۔ اگر ایپلیکیشن UID 0 حاصل کر سکتی ہے یا صرف روٹ کے لیے قابل رسائی فائلیں پڑھ سکتی ہے، تو ڈیوائس سے سمجھوتہ کیا گیا ہے۔
public boolean checkRootDynamically() {
// Build flags check
String buildTags = Build.TAGS;
if (buildTags != null && buildTags.contains("test-keys")) {
return true;
}
// Checking /system mount
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) {
// error reading mounts
}
return false;
}
Java میں نافذ کردہ Root Detection آسانی سے Xposed ماڈیولز یا Frida کے ذریعے نظرانداز کیا جاتا ہے، جو Java طریقوں کو روکتے ہیں اور واپسی کی قدروں کو تبدیل کرتے ہیں۔ JNI کے ذریعے C++ میں مقامی نفاذ نمایاں طور پر زیادہ مزاحم ہے: Java کی سطح پر کام کرنے والے متحرک تجزیہ کے اوزار stat، access، popen اور dlopen جیسی مقامی libc کالز نہیں دیکھ سکتے۔
#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;
}
مقامی جانچ Java API استعمال نہیں کرتی، جو اسے Dalvik/ART کی سطح پر کام کرنے والے نظرانداز کرنے والے ٹولز کے لیے پوشیدہ بناتی ہے۔ اضافی تحفظ کے لیے، مستقلات (راستوں کی فہرست) کو صرف پڑھنے والے حصے میں محفوظ نہ کرنے بلکہ سادہ قابل واپسی افعال کے ذریعے ان کا حساب لگانے کی سفارش کی جاتی ہے۔ libc سے stat کال براہ راست Linux کرنل تک رسائی حاصل کرتی ہے، Java ریپرز کو نظرانداز کرتے ہوئے، اور Xposed کے ذریعے اسے روکا نہیں جا سکتا۔
تحفظ کے ڈویلپرز کو مضبوط پتہ لگانے کا نظام بنانے کے لیے موجودہ نظرانداز کرنے کے طریقوں کو سمجھنے کی ضرورت ہے۔ ہر نظرانداز کرنے کے طریقہ کار کو مناسب سطح پر انسداد اقدام کی ضرورت ہے۔
Magisk Android 9–14 پر سب سے مقبول روٹنگ ٹول ہے۔ Magisk Hide /proc سے su کی موجودگی چھپاتا ہے اور راستوں کی جانچ کے نتائج کو جعلی بناتا ہے۔ Magisk کرنل کی سطح پر کام کرتا ہے اور ایپلیکیشن کے دیکھنے سے پہلے stat() اور access() کو روکتا ہے۔ انسداد اقدام: /sbin/.magisk کی موجودگی کے ذریعے خود Magisk کی موجودگی کی جانچ کرنا یا ایپلیکیشن کے اپنے maps پڑھ کر جانچ کرنا — Magisk اپنی لائبریری ہر پروسیس میں داخل کرتا ہے۔
Frida ایک متحرک آلہ کاری کا آلہ ہے جو Ptrace یا Dobby کے ذریعے مقامی افعال کو روک سکتا ہے۔ Frida کسی بھی جانچ کی واپسی کی قدر کو تبدیل کرتا ہے، stat کے نتیجے کو ENOENT میں جعلی بناتا ہے۔ انسداد اقدام: میموری میں ہدایات کے چیکسم کا حساب لگا کر مقامی افعال کی سالمیت کی تصدیق کرنا اور frida-agent.so یا frida-helper کی موجودگی کے لیے /proc/self/maps کے تجزیے کے ذریعے Frida کا پتہ لگانا۔
Java میں نافذ کردہ Root Detection 2–3 منٹ میں ہٹا دیا جاتا ہے: APK کو apktool کے ذریعے ڈی کمپائل کیا جاتا ہے، smali کوڈ میں طریقہ کار کی واپسی کی قدر false میں تبدیل کی جاتی ہے، APK کو دوبارہ بنایا اور دستخط کیا جاتا ہے۔ انسداد اقدام: اہم منطق کو مقامی کوڈ میں منتقل کرنا اور Signature API کے ذریعے رن ٹائم میں ایپلیکیشن کے ڈیجیٹل دستخط کی تصدیق کرنا یا APK ہیش کا سرور پر حوالہ سے موازنہ کرنا۔
مؤثر Root Detection ایک کثیر پرت فن تعمیر پر بنایا گیا ہے۔ کوئی ایک طریقہ خود سے کافی تحفظ فراہم نہیں کرتا۔ جامد اور متحرک جانچوں، مقامی کوڈ اور سرور سائیڈ تصدیق کا امتزاج زیادہ سے زیادہ مزاحمت دیتا ہے۔
صرف کلائنٹ سائیڈ جانچ پر انحصار نہ کریں۔ Root Detection کے نتائج کو ایک بار استعمال ہونے والے سیشن ٹوکن کے ساتھ سرور کو بھیجیں۔ سرور فعالیت کو بلاک یا محدود کرنے کا فیصلہ کرتا ہے۔ یہ API کی سطح پر حملوں کو روکتا ہے، جہاں کلائنٹ ایپلیکیشن تبدیل کی جا سکتی ہے جبکہ سرور قابل اعتماد فریق رہتا ہے۔
Root Detection کوڈ مبہم ہونا چاہیے۔ اگر حملہ آور jadx میں su راستوں کی جانچ کا واضح سلسلہ دیکھتا ہے، تو نظرانداز کرنے میں منٹ لگیں گے۔ کنٹرول فلو کو مبہم کرنے اور سٹرنگز کو خفیہ کرنے کے لیے ProGuard یا DexGuard استعمال کریں۔ مبہم سازی تحفظ کوڈ کے تجزیہ کے وقت کو منٹوں سے گھنٹوں تک بڑھا دیتی ہے۔
جانچے گئے راستوں، پیکجز اور اشارے کی فہرست کو ہر ایپلیکیشن ریلیز کے ساتھ اپ ڈیٹ کیا جانا چاہیے۔ نئے روٹنگ اور نظرانداز کرنے والے ٹولز ماہانہ ظاہر ہوتے ہیں۔ ایک جامد فہرست جو ایک سال میں تبدیل نہیں ہوئی، جدید طریقوں کا پتہ نہیں لگائے گی۔ جانچ کرنے سے پہلے ایپلیکیشن شروع ہونے پر سرور سے موجودہ دستخط لوڈ کرنے کی سفارش کی جاتی ہے۔
اکثر پوچھے گئے سوالات
Root Detection اس ڈیوائس پر ایپلیکیشن چلنے سے روکتا ہے جہاں Android سینڈ باکس غیر فعال ہے۔ روٹڈ ڈیوائس پر، کوئی بھی ایپلیکیشن دوسری ایپلیکیشنز کا ڈیٹا پڑھ سکتی ہے۔ بینکنگ اور ادائیگی کی ایپلیکیشنز PCI DSS کی ضروریات اور OWASP Mobile Security سفارشات کے مطابق روٹڈ ڈیوائسز پر آپریشن بلاک کرنے کی پابند ہیں۔
Magisk Hide ماؤنٹ نام کی جگہ (mount namespace) کا طریقہ کار استعمال کرتا ہے۔ اخراج کی فہرست میں ہر پروسیس کے لیے، Magisk ایک الگ تھلگ نام کی جگہ بناتا ہے جہاں su بائنری پوشیدہ ہے۔ اس نام کی جگہ میں سسٹم کالز stat، access اور open Magisk فائلیں نہیں دیکھتیں۔ /proc/self/maps کی موجودگی کی جانچ اور magisk ڈمپ تلاش کرکے Magisk کا پتہ لگایا جا سکتا ہے۔
ہاں، اگر ایپلیکیشن اپنے کوڈ کی سالمیت کی تصدیق نہیں کرتی۔ Frida کے ذریعے، Java کی جانچ کے طریقہ کار کو روکا جا سکتا ہے اور false واپس کرنے پر مجبور کیا جا سکتا ہے۔ انسداد اقدام C++ میں اہم منطق کا مقامی نفاذ اور DEX فائل ہیش کے ذریعے سالمیت کی تصدیق ہے۔ مبہم سازی کے بغیر، Java پر کوئی بھی Root Detection 5–10 منٹ میں نظرانداز ہو جاتا ہے۔
SafetyNet (متروک) اور Play Integrity API Google کے سرور سائیڈ چیک ہیں جو ڈیوائس کی سالمیت کی تصدیق کرتے ہیں۔ ان میں بوٹ لوڈر، سسٹم دستخط اور روٹ اسٹیٹس کی جانچ شامل ہے۔ Play Integrity API SafetyNet کا تجویز کردہ متبادل ہے، جو تین سطحیں فراہم کرتا ہے: BASIC، DEVICE اور STRONG۔ کلائنٹ سائیڈ Root Detection سرور سائیڈ توثیق کو مکمل کرتا ہے۔
ایک حقیقی روٹڈ ڈیوائس (مثال کے طور پر، Magisk والا Pixel) پر ایپلیکیشن انسٹال کریں۔ چیک کریں کہ آیا بلاکنگ متحرک ہوتی ہے۔ پھر اپنی ایپلیکیشن کے لیے Magisk Hide کے ذریعے روٹ چھپانے کی کوشش کریں اور ٹیسٹ دوبارہ شروع کریں۔ گہری جانچ کے لیے، ہدف کے طریقوں کو روکنے کے لیے Frida استعمال کریں اور یقینی بنائیں کہ مقامی تحفظ کو نظرانداز نہیں کیا جا سکتا۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں