মোবাইল অ্যাপে Root Detection — শনাক্তকরণ পদ্ধতি এবং কাজের নীতি

লেখক: IT Sectr প্রকাশিত: 2026-04-03 পড়ার সময়: 9 মিনিট

Root Detection হল একটি সুরক্ষা ব্যবস্থা যা Android অ্যাপ্লিকেশনগুলিকে সুপারইউজার বিশেষাধিকারপ্রাপ্ত ডিভাইসে চলতে বাধা দেয়। ব্যাংকিং, পেমেন্ট এবং কর্পোরেট অ্যাপ্লিকেশনগুলি রুটেড ডিভাইসে কার্যকারিতা ব্লক বা সীমাবদ্ধ করে, কারণ রুট অ্যাক্সেস Android স্যান্ডবক্সের সীমাবদ্ধতা দূর করে এবং ট্রাফিক আটকানো, প্রক্রিয়ার মেমরি পড়া এবং ডেটা জালিয়াতির সম্ভাবনা খুলে দেয়। OWASP Mobile Top 10 (2024) অনুসারে, Root Detection-এর অনুপস্থিতি M8 ক্যাটাগরির (Security Decisions via Untrusted Inputs) অধীনে পড়ে। Root Detection ফাইল সিস্টেমের স্ট্যাটিক পরীক্ষা এবং রানটাইম আচরণের ডায়নামিক বিশ্লেষণের সমন্বয়ে গঠিত।

মূল বিষয়

  • Root Detection — আপোসকৃত পরিবেশে চলা থেকে অ্যাপকে রক্ষা করতে Android ডিভাইসে রুট অ্যাক্সেসের উপস্থিতি পরীক্ষা করা
  • স্ট্যাটিক পদ্ধতি su বাইনারি, Superuser অ্যাপ এবং সিস্টেম পার্টিশনের পরিবর্তনের জন্য ফাইল সিস্টেম পরীক্ষা করে
  • ডায়নামিক পদ্ধতি রানটাইম বিশ্লেষণ করে: Build.TAGS পরীক্ষা, বিশেষাধিকারপ্রাপ্ত প্রক্রিয়ার সাথে /proc/self/maps খোলার চেষ্টা
  • নেটিভ বাস্তবায়ন JNI-এর মাধ্যমে C/C++-এ Java স্তরে Xposed এবং Frida-এর মাধ্যমে বাইপাসের প্রতিরোধ নিশ্চিত করে
  • সুরক্ষা Root Detection-এর জন্য পরীক্ষার ফলাফলে হেরফের রোধ করতে ক্রমাগত অস্পষ্টকরণ এবং সার্ভার-সাইড যাচাইকরণ প্রয়োজন

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 বাইনারির অস্তিত্ব পরীক্ষা

রুট অ্যাক্সেসের প্রধান সূচক হল স্ট্যান্ডার্ড পাথে 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 পরীক্ষা করা হয়।

java
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 পেতে পারে বা শুধুমাত্র রুটের জন্য অ্যাক্সেসযোগ্য ফাইল পড়তে পারে, তাহলে ডিভাইসটি আপোসকৃত।

java
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;
}

C++-এ Root Detection-এর নেটিভ বাস্তবায়ন

Java-তে বাস্তবায়িত Root Detection সহজেই Xposed মডিউল বা Frida-এর মাধ্যমে বাইপাস করা যায়, যা Java পদ্ধতি আটকায় এবং রিটার্ন মান পরিবর্তন করে। JNI-এর মাধ্যমে C++-এ নেটিভ বাস্তবায়ন উল্লেখযোগ্যভাবে বেশি প্রতিরোধী: Java স্তরে কাজ করা ডায়নামিক বিশ্লেষণ টুলগুলি stat, access, popen এবং dlopen-এর মতো নেটিভ libc কল দেখতে পায় না।

cpp
#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-এর মাধ্যমে এটি আটকানো যায় না।

Root Detection বাইপাসের পদ্ধতি

সুরক্ষা ডেভেলপারদের একটি শক্তিশালী শনাক্তকরণ সিস্টেম তৈরি করতে বিদ্যমান বাইপাস পদ্ধতিগুলি বুঝতে হবে। প্রতিটি বাইপাস পদ্ধতির জন্য উপযুক্ত স্তরে প্রতিকার প্রয়োজন।

Magisk Hide এবং Zygisk-এর মাধ্যমে বাইপাস

Magisk Android 9–14-এ সবচেয়ে জনপ্রিয় রুটিং টুল। Magisk Hide /proc থেকে su-এর উপস্থিতি লুকায় এবং পাথ পরীক্ষার ফলাফল জাল করে। Magisk কার্নেল স্তরে কাজ করে এবং অ্যাপ দেখার আগেই stat() এবং access() আটকায়। প্রতিকার: /sbin/.magisk-এর উপস্থিতির মাধ্যমে Magisk-এর উপস্থিতি পরীক্ষা বা অ্যাপের নিজস্ব maps পড়ার মাধ্যমে পরীক্ষা — Magisk প্রতিটি প্রক্রিয়ায় নিজস্ব লাইব্রেরি ইনজেক্ট করে।

Frida-এর মাধ্যমে বাইপাস

Frida একটি ডায়নামিক ইন্সট্রুমেন্টেশন টুল যা Ptrace বা Dobby-এর মাধ্যমে নেটিভ ফাংশন আটকাতে পারে। Frida যেকোনো পরীক্ষার রিটার্ন মান পরিবর্তন করে, stat ফলাফল ENOENT-এ জাল করে। প্রতিকার: মেমরিতে নির্দেশনার চেকসাম গণনা করে নেটিভ ফাংশনের অখণ্ডতা যাচাই করা এবং frida-agent.so বা frida-helper-এর উপস্থিতির জন্য /proc/self/maps বিশ্লেষণের মাধ্যমে Frida শনাক্ত করা।

APK প্যাচিং-এর মাধ্যমে বাইপাস

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 প্রয়োজন?

Root Detection সেই ডিভাইসে অ্যাপ চলা থেকে সুরক্ষা দেয় যেখানে Android স্যান্ডবক্স নিষ্ক্রিয়। রুটেড ডিভাইসে, যেকোনো অ্যাপ অন্যান্য অ্যাপের ডেটা পড়তে পারে। ব্যাংকিং এবং পেমেন্ট অ্যাপগুলিকে PCI DSS প্রয়োজনীয়তা এবং OWASP Mobile Security সুপারিশ অনুযায়ী রুটেড ডিভাইসে অপারেশন ব্লক করতে বাধ্য।

Magisk Hide কীভাবে কাজ করে?

Magisk Hide মাউন্ট নেমস্পেস প্রক্রিয়া ব্যবহার করে। বর্জন তালিকার প্রতিটি প্রক্রিয়ার জন্য, Magisk একটি বিচ্ছিন্ন নেমস্পেস তৈরি করে যেখানে su বাইনারি অদৃশ্য। এই নেমস্পেসে সিস্টেম কল stat, access এবং open Magisk ফাইল দেখে না। /proc/self/maps-এর উপস্থিতি পরীক্ষা করে এবং magisk ডাম্প অনুসন্ধান করে Magisk শনাক্ত করা যায়।

Root Detection কি রুট ছাড়া বাইপাস করা যায়?

হ্যাঁ, যদি অ্যাপ তার কোডের অখণ্ডতা যাচাই না করে। Frida-এর মাধ্যমে, Java পরীক্ষা পদ্ধতি আটকানো এবং জোর করে false ফেরত দেওয়া যায়। প্রতিকার হল C++-এ গুরুত্বপূর্ণ যুক্তির নেটিভ বাস্তবায়ন এবং DEX ফাইল হ্যাশের মাধ্যমে অখণ্ডতা যাচাই। অস্পষ্টকরণ ছাড়া, Java-তে যেকোনো Root Detection 5–10 মিনিটে বাইপাস হয়।

SafetyNet এবং প্রমাণীকরণ কী?

SafetyNet (অপ্রচলিত) এবং Play Integrity API হল Google-এর সার্ভার-সাইড পরীক্ষা যা ডিভাইসের অখণ্ডতা নিশ্চিত করে। এগুলি বুটলোডার, সিস্টেম সই এবং রুট অবস্থা পরীক্ষা অন্তর্ভুক্ত করে। Play Integrity API হল SafetyNet-এর প্রস্তাবিত প্রতিস্থাপন, যা তিনটি স্তর প্রদান করে: BASIC, DEVICE এবং STRONG। ক্লায়েন্ট-সাইড Root Detection সার্ভার-সাইড প্রমাণীকরণের পরিপূরক।

আপনার অ্যাপে Root Detection কীভাবে পরীক্ষা করবেন?

একটি বাস্তব রুটেড ডিভাইসে অ্যাপ ইনস্টল করুন (যেমন, Magisk সহ Pixel)। ব্লক সক্রিয় হয় কিনা পরীক্ষা করুন। তারপর আপনার অ্যাপের জন্য Magisk Hide-এর মাধ্যমে রুট লুকানোর চেষ্টা করুন এবং পরীক্ষা পুনরায় শুরু করুন। গভীর পরীক্ষার জন্য, লক্ষ্য পদ্ধতি আটকাতে Frida ব্যবহার করুন এবং নিশ্চিত করুন যে নেটিভ সুরক্ষা বাইপাস করা যাবে না।

সারসংক্ষেপ

  • Root Detection ব্যাংকিং, পেমেন্ট এবং কর্পোরেট Android অ্যাপের জন্য একটি বাধ্যতামূলক সুরক্ষা উপাদান, যা স্ট্যাটিক এবং ডায়নামিক পরীক্ষার সমন্বয়ে কাজ করে
  • স্ট্যাটিক পদ্ধতি স্ট্যান্ডার্ড পাথে su বাইনারি অনুসন্ধান, ইনস্টল করা রুট ম্যানেজার পরীক্ষা এবং Build.TAGS সিস্টেম বৈশিষ্ট্য বিশ্লেষণ অন্তর্ভুক্ত করে
  • ডায়নামিক পদ্ধতি rw মোডে /system মাউন্টিং বিশ্লেষণ করে, /proc/mounts অখণ্ডতা যাচাই করে এবং বিশেষাধিকারপ্রাপ্ত কমান্ড এক্সিকিউশন পরীক্ষা করে
  • নেটিভ বাস্তবায়ন JNI-এর মাধ্যমে C++-এ Java স্তরে কাজ করা Xposed এবং Frida-এর জন্য পরীক্ষা অদৃশ্য করে, যার জন্য Dobby বা Ptrace-এর মাধ্যমে বাইপাস প্রয়োজন
  • Magisk Hide মাউন্ট নেমস্পেসের মাধ্যমে Root Detection বাইপাসের প্রাথমিক টুল, যা magisk লাইব্রেরির জন্য /proc/self/maps বিশ্লেষণের মাধ্যমে শনাক্তযোগ্য
  • প্রস্তাবিত আর্কিটেকচার: নেটিভ পরীক্ষা + কোড অস্পষ্টকরণ + সার্ভার-সাইড ফলাফল যাচাই + নিয়মিত স্বাক্ষর আপডেট
  • Play Integrity API Google-এর ক্লায়েন্ট-সাইড Root Detection-কে সার্ভার-সাইড ডিভাইস প্রমাণীকরণের সাথে সম্পূরক করে, ব্যাপক সুরক্ষা প্রদান করে

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন