Jailbreak Detection — iOS cihazında ceylbrekin mövcudluğunu müəyyən edən və tətbiqin məhdudiyyətləri götürülmüş mühitdə işə düşməsinin qarşısını alan mexanizmlər toplusudur. Ceylbreek qum qutusundan kənarda fayl sisteminə giriş imkanı verir, dəyişdirilmiş kitabxanaların quraşdırılmasına və sistem çağırışlarının ələ keçirilməsinə imkan yaradır. Apple Security Documentation (2024)-ya görə, ceylbrekli cihazlar Secure Boot təhlükəsiz yükləmə modelinə uyğun gəlmir. Jailbreak Detection fayl göstəricilərinin yoxlanması, çağırışların runtime təhlili və sandbox imzasının bütövlüyünün nəzarətini birləşdirir.
Əsas məqamlar
Jailbreak Detection — əməliyyat sistemi məhdudiyyətlərinin götürüldüyü iOS cihazlarının identifikasiyası prosesi. Ceylbreek iOS nüvəsini dəyişdirir, kod imzasını söndürür, tam fayl sisteminə giriş təmin edir və icazəsiz kitabxanaların yüklənməsinə imkan yaradır. Belə bir cihazda işləyən tətbiq üçün icra mühitinin bütövlüyünə zəmanət yoxdur: istənilən proses tətbiqin yaddaşını oxuya, sistemsertifikat anbarına öz sertifikatlarını quraşdırmaqla SSL/TLS trafikini ələ keçirə və Cydia Substrate və ya Substitute vasitəsilə kod inyeksiyası edə bilər.
iOS altında maliyyə tətbiqləri PCI DSS standartının tələblərinə uyğun olaraq Jailbreak Detection tətbiq etməlidir — sertifikasiya üçün tətbiq kompromizə edilmiş cihazda işləmədiyini sübut etməlidir. OWASP Mobile Security (2024) Jailbreak Detection-in olmamasını M8 zəifliyi kimi təsnif edir. App Store tətbiqləri üçün Apple ceylbrekli cihazlarda funksionallığın bloklanmasını qadağan etmir, lakin dəyişdirilə bilən müştəri koduna tam etibar etməmək üçün müştəri tərəfi və server yoxlamalarının birləşdirilməsini tövsiyə edir.
iOS-da Jailbreak Detection arxitekturası sandbox modelinə görə Android-dəki Root Detection-dən daha mürəkkəbdir. Android-də tətbiq sistemi təhlil etmək üçün /proc-u oxuya bilər. iOS qum qutusu (sandbox) əksər sistem göstəricilərinə birbaşa girişi bloklayır. Tərtibatçılar canAccessFile API vasitəsilə qadağan olunmuş zonalarda faylların əlçatanlığını yoxlamaq və ya fork() vasitəsilə uşaq proseslərini işə salmaqla çıxış kodunu yoxlamaq kimi yan keçmə texnikalarından istifadə etmək məcburiyyətindədirlər. Müasir yoxlamalar yalnız ceylbreek zamanı mümkün olan hərəkətləri yerinə yetirmək cəhdi və nəticənin təhlili üzərində qurulur.
Ən sadə və tarixən ilk yanaşma — yalnız ceylbrekli cihazlarda quraşdırılan fayl və tətbiqlərin mövcudluğunun yoxlanılmasıdır. Sadəliyinə baxmayaraq, fayl yoxlamaları əsas qorunma təbəqəsi olaraq qalır, çünki onların keçilməsi istifadəçidən aktiv hərəkətlər tələb edir.
Ceylbrekli cihazda Cydia, Sileo, Zebra və ya Installer tətbiqləri mövcuddur. Onların olması NSFileManager vasitəsilə yoxlanılır: [[NSFileManager defaultManager] fileExistsAtPath:@"/Applications/Cydia.app"]. Eyni şəkildə unc0ver, checkra1n, Taurine və Chimera paketləri yoxlanılır. Bu yoxlamalar NSFileManager çağırışlarını ələ keçirən HideJB tweak-ləri vasitəsilə keçilir.
Ceylbreek stock iOS-da mövcud olmayan UNIX alətlərini quraşdırır: apt, dpkg, ssh, rsync, sftp, dd, readlink və s. /usr/bin/ssh, /bin/bash, /bin/sh və /usr/libexec/sftp-server-in mövcudluğu yoxlanılır. Bu fayllardan hər hansı biri aşkar edildikdə, ceylbreek ehtimalı yüksəkdir. iOS 13–17 üçün həmçinin /var/jb — unc0ver və Taurine üçün bootstrap kök kataloqunun mövcudluğunu yoxlamaq aktualdır.
MobileSubstrate (CydiaSubstrate.dylib) və Substitute — proseslərə kod inyeksiyası üçün kitabxanalar. Onların mövcudluğu RTLD_NOLOAD bayrağı ilə dlopen() vasitəsilə yoxlanılır. Əgər kitabxana ünvan sahəsinə yüklənibsə — proses ceylbreek mühitində işləyir. Bu daha etibarlı yoxlamadır, çünki HideJB artıq prosesə yüklənmiş kitabxananı boşalda bilməz.
- (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;
}
Dinamik yoxlamalar iOS qum qutusunda qadağan olunan hərəkətləri yerinə yetirir və nəticəni təhlil edir. Əgər hərəkət bloklanmayıbsa — cihaz çox güman ki, ceylbreklidir.
Stock iOS-da fork() çağırışı errno = EPERM ilə -1 qaytarır. Ceylbrekli cihazda fork() icra oluna bilər, çünki qum qutusu məhdudiyyətləri götürülüb. Bu yoxlama etibarlıdır, lakin bəzi iOS versiyalarında yanlış müsbət nəticələr verə bilər. fork() həmçinin uşaq prosesinin işə salınma imkanını yoxlamaq üçün posix_spawn() ilə əvəz edilə bilər.
Qadağan olunmuş zonalarda faylların oxunması cəhdi: /etc/master.passwd, /var/log/system.log, /private/var/cache. Stock iOS-da bu oxumalar xəta qaytarır. Əgər tətbiq bu faylları uğurla oxuyursa — sandbox söndürülüb. Əlavə olaraq /private/-a yazma imkanı yoxlanılır — qum qutusunda bütün sistem bölmələri adi tətbiqlər üçün yalnız oxunabilir olaraq quraşdırılıb.
Ceylbreek sistem kitabxanalarını, o cümlədən dyld shared cache-i dəyişdirir. Sistem freymvorklarının və ya ayrı-ayrı simvolların hashinin yoxlanılması dəyişikliyi aşkar edə bilər. iOS 14+ üçün jit_region_create simvolunun və ya Fugu14/checkra1n işarələrinin sysctl kern.version oxunması vasitəsilə nüvə ünvan sahəsində mövcudluğu yoxlanılır.
- (BOOL)isJailbrokenByRuntime {
// fork() yoxlanması
int pid = fork();
if (pid == 0) {
exit(0);
}
if (pid > 0) {
waitpid(pid, NULL, 0);
return YES;
}
// Sistem fayllarına girişin yoxlanması
FILE *f = fopen("/etc/master.passwd", "r");
if (f) {
fclose(f);
return YES;
}
// sysctl kern.version yoxlanması
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 kodu asanlıqla deassemblənir və Substrate vasitəsilə keçilir. libobjc və C sistem funksiyalarının birbaşa çağırışları ilə Objective-C-də nativ tətbiq yoxlamaları keçilməyə qarşı əhəmiyyətli dərəcədə davamlı edir.
libc-dən stat() çağırışı Objective-C səviyyəsində ələ keçirilə bilməz. NSFileManager metodlarını ələ keçirən HideJB tweak-ləri stat()-a təsir etmir. stat() ilə nativ yoxlama quraşdırılmış HideJB modulları olan cihazlarda belə fayl göstəricilərini aşkar edir. Fayllar üçün stat() və kitabxanalar üçün RTLD_NOLOAD ilə dlopen() birləşməsi iki kəsişməyən aşkarlama kanalı verir.
SecStaticCodeCheckValidity nativ funksiyası tətbiqin kod imzasının Apple sertifikatına uyğunluğunu yoxlayır. Ceylbrekli cihazda bu yoxlama kernel-patch vasitəsilə əvəz edilə bilər. Əvəzlənmənin qarşısını almaq üçün yoxlama Swift Bridge deyil, Security.framework-dən dlopen() vasitəsilə çağırışla nativ koddan aparılmalıdır.
#import <sys/stat.h>
#import <dlfcn.h>
- (BOOL)nativeCheckForJailbreak {
// stat() NSFileManager hook-dan yan keçmə
struct stat st;
if (stat("/Applications/Cydia.app", &st) == 0) {
return YES;
}
// Yükləmədən Substrate yoxlamaq üçün dlopen
void *substrate = dlopen(
"/Library/MobileSubstrate/MobileSubstrate.dylib",
RTLD_NOLOAD
);
if (substrate) {
dlclose(substrate);
return YES;
}
return NO;
}
Keçilmə texnikalarını başa düşmək davamlı müdafiə qurmaq üçün vacibdir. Müasir keçilmə alətləri fəal şəkildə inkişaf edir və statik yoxlama dəsti bir neçə ay ərzində səmərəsiz olur.
HideJB — NSFileManager, stat(), dlopen() və fork() çağırışlarını ələ keçirən və qaytarılan dəyərləri əvəz edən tweakdir. HideJB Cydia Substrate səviyyəsində işləyir, buna görə də həm Objective-C, həm də C funksiyalarını ələ keçirir. iOS 15–16 üçün HideJB versiyası (Shadow) kernel-level hook metodologiyasından istifadə edir. Əks-tədbir: yoxlamanın nəticəni IPC vasitəsilə ötürən ayrıca prosesdə aparılması, bu da hook zəncirini qırır.
Choicy müəyyən proseslər üçün Substrate-ı söndürməyə imkan verir. İstifadəçi sadəcə qorunan tətbiq üçün inyeksiyanı söndürür — kitabxana yoxlamalarının hamısı false qaytarır. Liberty Lite — populyar müdafiə kitabxanalarının əksər yoxlamalarını əhatə edən kompleks keçilmə vasitəsidir. Əks-tədbir: DeviceCheck və App Attest vasitəsilə server təsdiqi — serverdə cihazın ceylbrekli cihazda saxtalaşdırıla bilməyən etibarlı Apple sertifikatına malik olması yoxlanılır.
Fugu14 və KFD kimi nüvə eksploytları nüvə məkanında (kernel-space) kod icra edir ki, bu da sistem çağırışlarını tətbiqin görməsindən əvvəl ələ keçirməyə imkan verir. Bu səviyyədə stat() və fork() yoxlamaları səmərəsiz olur. Yeganə etibarlı əks-tədbir — cihazın Apple Attestation prosedurundan keçdiyinin yoxlanılması ilə server attestasiyasıdır. Bu protokol Secure Enclave daxilində kriptoqrafik açarlara əsaslanır ki, onlar hətta kernel-level eksployt zamanı da oxunmaq üçün əlçatan deyil.
Səmərəli Jailbreak Detection qurmaq üçün ceylbreek zamanı iOS-un hansı təhlükəsizlik mexanizmlərinin söndürüldüyünü başa düşmək lazımdır.
iOS imza yoxlamaları ardıcıllığı ilə yüklənir: Boot ROM → iBoot → iOS Kernel. Əgər ceylbreek bootrom eksploytundan (checkra1n) istifadə edirsə, bütün Secure Boot Chain kompromizə edilmişdir — tətbiq səviyyəsində yoxlamalar faydasızdır. Əgər software-only eksployt (unc0ver, Taurine, Fugu14) istifadə olunursa, yükləmə zənciri pozulmayıb və App Attest kimi Apple xidmətləri etibarlı qalır.
iOS 10-dan başlayaraq Apple KPP-ni — hər 200 ms-dən bir nüvənin bütövlüyünü yenidən yoxlayan aparat qorunmasını tətbiq etdi. Bütün müasir ceylbreeklər (iOS 14–17) PAC və ya APRR vasitəsilə KTRR keçilməsindən istifadə edir, lakin KPP dəyişdirilmiş sysctl sistem cədvəlləri şəklində izlər buraxır. kern.version-da pwned, prod və ya qeyri-standart versiyalı xnu sətirlərinin olmasının yoxlanılması nüvə yamasının mövcudluğunu aşkar edə bilər.
iOS Sandboxı entitlements istifadə edərək TrustedBSD səviyyəsində işləyir. Ceylbreek sandbox profilini allow-all ilə əvəz edir. Tətbiq sandboxı öz Documents qovluğundan kənarda hər hansı faylı oxumaq cəhdi ilə yoxlaya bilər. Əgər uğurlu olarsa — sandbox dəyişdirilib. Sandbox bütövlüyü — icazə yoxlaması ələ keçirilməzdən əvvəl nüvədə aparıldığı üçün kernel-level eksployt olmadan saxtalaşdırıla bilməyən azsaylı göstəricilərdən biridir.
Tez-tez verilən suallar
Root Detection Android üçün su ikili faylının və Magisk-in mövcudluğunu yoxlayır. Jailbreak Detection iOS üçün Cydia, Sileo, MobileSubstrate axtarır, fork() imkanını yoxlayır və sistem fayllarını oxuyur. iOS Sandbox arxitekturası Android-dən daha sərtdir, buna görə iOS yoxlamaları sistem göstəricilərini oxumaqdansa, daha çox qadağan olunmuş hərəkətləri yerinə yetirməyə cəhd etməyə əsaslanır.
Bəli, iOS 16–17 üçün Dopamine, palera1n və checkra1n ceylbreekləri aktualdır. Jailbreak Detection işləyir, lakin yoxlamaların yeni alətlərə uyğun yenilənməsini tələb edir. iOS 17-də Apple sandboxı gücləndirdi və bir çox köhnə yoxlamalar (məsələn, fork()) XNU-dakı dəyişikliklər səbəbindən etibarlı olmaqdan çıxdı
Ən sadə üsul — kitabxana səviyyəsində yoxlamaları ələ keçirən HideJB və ya Shadow-dur. Daha mürəkkəb müdafiə üçün müəyyən tətbiq üçün inyeksiyanı söndürməklə Frida və ya Choicy istifadə olunur. Server attestasiyası (App Attest) yalnız Secure Enclave-in aparat açarını əvəz etməklə kernel-level eksployt vasitəsilə keçilir ki, bu da praktiki olaraq mümkün deyil.
Ceylbrekli cihazdakı istənilən tətbiq aşağıdakılara məruz qala bilər: etibarlı sertifikat anbarının dəyişdirilməsi ilə SSL trafikinin ələ keçirilməsi, fayl sisteminə giriş vasitəsilə Keychain-in oxunması, tokenlərlə iş metodlarının ələ keçirilməsi ilə Substrate vasitəsilə kod inyeksiyası, şifrələmə açarlarının əldə edilməsi üçün proses yaddaşının dumpı.
App Attest — Apple-ın tətbiq və cihaz bütövlüyünü yoxlamaq üçün xidmətidir. İşə düşərkən tətbiq Apple serverindən attestation challenge alır, onu Secure Enclave-dən şəxsi açar ilə imzalayır və öz serverinə göndərir. Əgər cihaz ceylbreklidirsə, Secure Enclave attestation failure ilə cavab verir ki, bu da qorunan funksiyalara girişi bloklayır.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun