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 निष्पादित करने और exit कोड की जाँच करने का प्रयास किया जा सकता है।
रूट एक्सेस प्रबंधित करने के लिए विशिष्ट ऐप्स: 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 (read-only) के बजाय rw (read-write) फ़्लैग के साथ माउंट किए जाते हैं। ऐप /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 माउंट नेमस्पेस तंत्र का उपयोग करता है। बहिष्करण सूची में प्रत्येक प्रक्रिया के लिए, 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 एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें