كشف الاختراق (Jailbreak Detection) هو مجموعة من الآليات التي تكتشف وجود اختراق (جيلبريك) على جهاز iOS وتمنع تشغيل التطبيق في بيئة ذات قيود مُزالة. يوفر الجيلبريك الوصول إلى نظام الملفات خارج وضع الحماية (sandbox)، مما يسمح بتثبيت مكتبات معدلة واعتراض استدعاءات النظام. وفقًا لوثائق أمان Apple (2024)، فإن الأجهزة المخترقة لا تتوافق مع نموذج الإقلاع الآمن Secure Boot. يكشف الاختراق (Jailbreak Detection) بين فحوصات مؤشرات الملفات، وتحليل استدعاءات وقت التشغيل، والتحقق من سلامة توقيع وضع الحماية.
النقاط الرئيسية
كشف الاختراق (Jailbreak Detection) هو عملية تحديد أجهزة iOS التي تمت إزالة قيود نظام التشغيل منها. يعدل الاختراق نواة iOS، ويعطل توقيع الكود، ويوفر الوصول إلى نظام الملفات الكامل، ويسمح بتحميل مكتبات غير مصرح بها. بالنسبة لتطبيق يعمل على مثل هذا الجهاز، لا توجد ضمانات لسلامة بيئة التشغيل: يمكن لأي عملية قراءة ذاكرة التطبيق، واعتراض حركة مرور SSL/TLS عن طريق تثبيت شهاداتها الخاصة في مخزن الثقة للنظام، وحقن الكود عبر Cydia Substrate أو Substitute.
التطبيقات المالية على iOS ملزمة بتنفيذ كشف الاختراق وفقًا لمتطلبات معيار PCI DSS — للحصول على الشهادة، يجب على التطبيق إثبات أنه لا يعمل على جهاز مخترق. يصنف OWASP Mobile Security (2024) غياب كشف الاختراق كثغرة M8. بالنسبة لتطبيقات App Store، لا تحظر Apple حظر الوظائف على الأجهزة المخترقة، لكنها توصي بالجمع بين فحوصات جانب العميل وجانب الخادم لتجنب الاعتماد فقط على كود العميل الذي قد يتم تعديله.
هندسة كشف الاختراق على iOS أكثر تعقيدًا من كشف الجذر (Root Detection) على Android بسبب نموذج وضع الحماية (sandbox). على Android، يمكن للتطبيق قراءة /proc لتحليل النظام. يمنع وضع حماية iOS (sandbox) الوصول المباشر إلى معظم مؤشرات النظام. يضطر المطورون إلى استخدام تقنيات بديلة مثل التحقق من توفر الملفات في المناطق المحظورة عبر API canAccessFile أو تشغيل العمليات التابعة عبر fork() مع التحقق من رمز الخروج. تُبنى الفحوصات الحديثة على محاولة تنفيذ إجراءات متاحة فقط تحت الاختراق وتحليل النتيجة.
النهج الأبسط والأول تاريخيًا هو التحقق من وجود ملفات وتطبيقات يتم تثبيتها فقط على الأجهزة المخترقة. على الرغم من بساطتها، تظل فحوصات الملفات طبقة أساسية من الدفاع، حيث أن تجاوزها يتطلب إجراءً نشطًا من المستخدم.
على الجهاز المخترق، توجد تطبيقات مثل Cydia و Sileo و Zebra أو Installer. يتم التحقق من وجودها عبر NSFileManager: [[NSFileManager defaultManager] fileExistsAtPath:@"/Applications/Cydia.app"]. يتم التحقق من حزم unc0ver و checkra1n و Taurine و Chimera بالمثل. يمكن تجاوز هذه الفحوصات من خلال إضافات HideJB التي تعترض استدعاءات NSFileManager.
يثبت الاختراق أدوات UNIX غير متوفرة في iOS الأصلي: apt، dpkg، ssh، rsync، sftp، dd، readlink وغيرها. يتم التحقق من وجود /usr/bin/ssh، /bin/bash، /bin/sh و /usr/libexec/sftp-server. إذا تم اكتشاف أي من هذه الملفات بنجاح، فإن احتمالية وجود اختراق عالية. بالنسبة لنظام iOS 13–17، من المفيد أيضًا التحقق من وجود /var/jb — دليل الجذر للإقلاع (bootstrap) لـ unc0ver و Taurine.
MobileSubstrate (CydiaSubstrate.dylib) و Substitute هما مكتبتان لحقن الكود في العمليات. يتم التحقق من وجودهما عبر dlopen() مع العلم RTLD_NOLOAD. إذا كانت المكتبة محملة في مساحة العناوين — فإن العملية تعمل في بيئة مخترقة. هذا فحص أكثر موثوقية، حيث لا يمكن لـ 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() -1 مع errno = EPERM. على الجهاز المخترق، قد ينجح fork() نظرًا لإزالة قيود وضع الحماية. هذا الفحص موثوق ولكنه قد يؤدي إلى نتائج إيجابية خاطئة في بعض إصدارات iOS. يمكن أيضًا استبدال fork() بـ posix_spawn() للتحقق من القدرة على تشغيل عملية تابعة.
محاولة قراءة الملفات في المناطق المحظورة: /etc/master.passwd، /var/log/system.log، /private/var/cache. في iOS الأصلي، تعيد هذه القراءات خطأ. إذا قرأ التطبيق هذه الملفات بنجاح — فإن وضع الحماية معطل. بالإضافة إلى ذلك، يتم التحقق من القدرة على الكتابة في /private/ — في وضع الحماية، جميع أقسام النظام مثبتة للقراءة فقط للتطبيقات العادية.
يعدل الاختراق مكتبات النظام، بما في ذلك ذاكرة التخزين المؤقت المشتركة dyld. يمكن أن يكشف التحقق من تجزئة أطر العمل النظامية أو الرموز الفردية عن التعديل. بالنسبة لنظام iOS 14+، يتم التحقق من وجود الرمز jit_region_create أو علامات أخرى لعمل Fugu14/checkra1n في مساحة عنوان النواة عبر قراءة sysctl kern.version.
- (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. التنفيذ الأصلي في Objective-C مع استدعاءات مباشرة لـ libobjc ووظائف النظام C يجعل الفحوصات أكثر مقاومة للتجاوز بشكل ملحوظ.
لا يمكن اعتراض استدعاء stat() من libc على مستوى Objective-C. إضافات HideJB التي تعترض أساليب NSFileManager لا تؤثر على stat(). يكشف الفحص الأصلي باستخدام stat() عن مؤشرات الملفات حتى على الأجهزة المثبتة عليها وحدات HideJB. يوفر الجمع بين stat() للملفات و dlopen() مع RTLD_NOLOAD للمكتبات قناتي كشف غير متداخلتين.
تتحقق الوظيفة الأصلية SecStaticCodeCheckValidity من توقيع كود التطبيق مقابل شهادة Apple. على الجهاز المخترق، قد يتم تزوير هذا الفحص عبر تصحيح kernel. لتجنب التزوير، يجب إجراء الفحص من الكود الأصلي مع استدعاء عبر dlopen() من Security.framework، وليس عبر Swift Bridge.
#import <sys/stat.h>
#import <dlfcn.h>
- (BOOL)nativeCheckForJailbreak {
// stat() يتجاوز خطاف NSFileManager
struct stat st;
if (stat("/Applications/Cydia.app", &st) == 0) {
return YES;
}
// dlopen للتحقق من Substrate بدون تحميل
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. تستخدم إصدارات HideJB لنظام iOS 15–16 (Shadow) منهجية خطافات (hooks) على مستوى kernel. الإجراء المضاد: إجراء الفحص في عملية منفصلة مع تسليم النتيجة عبر IPC، مما يكسر سلسلة الخطافات.
يسمح Choicy بتعطيل Substrate لعمليات محددة. يقوم المستخدم ببساطة بتعطيل الحقن للتطبيق المحمي — جميع فحوصات المكتبات تعيد false. Liberty Lite هو تجاوز شامل يغطي معظم الفحوصات من مكتبات الحماية الشائعة. الإجراء المضاد: التحقق من جانب الخادم عبر DeviceCheck و App Attest — يتحقق الخادم من أن الجهاز لديه شهادة Apple صالحة لا يمكن تزويرها على جهاز مخترق.
استغلالات ثغرات kernel، مثل Fugu14 و KFD، تنفذ كودًا في مساحة kernel، مما يسمح باعتراض استدعاءات النظام قبل أن يراها التطبيق. على هذا المستوى، تصبح فحوصات stat() و fork() غير فعالة. الإجراء المضاد الوحيد الموثوق به هو التوثيق من جانب الخادم مع التحقق من أن الجهاز قد اجتاز إجراء توثيق Apple (Apple Attestation). يعتمد هذا البروتوكول على مفاتيح تشفير داخل Secure Enclave، والتي لا يمكن قراءتها حتى مع استغلال على مستوى kernel.
لبناء كشف اختراق فعال، من الضروري فهم آليات أمان iOS التي يتم تعطيلها أثناء الاختراق.
يقلع iOS من خلال سلسلة من فحوصات التوقيع: Boot ROM → iBoot → iOS Kernel. إذا استخدم الاختراق استغلال bootrom (checkra1n)، يتم اختراق سلسلة الإقلاع الآمن بأكملها — الفحوصات على مستوى التطبيق غير مجدية. إذا تم استخدام استغلال برمجي فقط (unc0ver، Taurine، Fugu14)، لا يتم كسر سلسلة الإقلاع، وتبقى خدمات Apple مثل App Attest موثوقة.
بدءًا من iOS 10، قدمت Apple KPP — حماية أجهزة تعيد التحقق من سلامة kernel كل 200 مللي ثانية. تستخدم جميع الاختراقات الحديثة (iOS 14–17) تجاوز KTRR عبر PAC أو APRR، لكن KPP تترك آثارًا في شكل جداول sysctl معدلة. يمكن أن يكشف التحقق من kern.version عن وجود سلاسل مثل pwned أو prod أو xnu بإصدار غير قياسي عن وجود تصحيح kernel.
يعمل وضع حماية iOS على مستوى TrustedBSD باستخدام الصلاحيات (entitlements). يستبدل الاختراق ملف تعريف وضع الحماية بـ allow-all. يمكن للتطبيق التحقق من وضع الحماية بمحاولة قراءة أي ملف خارج دليل Documents الخاص به. إذا نجح — فقد تم تعديل وضع الحماية. سلامة وضع الحماية هي واحدة من المؤشرات القليلة التي لا يمكن تزويرها دون استغلال على مستوى kernel، حيث يتم التحقق من الأذونات في kernel قبل أن يمكن اعتراضها.
الأسئلة الشائعة
كشف الجذر (Root Detection) لنظام Android يتحقق من وجود ثنائي su و Magisk. كشف الاختراق (Jailbreak Detection) لنظام iOS يبحث عن Cydia و Sileo و MobileSubstrate، ويتحقق من القدرة على تنفيذ fork() ويقرأ ملفات النظام. هندسة وضع حماية iOS أكثر صرامة من Android، لذلك تعتمد فحوصات iOS بشكل أكبر على محاولة تنفيذ إجراءات محظورة بدلاً من قراءة مؤشرات النظام.
نعم، الاختراقات Dopamine و palera1n و checkra1n ذات صلة بـ iOS 16–17. يعمل كشف الاختراق ولكنه يتطلب تحديث الفحوصات للأدوات الجديدة. في iOS 17، عززت Apple وضع الحماية، وأصبحت العديد من الفحوصات القديمة (على سبيل المثال، fork()) غير موثوقة بسبب التغييرات في XNU.
أسهل طريقة هي HideJB أو Shadow، التي تعترض الفحوصات على مستوى المكتبات. للحماية الأكثر تعقيدًا، يتم استخدام Frida أو Choicy لتعطيل الحقن لتطبيق معين. يمكن تجاوز التوثيق من جانب الخادم (App Attest) فقط من خلال استغلال على مستوى kernel يستبدل المفتاح الأجهزي لـ Secure Enclave، وهو أمر غير قابل للتنفيذ عمليًا.
أي تطبيق على جهاز مخترق يمكن أن يتعرض لـ: اعتراض حركة مرور SSL عبر تعديل مخزن الثقة، قراءة Keychain من خلال الوصول إلى نظام الملفات، حقن كود عبر Substrate مع اعتراض طرق التعامل مع الرموز المميزة، وتفريغ ذاكرة العملية للحصول على مفاتيح التشفير.
App Attest هي خدمة Apple للتحقق من سلامة التطبيق والجهاز. عند بدء التشغيل، يتلقى التطبيق تحدي توثيق (attestation challenge) من خادم Apple، ويوقعه بمفتاح خاص من Secure Enclave ويرسله إلى خادمه الخاص. إذا كان الجهاز مخترقًا، يستجيب Secure Enclave بفشل التوثيق، مما يمنع الوصول إلى الوظائف المحمية.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا