Jailbreak Detection হল মেকানিজমের একটি সেট যা iOS ডিভাইসে জেলব্রেকের উপস্থিতি সনাক্ত করে এবং সীমাবদ্ধতা অপসারণ করা পরিবেশে অ্যাপ্লিকেশন চলতে বাধা দেয়। জেলব্রেক স্যান্ডবকের বাইরে ফাইল সিস্টেমে অ্যাক্সেস প্রদান করে, পরিবর্তিত লাইব্রেরি ইনস্টল করার এবং সিস্টেম কল আটকানোর অনুমতি দেয়। Apple Security Documentation (2024) অনুসারে, জেলব্রেক করা ডিভাইসগুলি Secure Boot সুরক্ষা মডেল মেনে চলে না। Jailbreak Detection ফাইল সূচক পরীক্ষা, রানটাইম কল বিশ্লেষণ এবং স্যান্ডবক্স স্বাক্ষর অখণ্ডতা যাচাইকরণ একত্রিত করে।
মূল বিষয়
Jailbreak Detection হল সেই iOS ডিভাইসগুলি শনাক্ত করার প্রক্রিয়া যেগুলি থেকে অপারেটিং সিস্টেমের সীমাবদ্ধতা অপসারণ করা হয়েছে। জেলব্রেক iOS কার্নেল পরিবর্তন করে, কোড সাইনিং নিষ্ক্রিয় করে, সম্পূর্ণ ফাইল সিস্টেমে অ্যাক্সেস প্রদান করে এবং অননুমোদিত লাইব্রেরি লোড করার অনুমতি দেয়। এই ধরনের ডিভাইসে চলমান অ্যাপ্লিকেশনের জন্য, রানটাইম পরিবেশের অখণ্ডতার কোনো নিশ্চয়তা নেই: যেকোনো প্রক্রিয়া অ্যাপ্লিকেশনের মেমোরি পড়তে পারে, সিস্টেম ট্রাস্ট স্টোরে নিজস্ব সার্টিফিকেট ইনস্টল করে SSL/TLS ট্রাফিক আটকাতে পারে এবং Cydia Substrate বা Substitute-এর মাধ্যমে কোড ইনজেক্ট করতে পারে।
iOS-এ আর্থিক অ্যাপ্লিকেশনগুলি PCI DSS মান অনুযায়ী Jailbreak Detection বাস্তবায়নে বাধ্য — সার্টিফিকেশনের জন্য, অ্যাপ্লিকেশনকে প্রমাণ করতে হবে যে এটি আপস করা ডিভাইসে চলছে না। OWASP Mobile Security (2024) Jailbreak Detection-এর অনুপস্থিতিকে M8 দুর্বলতা হিসাবে শ্রেণীবদ্ধ করে। App Store অ্যাপ্লিকেশনের জন্য, Apple জেলব্রেক করা ডিভাইসে কার্যকারিতা ব্লক করতে নিষেধ করে না, তবে সংশোধন করা যেতে পারে এমন ক্লায়েন্ট কোডের উপর একচেটিয়াভাবে নির্ভর না করার জন্য ক্লায়েন্ট-সাইড এবং সার্ভার-সাইড পরীক্ষা একত্রিত করার সুপারিশ করে।
স্যান্ডবক্স মডেলের কারণে iOS-এ Jailbreak Detection-এর স্থাপত্য Android-এ Root Detection-এর চেয়ে জটিল। Android-এ, একটি অ্যাপ্লিকেশন সিস্টেম বিশ্লেষণ করতে /proc পড়তে পারে। iOS স্যান্ডবক্স বেশিরভাগ সিস্টেম সূচকে সরাসরি অ্যাক্সেস ব্লক করে। ডেভেলপাররা canAccessFile API-এর মাধ্যমে নিষিদ্ধ অঞ্চলে ফাইলের উপলভ্যতা পরীক্ষা করা বা exit কোড যাচাই সহ fork()-এর মাধ্যমে চাইল্ড প্রক্রিয়া চালু করার মতো বিকল্প কৌশল ব্যবহার করতে বাধ্য হন। আধুনিক পরীক্ষাগুলি শুধুমাত্র জেলব্রেকের অধীনে উপলব্ধ কর্ম চেষ্টা করা এবং ফলাফল বিশ্লেষণের উপর নির্মিত।
সবচেয়ে সহজ এবং ঐতিহাসিকভাবে প্রথম পদ্ধতি হল ফাইল এবং অ্যাপ্লিকেশনগুলির উপস্থিতি পরীক্ষা করা যা শুধুমাত্র জেলব্রেক করা ডিভাইসে ইনস্টল করা হয়। সরলতা সত্ত্বেও, ফাইল পরীক্ষা প্রতিরক্ষার একটি মৌলিক স্তর হিসাবে রয়ে গেছে, কারণ সেগুলি বাইপাস করতে ব্যবহারকারীর সক্রিয় পদক্ষেপ প্রয়োজন।
জেলব্রেক করা ডিভাইসে, Cydia, Sileo, Zebra বা Installer-এর মতো অ্যাপ্লিকেশন উপস্থিত থাকে। তাদের উপস্থিতি NSFileManager-এর মাধ্যমে পরীক্ষা করা হয়: [[NSFileManager defaultManager] fileExistsAtPath:@"/Applications/Cydia.app"]। unc0ver, checkra1n, Taurine এবং Chimera-এর প্যাকেজ একইভাবে পরীক্ষা করা হয়। HideJB টুইকগুলির মাধ্যমে এই পরীক্ষাগুলি বাইপাস করা যেতে পারে যা NSFileManager কল আটকায়।
জেলব্রেক স্টক iOS-এ অনুপলব্ধ UNIX ইউটিলিটি ইনস্টল করে: apt, dpkg, ssh, rsync, sftp, dd, readlink এবং অন্যান্য। /usr/bin/ssh, /bin/bash, /bin/sh এবং /usr/libexec/sftp-server-এর অস্তিত্ব পরীক্ষা করা হয়। যদি এই ফাইলগুলির যেকোনো একটি সফলভাবে সনাক্ত করা হয়, তাহলে জেলব্রেকের সম্ভাবনা বেশি। iOS 13–17-এর জন্য, /var/jb-এর উপস্থিতি পরীক্ষা করাও প্রাসঙ্গিক — unc0ver এবং Taurine-এর জন্য বুটস্ট্র্যাপ রুট ডিরেক্টরি।
MobileSubstrate (CydiaSubstrate.dylib) এবং Substitute হল প্রক্রিয়াগুলিতে কোড ইনজেকশনের জন্য লাইব্রেরি। তাদের উপস্থিতি RTLD_NOLOAD ফ্ল্যাগ সহ dlopen()-এর মাধ্যমে পরীক্ষা করা হয়। যদি লাইব্রেরি অ্যাড্রেস স্পেসে লোড করা থাকে — তাহলে প্রক্রিয়াটি জেলব্রেক করা পরিবেশে চলছে। এটি আরও নির্ভরযোগ্য পরীক্ষা, কারণ HideJB একটি প্রক্রিয়ায় ইতিমধ্যে লোড করা লাইব্রেরি আনলোড করতে পারে না।
- (BOOL)isJailbrokenByFiles {
NSArray *paths = @[
@"/Applications/Cydia.app",
@"/Applications/Sileo.app",
@"/Applications/Zebra.app",
@"/usr/bin/ssh",
@"/bin/bash",
@"/var/jb",
@"/etc/apt"
];
for (NSString *path in paths) {
if ([[NSFileManager defaultManager]
fileExistsAtPath:path]) {
return YES;
}
}
return NO;
}
- (BOOL)isSubstrateLoaded {
void *handle = dlopen(
"/Library/MobileSubstrate/MobileSubstrate.dylib",
RTLD_NOLOAD | RTLD_LAZY
);
if (handle) {
dlclose(handle);
return YES;
}
return NO;
}
গতিশীল পরীক্ষাগুলি iOS স্যান্ডবক্সে নিষিদ্ধ কাজ করে এবং ফলাফল বিশ্লেষণ করে। যদি কাজটি ব্লক না হয় — তাহলে ডিভাইসটি সম্ভবত জেলব্রেক করা।
স্টক iOS-এ, fork() কল errno = EPERM সহ -1 ফেরত দেয়। জেলব্রেক করা ডিভাইসে, fork() সফল হতে পারে কারণ স্যান্ডবক্স সীমাবদ্ধতা অপসারণ করা হয়েছে। এই পরীক্ষাটি নির্ভরযোগ্য তবে কিছু iOS সংস্করণে মিথ্যা পজিটিভ তৈরি করতে পারে। fork() একটি চাইল্ড প্রক্রিয়া চালু করার ক্ষমতা পরীক্ষা করতে posix_spawn() দিয়েও প্রতিস্থাপন করা যেতে পারে।
নিষিদ্ধ অঞ্চলে ফাইল পড়ার চেষ্টা: /etc/master.passwd, /var/log/system.log, /private/var/cache। স্টক iOS-এ, এই পড়াগুলি ত্রুটি ফেরত দেয়। যদি অ্যাপ্লিকেশন সফলভাবে এই ফাইলগুলি পড়ে — তাহলে স্যান্ডবক্স অক্ষম। অতিরিক্তভাবে, /private/-এ লেখার ক্ষমতা পরীক্ষা করা হয় — স্যান্ডবক্সে, সমস্ত সিস্টেম পার্টিশন সাধারণ অ্যাপ্লিকেশনের জন্য শুধুমাত্র-পঠনযোগ্য হিসাবে মাউন্ট করা হয়।
জেলব্রেক সিস্টেম লাইব্রেরি সংশোধন করে, যার মধ্যে dyld শেয়ার্ড ক্যাশ অন্তর্ভুক্ত। সিস্টেম ফ্রেমওয়ার্ক বা পৃথক প্রতীকের হ্যাশ পরীক্ষা করা সংশোধন প্রকাশ করতে পারে। iOS 14+-এর জন্য, sysctl kern.version পড়ে কার্নেল অ্যাড্রেস স্পেসে jit_region_create প্রতীক বা Fugu14/checkra1n অপারেশনের অন্যান্য লক্ষণের উপস্থিতি পরীক্ষা করা হয়।
- (BOOL)isJailbrokenByRuntime {
// fork() পরীক্ষা করা হচ্ছে
int pid = fork();
if (pid == 0) {
exit(0);
}
if (pid > 0) {
waitpid(pid, NULL, 0);
return YES;
}
// সিস্টেম ফাইলে অ্যাক্সেস পরীক্ষা করা হচ্ছে
FILE *f = fopen("/etc/master.passwd", "r");
if (f) {
fclose(f);
return YES;
}
// sysctl kern.version পরীক্ষা করা হচ্ছে
size_t size = 0;
sysctlbyname("kern.version", NULL, &size, NULL, 0);
if (size > 0) {
char *version = malloc(size);
sysctlbyname("kern.version", version, &size, NULL, 0);
NSString *str = [NSString stringWithUTF8String:version];
free(version);
if ([str containsString:"pwned"]) {
return YES;
}
}
return NO;
}
Swift কোড সহজেই ডিসঅ্যাসেম্বল এবং Substrate-এর মাধ্যমে বাইপাস করা যায়। libobjc এবং C সিস্টেম ফাংশনে সরাসরি কল সহ Objective-C-তে নেটিভ বাস্তবায়ন পরীক্ষাগুলিকে বাইপাসের জন্য উল্লেখযোগ্যভাবে বেশি প্রতিরোধী করে তোলে।
libc থেকে stat() কল Objective-C স্তরে আটকানো যাবে না। NSFileManager পদ্ধতি আটকানো HideJB টুইকগুলি stat()-কে প্রভাবিত করে না। stat() ব্যবহার করে নেটিভ পরীক্ষা HideJB মডিউল ইনস্টল করা ডিভাইসেও ফাইল সূচক সনাক্ত করে। ফাইলের জন্য stat() এবং লাইব্রেরির জন্য RTLD_NOLOAD সহ dlopen()-এর সংমিশ্রণ দুটি নন-ওভারল্যাপিং সনাক্তকরণ চ্যানেল সরবরাহ করে।
নেটিভ ফাংশন SecStaticCodeCheckValidity Apple সার্টিফিকেটের বিরুদ্ধে অ্যাপ্লিকেশনের কোড স্বাক্ষর যাচাই করে। জেলব্রেক করা ডিভাইসে, এই পরীক্ষাটি কার্নেল প্যাচের মাধ্যমে জাল হতে পারে। জালিয়াতি এড়াতে, পরীক্ষাটি Swift Bridge-এর পরিবর্তে Security.framework থেকে dlopen()-এর মাধ্যমে কল সহ নেটিভ কোড থেকে করা উচিত।
#import <sys/stat.h>
#import <dlfcn.h>
- (BOOL)nativeCheckForJailbreak {
// stat() NSFileManager হুক বাইপাস করছে
struct stat st;
if (stat("/Applications/Cydia.app", &st) == 0) {
return YES;
}
// লোড না করেই Substrate পরীক্ষার জন্য dlopen
void *substrate = dlopen(
"/Library/MobileSubstrate/MobileSubstrate.dylib",
RTLD_NOLOAD
);
if (substrate) {
dlclose(substrate);
return YES;
}
return NO;
}
শক্তিশালী সুরক্ষা তৈরির জন্য বাইপাস কৌশল বোঝা অপরিহার্য। আধুনিক বাইপাস সরঞ্জামগুলি সক্রিয়ভাবে বিকশিত হচ্ছে, এবং পরীক্ষার একটি স্থির সেট মাসের মধ্যে অকার্যকর হয়ে যায়।
HideJB একটি টুইক যা NSFileManager, stat(), dlopen() এবং fork()-এ কল আটকায় এবং ফেরত মান প্রতিস্থাপন করে। HideJB Cydia Substrate স্তরে কাজ করে, Objective-C এবং C উভয় ফাংশন আটকায়। iOS 15–16-এর জন্য HideJB (Shadow)-এর সংস্করণ কার্নেল-স্তরের হুক পদ্ধতি ব্যবহার করে। প্রতিউপায়: IPC-এর মাধ্যমে ফলাফল সরবরাহ সহ একটি পৃথক প্রক্রিয়ায় পরীক্ষা করুন, যা হুক চেইন ভেঙে দেয়।
Choicy নির্দিষ্ট প্রক্রিয়ার জন্য Substrate নিষ্ক্রিয় করার অনুমতি দেয়। ব্যবহারকারী সুরক্ষিত অ্যাপ্লিকেশনের জন্য ইনজেকশন বন্ধ করে দেয় — সমস্ত লাইব্রেরি পরীক্ষা false ফেরত দেয়। Liberty Lite একটি ব্যাপক বাইপাস যা জনপ্রিয় সুরক্ষা লাইব্রেরির বেশিরভাগ পরীক্ষা কভার করে। প্রতিউপায়: DeviceCheck এবং App Attest-এর মাধ্যমে সার্ভার-সাইড যাচাইকরণ — সার্ভার যাচাই করে যে ডিভাইসের কাছে বৈধ Apple সার্টিফিকেট আছে যা জেলব্রেক করা ডিভাইসে জাল করা যাবে না।
Fugu14 এবং KFD-এর মতো কার্নেল এক্সপ্লয়েটগুলি কার্নেল স্পেসে কোড চালায়, যা অ্যাপ্লিকেশন দেখার আগে সিস্টেম কল আটকানোর অনুমতি দেয়। এই স্তরে, stat() এবং fork() পরীক্ষা অকার্যকর হয়ে যায়। একমাত্র নির্ভরযোগ্য প্রতিউপায় হল সার্ভার-সাইড প্রত্যয়ন যাচাই সহ যে ডিভাইসটি Apple Attestation প্রক্রিয়া পাস করেছে। এই প্রোটোকল Secure Enclave-এর ভিতরে ক্রিপ্টোগ্রাফিক কী-এর উপর ভিত্তি করে, যা কার্নেল-স্তরের এক্সপ্লয়েট দিয়েও পড়া যায় না।
কার্যকর Jailbreak Detection তৈরির জন্য, জেলব্রেকের সময় কোন iOS নিরাপত্তা প্রক্রিয়া নিষ্ক্রিয় হয় তা বোঝা প্রয়োজন।
iOS স্বাক্ষর পরীক্ষার একটি সিকোয়েন্সের মাধ্যমে বুট হয়: Boot ROM → iBoot → iOS Kernel। যদি জেলব্রেক bootrom এক্সপ্লয়েট (checkra1n) ব্যবহার করে, তাহলে পুরো Secure Boot Chain আপস হয় — অ্যাপ্লিকেশন স্তরের পরীক্ষাগুলি অকেজো। যদি শুধুমাত্র-সফ্টওয়্যার এক্সপ্লয়েট (unc0ver, Taurine, Fugu14) ব্যবহার করা হয়, তাহলে বুট চেইন ভাঙে না, এবং App Attest-এর মতো Apple পরিষেবাগুলি বিশ্বস্ত থাকে।
iOS 10 থেকে শুরু করে, Apple KPP চালু করেছে — হার্ডওয়্যার সুরক্ষা যা প্রতি 200 ms-এ কার্নেল অখণ্ডতা পুনরায় যাচাই করে। সমস্ত আধুনিক জেলব্রেক (iOS 14–17) PAC বা APRR-এর মাধ্যমে KTRR বাইপাস ব্যবহার করে, কিন্তু KPP পরিবর্তিত sysctl সিস্টেম টেবিলের আকারে চিহ্ন রেখে যায়। pwned, prod, বা অ-মানক সংস্করণ সহ xnu-এর মতো স্ট্রিং-এর উপস্থিতির জন্য kern.version পরীক্ষা করা একটি কার্নেল প্যাচ প্রকাশ করতে পারে।
iOS স্যান্ডবক্স এনটাইটেলমেন্ট ব্যবহার করে TrustedBSD স্তরে কাজ করে। জেলব্রেক স্যান্ডবক্স প্রোফাইলকে allow-all দিয়ে প্রতিস্থাপন করে। একটি অ্যাপ্লিকেশন তার Documents ডিরেক্টরির বাইরে যেকোনো ফাইল পড়ার চেষ্টা করে স্যান্ডবক্স যাচাই করতে পারে। যদি সফল হয় — তাহলে স্যান্ডবক্স সংশোধন করা হয়েছে। স্যান্ডবক্স অখণ্ডতা কয়েকটি সূচকের মধ্যে একটি যা কার্নেল-স্তরের এক্সপ্লয়েট ছাড়া জাল করা যায় না, কারণ অনুমতি পরীক্ষা এটি আটকানোর আগে কার্নেলে সঞ্চালিত হয়।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
Android-এর জন্য Root Detection su বাইনারি এবং Magisk-এর উপস্থিতি পরীক্ষা করে। iOS-এর জন্য Jailbreak Detection Cydia, Sileo, MobileSubstrate খোঁজে, fork() চালানোর ক্ষমতা পরীক্ষা করে এবং সিস্টেম ফাইল পড়ে। iOS স্যান্ডবক্স স্থাপত্য Android-এর চেয়ে কঠোর, তাই iOS পরীক্ষাগুলি সিস্টেম সূচক পড়ার পরিবর্তে নিষিদ্ধ কাজ সম্পাদনের চেষ্টার উপর বেশি নির্ভর করে।
হ্যাঁ, iOS 16–17-এর জন্য Dopamine, palera1n এবং checkra1n জেলব্রেক প্রাসঙ্গিক। Jailbreak Detection কাজ করে কিন্তু নতুন সরঞ্জামের জন্য পরীক্ষা আপডেট করা প্রয়োজন। iOS 17-এ, Apple স্যান্ডবক্স শক্তিশালী করেছে এবং XNU-তে পরিবর্তনের কারণে অনেক পুরানো পরীক্ষা (উদাহরণস্বরূপ, fork()) অবিশ্বস্ত হয়ে গেছে।
সবচেয়ে সহজ উপায় হল HideJB বা Shadow, যা লাইব্রেরি স্তরে পরীক্ষা আটকায়। আরও জটিল সুরক্ষার জন্য, একটি নির্দিষ্ট অ্যাপ্লিকেশনের জন্য ইনজেকশন নিষ্ক্রিয় করতে Frida বা Choicy ব্যবহার করা হয়। সার্ভার-সাইড প্রত্যয়ন (App Attest) শুধুমাত্র Secure Enclave হার্ডওয়্যার কী প্রতিস্থাপনকারী কার্নেল-স্তরের এক্সপ্লয়েটের মাধ্যমে বাইপাস করা যেতে পারে, যা কার্যত অসম্ভব।
জেলব্রেক করা ডিভাইসে যেকোনো অ্যাপ্লিকেশন নিম্নলিখিতগুলির শিকার হতে পারে: বিশ্বস্ত স্টোর সংশোধনের মাধ্যমে SSL ট্রাফিক আটকানো, ফাইল সিস্টেম অ্যাক্সেসের মাধ্যমে Keychain পড়া, টোকেন হ্যান্ডলিং পদ্ধতি আটকানোর সাথে Substrate-এর মাধ্যমে কোড ইনজেকশন এবং এনক্রিপশন কী পাওয়ার জন্য মেমোরি ডাম্পিং।
App Attest হল অ্যাপ্লিকেশন এবং ডিভাইসের অখণ্ডতা যাচাই করার জন্য Apple-এর পরিষেবা। স্টার্টআপে, অ্যাপ্লিকেশন Apple সার্ভার থেকে একটি প্রত্যয়ন চ্যালেঞ্জ (attestation challenge) পায়, এটি Secure Enclave থেকে প্রাইভেট কী দিয়ে স্বাক্ষর করে এবং তার নিজের সার্ভারে পাঠায়। যদি ডিভাইস জেলব্রেক করা হয়, তাহলে Secure Enclave একটি প্রত্যয়ন ব্যর্থতা ফেরত দেয়, যা সুরক্ষিত ফাংশনে অ্যাক্সেস ব্লক করে।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন