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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন