Jailbreak Detection — soubor mechanismů, které zjišťují přítomnost jailbreaku na zařízení iOS a zabraňují spuštění aplikace v prostředí s odstraněnými omezeními. Jailbreak poskytuje přístup k souborovému systému mimo sandbox, umožňuje instalaci upravených knihoven a zachycování systémových volání. Podle Apple Security Documentation (2024) zařízení s jailbreakem neodpovídají modelu bezpečného spouštění Secure Boot. Jailbreak Detection kombinuje kontroly souborových indikátorů, runtime analýzu volání a kontrolu integrity podpisu sandboxu.
Hlavní body
Jailbreak Detection — proces identifikace zařízení iOS, na kterých byla odstraněna omezení operačního systému. Jailbreak modifikuje jádro iOS, vypíná podepisování kódu, poskytuje přístup k plnému souborovému systému a umožňuje načítání neautorizovaných knihoven. Pro aplikaci běžící na takovém zařízení neexistují žádné záruky integrity běhového prostředí: jakýkoli proces může číst paměť aplikace, zachytávat SSL/TLS provoz instalací vlastních certifikátů do úložiště systému a injektovat kód přes Cydia Substrate nebo Substitute.
Finanční aplikace na iOS jsou povinny zavést Jailbreak Detection podle požadavků standardu PCI DSS — pro certifikaci musí aplikace prokázat, že neběží na kompromitovaném zařízení. OWASP Mobile Security (2024) klasifikuje absenci Jailbreak Detection jako zranitelnost M8. Pro aplikace v App Store Apple nezakazuje blokování funkcionality na jailbreaknutých zařízeních, nicméně doporučuje kombinovat client-side a server-side kontroly, aby se nespoléhalo výhradně na klientský kód, který může být modifikován.
Architektura Jailbreak Detection v iOS je složitější než Root Detection v Androidu kvůli modelu sandboxu. V Androidu může aplikace číst /proc pro analýzu systému. iOS sandbox blokuje přímý přístup k většině systémových indikátorů. Vývojáři jsou nuceni používat techniky obcházení, jako je kontrola dostupnosti souborů v zakázaných zónách přes API canAccessFile nebo spouštění podřízených procesů přes fork() s kontrolou exit kódu. Moderní kontroly jsou postaveny na pokusu o provedení akcí dostupných pouze při jailbreaku a analýze výsledku.
Nejjednodušší a historicky první přístup — kontrola přítomnosti souborů a aplikací, které se instalují pouze na zařízeních s jailbreakem. Navzdory své jednoduchosti zůstávají souborové kontroly základní vrstvou ochrany, protože jejich obejití vyžaduje aktivní akce ze strany uživatele.
Na jailbreaknutém zařízení jsou přítomny aplikace Cydia, Sileo, Zebra nebo Installer. Jejich přítomnost je kontrolována přes NSFileManager: [[NSFileManager defaultManager] fileExistsAtPath:@"/Applications/Cydia.app"]. Podobně jsou kontrolovány balíčky od unc0ver, checkra1n, Taurine a Chimera. Tyto kontroly jsou obcházeny pomocí HideJB tweaků, které zachycují volání NSFileManager.
Jailbreak instaluje UNIXové nástroje nedostupné v stock iOS: apt, dpkg, ssh, rsync, sftp, dd, readlink a další. Kontroluje se existence /usr/bin/ssh, /bin/bash, /bin/sh a /usr/libexec/sftp-server. Při úspěšné detekci kteréhokoli z těchto souborů je pravděpodobnost jailbreaku vysoká. Pro iOS 13–17 je také relevantní kontrola přítomnosti /var/jb — kořenového adresáře bootstrapu pro unc0ver a Taurine.
MobileSubstrate (CydiaSubstrate.dylib) a Substitute — knihovny pro injektování kódu do procesů. Jejich přítomnost je kontrolována přes dlopen() s flagem RTLD_NOLOAD. Pokud je knihovna načtena do adresního prostoru — proces běží v prostředí s jailbreakem. Toto je spolehlivější kontrola, protože HideJB nemůže uvolnit již načtenou knihovnu z procesu.
- (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;
}
Dynamické kontroly provádějí akce, které jsou v iOS sandboxu zakázány, a analyzují výsledek. Pokud akce není zablokována — zařízení má s největší pravděpodobností jailbreak.
V stock iOS volání fork() vrací -1 s errno = EPERM. Na jailbreaknutém zařízení může fork() proběhnout, protože omezení sandboxu byla odstraněna. Tato kontrola je spolehlivá, ale může vést k falešně pozitivním výsledkům na některých verzích iOS. fork() lze také nahradit posix_spawn() pro kontrolu možnosti spuštění podřízeného procesu.
Pokus o čtení souborů v zakázaných zónách: /etc/master.passwd, /var/log/system.log, /private/var/cache. V stock iOS tato čtení vracejí chybu. Pokud aplikace úspěšně čte tyto soubory — sandbox je vypnutý. Doplňkově se kontroluje možnost zápisu do /private/ — v sandboxu jsou všechny systémové oddíly připojeny jako pouze pro čtení pro běžné aplikace.
Jailbreak modifikuje systémové knihovny, včetně dyld shared cache. Kontrola hash systémových frameworků nebo jednotlivých symbolů může odhalit modifikaci. Pro iOS 14+ se kontroluje přítomnost symbolu jit_region_create nebo jiných známek činnosti Fugu14/checkra1n v adresním prostoru jádra přes čtení sysctl kern.version.
- (BOOL)isJailbrokenByRuntime {
// Kontrola fork()
int pid = fork();
if (pid == 0) {
exit(0);
}
if (pid > 0) {
waitpid(pid, NULL, 0);
return YES;
}
// Kontrola přístupu k systémovým souborům
FILE *f = fopen("/etc/master.passwd", "r");
if (f) {
fclose(f);
return YES;
}
// Kontrola 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 kód je snadno disasemblovatelný a obejitelný přes Substrate. Nativní implementace v Objective-C s přímými voláními libobjc a systémových funkcí C činí kontroly výrazně odolnějšími vůči obcházení.
Volání stat() z libc nemůže být zachyceno na úrovni Objective-C. HideJB tweaky, které zachycují metody NSFileManager, neovlivňují stat(). Nativní kontrola se stat() detekuje souborové indikátory i na zařízeních s nainstalovanými HideJB moduly. Kombinace stat() pro soubory a dlopen() s RTLD_NOLOAD pro knihovny poskytuje dva nepřekrývající se kanály detekce.
Nativní funkce SecStaticCodeCheckValidity kontroluje podpis kódu aplikace na shodu s certifikátem Apple. Na jailbreaknutém zařízení může být tato kontrola nahrazena přes kernel-patch. Aby se předešlo nahrazení, měla by být kontrola provedena z nativního kódu s voláním přes dlopen() z Security.framework, nikoli přes Swift Bridge.
#import <sys/stat.h>
#import <dlfcn.h>
- (BOOL)nativeCheckForJailbreak {
// stat() obejití NSFileManager hooku
struct stat st;
if (stat("/Applications/Cydia.app", &st) == 0) {
return YES;
}
// dlopen pro kontrolu Substrate bez načtení
void *substrate = dlopen(
"/Library/MobileSubstrate/MobileSubstrate.dylib",
RTLD_NOLOAD
);
if (substrate) {
dlclose(substrate);
return YES;
}
return NO;
}
Porozumění technikám obcházení je nezbytné pro vybudování odolné ochrany. Moderní nástroje pro obcházení se aktivně vyvíjejí a statická sada kontrol se stává během několika měsíců neúčinnou.
HideJB — tweak, který zachycuje volání NSFileManager, stat(), dlopen() a fork() a nahrazuje vrácené hodnoty. HideJB pracuje na úrovni Cydia Substrate, takže zachycuje jak Objective-C, tak C funkce. Verze HideJB pro iOS 15–16 (Shadow) používá metodologii kernel-level hooků. Protiopatření: provedení kontroly v samostatném procesu s přenosem výsledku přes IPC, což přeruší řetězec hooků.
Choicy umožňuje vypnout Substrate pro konkrétní procesy. Uživatel jednoduše vypne injekci pro chráněnou aplikaci — všechny kontroly knihoven vracejí false. Liberty Lite — komplexní obcházení, které pokrývá většinu kontrol z populárních knihoven ochrany. Protiopatření: serverová verifikace přes DeviceCheck a App Attest — na serveru se kontroluje, zda zařízení má platný Apple certifikát, který nemůže být padělán na jailbreaknutém zařízení.
Exploity jádra, jako jsou Fugu14 a KFD, spouštějí kód v prostoru jádra (kernel-space), což umožňuje zachycovat systémová volání dříve, než je aplikace uvidí. Na této úrovni se kontroly stat() a fork() stávají neúčinnými. Jediné spolehlivé protiopatření — serverová atestace s ověřením, že zařízení prošlo procedurou Apple Attestation. Tento protokol je založen na kryptografických klíčích uvnitř Secure Enclave, které jsou nečitelné i při kernel-level exploitaci.
Pro vybudování efektivního Jailbreak Detection je nutné porozumět tomu, které bezpečnostní mechanismy iOS jsou při jailbreaku vypnuty.
iOS se spouští přes sekvenci kontrol podpisů: Boot ROM → iBoot → iOS Kernel. Pokud jailbreak používá bootrom exploit (checkra1n), celý Secure Boot Chain je kompromitován — kontroly na úrovni aplikace jsou zbytečné. Pokud je použit software-only exploit (unc0ver, Taurine, Fugu14), řetězec spouštění není narušen a Apple služby, jako je App Attest, zůstávají důvěryhodné.
Od iOS 10 Apple implementoval KPP — hardwarovou ochranu, která každých 200 ms znovu kontroluje integritu jádra. Všechny moderní jailbreaky (iOS 14–17) používají obcházení KTRR přes PAC nebo APRR, ale KPP zanechává stopy v podobě modifikovaných systémových tabulek sysctl. Kontrola kern.version na přítomnost řetězců pwned, prod nebo xnu s nestandardní verzí může odhalit přítomnost kernel patche.
iOS Sandbox pracuje na úrovni TrustedBSD s využitím entitlements. Jailbreak nahrazuje profil sandboxu na allow-all. Aplikace může zkontrolovat sandbox pokusem o čtení libovolného souboru mimo svůj adresář Documents. Pokud uspěje — sandbox byl modifikován. Integrita sandboxu — jeden z mála indikátorů, který nelze padělat bez kernel-level exploitace, protože kontrola oprávnění se provádí v jádře dříve, než může být zachycena.
Často kladené otázky
Root Detection pro Android kontroluje přítomnost su binárky a Magisk. Jailbreak Detection pro iOS hledá Cydia, Sileo, MobileSubstrate, kontroluje možnost fork() a čte systémové soubory. Architektura iOS Sandbox je přísnější než Android, proto se iOS kontroly více spoléhají na pokus o provedení zakázaných akcí než na čtení systémových indikátorů.
Ano, pro iOS 16–17 jsou aktuální jailbreaky Dopamine, palera1n a checkra1n. Jailbreak Detection funguje, ale vyžaduje aktualizaci kontrol pro nové nástroje. V iOS 17 Apple posílil sandbox a mnoho starých kontrol (například fork()) přestalo být spolehlivých kvůli změnám v XNU
Nejjednodušší způsob — HideJB nebo Shadow, které zachycují kontroly na úrovni knihoven. Pro složitější ochranu se používá Frida nebo Choicy s vypnutím injekce pro konkrétní aplikaci. Serverová atestace (App Attest) je obejita pouze přes kernel-level exploit s nahrazením hardwarového klíče Secure Enclave, což je prakticky nerealizovatelné.
Jakákoli aplikace na jailbreaknutém zařízení může být vystavena: zachycení SSL provozu přes modifikaci důvěryhodného úložiště, čtení Keychain přes přístup k souborovému systému, injekci kódu přes Substrate se zachycením metod práce s tokeny, dumpu paměti procesu pro získání šifrovacích klíčů.
App Attest — služba Apple pro kontrolu integrity aplikace a zařízení. Při spuštění aplikace obdrží od Apple serveru attestation challenge, podepíše jej soukromým klíčem ze Secure Enclave a pošle na svůj server. Pokud je zařízení jailbreaknuté, Secure Enclave odpoví attestation failure, což zablokuje přístup k chráněným funkcím.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také