Jailbreak Detection — скуп механизама који утврђују присуство jailbreak-а на iOS уређају и спречавају покретање апликације у окружењу са уклоњеним ограничењима. Jailbreak омогућава приступ систему датотека ван пешчаника, дозвољавајући инсталацију модификованих библиотека и пресретање системских позива. Према Apple Security Documentation (2024), уређаји са jailbreak-ом не одговарају моделу безбедног покретања Secure Boot. Jailbreak Detection комбинује провере индикатора датотека, анализу позива у току извршавања и контролу интегритета потписа пешчаника.
Главно
Jailbreak Detection — процес идентификације iOS уређаја на којима су уклоњена ограничења оперативног система. Jailbreak модификује језгро iOS-а, искључује потписивање кода, пружа приступ комплетном систему датотека и омогућава учитавање неовлашћених библиотека. За апликацију која ради на таквом уређају не постоје гаранције интегритета окружења за извршавање: било који процес може читати меморију апликације, пресретати SSL/TLS саобраћај кроз инсталацију сопствених сертификата у складиште система и убризгавати код преко Cydia Substrate или Substitute.
Финансијске апликације на iOS-у су обавезне да имплементирају Jailbreak Detection према захтевима стандарда PCI DSS — за сертификацију апликација мора доказати да не ради на угроженом уређају. OWASP Mobile Security (2024) класификује недостатак Jailbreak Detection-а као рањивост M8. За апликације у App Store-у Apple не забрањује блокирање функционалности на jailbreak-ованим уређајима, међутим препоручује комбиновање client-side и server-side провера како се не би ослањало искључиво на клијентски код који може бити модификован.
Архитектура Jailbreak Detection-а у iOS-у је сложенија од Root Detection-а у Android-у због модела пешчаника. На Android-у апликација може читати /proc за анализу система. iOS пешчаник (sandbox) блокира директан приступ већини системских индикатора. Програмери су принуђени да користе технике заобилажења, као што су провера доступности датотека у забрањеним зонама кроз API canAccessFile или покретање подређених процеса кроз fork() са провером излазног кода. Савремене провере се заснивају на покушају извршења радњи доступних само при jailbreak-у и анализи резултата.
Најједноставнији и историјски први приступ — провера постојања датотека и апликација које се инсталирају само на уређајима са jailbreak-ом. Упркос једноставности, провере датотека остају основни слој заштите, јер њихово заобилажење захтева активне радње од стране корисника.
На jailbreak-ованом уређају присутне су апликације Cydia, Sileo, Zebra или Installer. Њихово постојање се проверава кроз NSFileManager: [[NSFileManager defaultManager] fileExistsAtPath:@"/Applications/Cydia.app"]. Слично се проверавају пакети од unc0ver, checkra1n, Taurine и Chimera. Ове провере се заобилазе кроз HideJB твикове који пресрећу позиве NSFileManager-а.
Jailbreak инсталира UNIX алате недоступне у stock iOS-у: apt, dpkg, ssh, rsync, sftp, dd, readlink и друге. Проверава се постојање /usr/bin/ssh, /bin/bash, /bin/sh и /usr/libexec/sftp-server. При успешном откривању било ког од ових датотека, вероватноћа jailbreak-а је висока. За iOS 13–17 актуелно је и проверавање присуства /var/jb — коренског директоријума bootstrap-а за unc0ver и Taurine.
MobileSubstrate (CydiaSubstrate.dylib) и Substitute — библиотеке за убризгавање кода у процесе. Њихово присуство се проверава кроз dlopen() са заставицом RTLD_NOLOAD. Ако је библиотека учитана у адресни простор — процес ради у окружењу са jailbreak-ом. Ово је поузданија провера, јер 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 пешчанику забрањене и анализирају резултат. Ако радња није блокирана — уређај највероватније има jailbreak.
У stock iOS-у позив fork() враћа -1 са errno = EPERM. На jailbreak-ованом уређају fork() се може извршити, јер су ограничења пешчаника уклоњена. Ова провера је поуздана, али може довести до лажних резултата на неким верзијама iOS-а. fork() се такође може заменити са posix_spawn() за проверу могућности покретања подређеног процеса.
Покушај читања датотека у забрањеним зонама: /etc/master.passwd, /var/log/system.log, /private/var/cache. У stock iOS-у ова читања враћају грешку. Ако апликација успешно чита ове датотеке — пешчаник је искључен. Додатно се проверава могућност уписа у /private/ — у пешчанику су све системске партиције монтиране као само за читање за обичне апликације.
Jailbreak модификује системске библиотеке, укључујући dyld shared cache. Провера хеша системских оквира или појединачних симбола може открити модификацију. За 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 сертификат. На jailbreak-ованом уређају ова провера може бити замењена кроз kernel-patch. За избегавање замене, проверу треба извршити из изворног кода са позивом кроз dlopen() из Security.framework-а, а не кроз Swift Bridge.
#import <sys/stat.h>
#import <dlfcn.h>
- (BOOL)nativeCheckForJailbreak {
// stat() заобилажење NSFileManager hook-а
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) користи методологију kernel-level hook-ова. Контра-мера: извршење провере у одвојеном процесу са преношењем резултата кроз IPC, чиме се прекида ланац hook-ова.
Choicy омогућава искључивање Substrate-а за одређене процесе. Корисник једноставно искључује убризгавање за заштићену апликацију — све провере библиотека враћају false. Liberty Lite — свеобухватно заобилажење које покрива већину провера из популарних библиотека заштите. Контра-мера: серверска верификација кроз DeviceCheck и App Attest — на серверу се проверава да уређај има важећи Apple сертификат који не може бити фалсификован на jailbreak-ованом уређају.
Експлоити језгра, као што су Fugu14 и KFD, извршавају код у простору језгра (kernel-space), што омогућава пресретање системских позива пре него што их апликација види. На овом нивоу провере stat() и fork() постају неефикасне. Једина поуздана контра-мера — серверска атестација са провером да је уређај прошао процедуру Apple Attestation. Овај протокол се заснива на криптографским кључевима унутар Secure Enclave-а, који су недоступни за читање чак и при kernel-level експлоиту.
За изградњу ефикасног Jailbreak Detection-а неопходно је разумети који се безбедносни механизми iOS-а искључују при jailbreak-у.
iOS се покреће кроз секвенцу провера потписа: Boot ROM → iBoot → iOS Kernel. Ако jailbreak користи bootrom експлоит (checkra1n), цео Secure Boot Chain је компромитован — провере на нивоу апликације су бескорисне. Ако се користи software-only експлоит (unc0ver, Taurine, Fugu14), ланац покретања није нарушен, и Apple услуге, као што је App Attest, остају поуздане.
Почевши од iOS 10, Apple је имплементирао KPP — хардверску заштиту која поново проверава интегритет језгра сваких 200 ms. Сви савремени jailbreak-ови (iOS 14–17) користе заобилажење KTRR-а кроз PAC или APRR, али KPP оставља трагове у виду измењених системских sysctl таблица. Провера kern.version-а на присуство стрингова pwned, prod или xnu са нестандардном верзијом може открити присуство kernel patch-а.
iOS пешчаник ради на нивоу TrustedBSD-а, користећи entitlements. Jailbreak замењује профил пешчаника на allow-all. Апликација може проверити пешчаник кроз покушај читања било које датотеке ван свог Documents директоријума. Ако успе — пешчаник је модификован. Sandbox Integrity — један од ретких индикатора који се не може фалсификовати без kernel-level експлоита, јер се провера дозвола извршава у језгру пре него што може бити пресретнута.
Често постављана питања
Root Detection за Android проверава присуство su-бинарног фајла и Magisk-а. Jailbreak Detection за iOS тражи Cydia, Sileo, MobileSubstrate, проверава могућност fork()-а и чита системске датотеке. Архитектура iOS пешчаника је строжа од Android-ове, стога се iOS провере више ослањају на покушај извршења забрањених радњи него на читање системских индикатора.
Да, за iOS 16–17 су актуелни jailbreak-ови Dopamine, palera1n и checkra1n. Jailbreak Detection ради, али захтева ажурирање провера за нове алате. У iOS 17 Apple је ојачао пешчаник, и многе старе провере (на пример, fork()) су престале да буду поуздане због промена у XNU-у
Најједноставнији начин — HideJB или Shadow, који пресрећу провере на нивоу библиотека. За сложенију заштиту користи се Frida или Choicy са искључивањем убризгавања за одређену апликацију. Серверска атестација (App Attest) се заобилази само кроз kernel-level експлоит са заменом хардверског кључа Secure Enclave-а, што је практично неизводљиво.
Свака апликација на jailbreak-ованом уређају може бити подвргнута: пресретању SSL саобраћаја кроз модификацију поузданог складишта, читању Keychain-а кроз приступ систему датотека, убризгавању кода кроз Substrate са пресретањем метода рада са токенима, снимању меморије процеса ради добијања кључева за шифровање.
App Attest — Apple услуга за проверу интегритета апликације и уређаја. При покретању, апликација добија од Apple сервера attestation challenge, потписује га приватним кључем из Secure Enclave-а и шаље на свој сервер. Ако је уређај jailbreak-ован, Secure Enclave одговара attestation failure-ом, што блокира приступ заштићеним функцијама.
Закључци
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође