Jailbreak Detection ist eine Reihe von Mechanismen, die das Vorhandensein eines Jailbreaks auf einem iOS-Gerät erkennen und den Start der Anwendung in einer Umgebung mit entfernten Einschränkungen verhindern. Jailbreak gewährt Zugriff auf das Dateisystem außerhalb der Sandbox, ermöglicht die Installation modifizierter Bibliotheken und das Abfangen von Systemaufrufen. Laut Apple Security Documentation (2024) entsprechen jailbreak-Geräte nicht dem Sicherheitsmodell Secure Boot. Jailbreak Detection kombiniert Prüfungen von Dateiindikatoren, Laufzeitanalyse von Aufrufen und Überprüfung der Sandbox-Signaturintegrität.
Wichtige Punkte
Jailbreak Detection ist der Prozess zur Identifizierung von iOS-Geräten, bei denen die Betriebssystemeinschränkungen entfernt wurden. Jailbreak modifiziert den iOS-Kernel, deaktiviert die Codesignierung, gewährt Zugriff auf das vollständige Dateisystem und ermöglicht das Laden nicht autorisierter Bibliotheken. Für eine auf einem solchen Gerät ausgeführte Anwendung gibt es keine Garantien für die Integrität der Laufzeitumgebung: Jeder Prozess kann den Speicher der Anwendung lesen, SSL/TLS-Verkehr durch Installation eigener Zertifikate im Systemvertrauensspeicher abfangen und Code über Cydia Substrate oder Substitute injizieren.
Finanzanwendungen auf iOS müssen Jailbreak Detection gemäß den PCI DSS-Standards implementieren — für die Zertifizierung muss die Anwendung nachweisen, dass sie nicht auf einem kompromittierten Gerät ausgeführt wird. OWASP Mobile Security (2024) klassifiziert das Fehlen von Jailbreak Detection als Schwachstelle M8. Für App Store-Anwendungen verbietet Apple die Blockierung von Funktionen auf jailbreak-Geräten nicht, empfiehlt jedoch die Kombination von clientseitigen und serverseitigen Prüfungen, um nicht ausschließlich auf Clientcode angewiesen zu sein, der modifiziert werden könnte.
Die Architektur von Jailbreak Detection auf iOS ist aufgrund des Sandbox-Modells komplexer als Root Detection auf Android. Auf Android kann eine Anwendung /proc lesen, um das System zu analysieren. Die iOS-Sandbox blockiert den direkten Zugriff auf die meisten Systemindikatoren. Entwickler sind gezwungen, alternative Techniken zu verwenden, wie die Überprüfung der Dateiverfügbarkeit in eingeschränkten Zonen über die canAccessFile-API oder das Starten von Kindprozessen über fork() mit Exit-Code-Überprüfung. Moderne Prüfungen basieren darauf, Aktionen zu versuchen, die nur unter Jailbreak verfügbar sind, und das Ergebnis zu analysieren.
Der einfachste und historisch erste Ansatz ist die Überprüfung auf Dateien und Anwendungen, die nur auf jailbreak-Geräten installiert werden. Trotz ihrer Einfachheit bleiben Dateiprüfungen eine grundlegende Verteidigungsschicht, da ihre Umgehung aktive Maßnahmen des Benutzers erfordert.
Auf einem jailbreak-Gerät sind Anwendungen wie Cydia, Sileo, Zebra oder Installer vorhanden. Ihre Existenz wird über NSFileManager überprüft: [[NSFileManager defaultManager] fileExistsAtPath:@"/Applications/Cydia.app"]. Pakete von unc0ver, checkra1n, Taurine und Chimera werden ähnlich überprüft. Diese Prüfungen können über HideJB-Tweaks umgangen werden, die NSFileManager-Aufrufe abfangen.
Jailbreak installiert UNIX-Dienstprogramme, die in stock iOS nicht verfügbar sind: apt, dpkg, ssh, rsync, sftp, dd, readlink und andere. Die Existenz von /usr/bin/ssh, /bin/bash, /bin/sh und /usr/libexec/sftp-server wird überprüft. Wenn eine dieser Dateien erfolgreich erkannt wird, ist die Wahrscheinlichkeit eines Jailbreaks hoch. Für iOS 13–17 ist es auch relevant, das Vorhandensein von /var/jb zu überprüfen — dem Bootstrap-Stammverzeichnis für unc0ver und Taurine.
MobileSubstrate (CydiaSubstrate.dylib) und Substitute sind Bibliotheken zur Code-Injektion in Prozesse. Ihre Existenz wird über dlopen() mit dem Flag RTLD_NOLOAD überprüft. Wenn die Bibliothek in den Adressraum geladen ist — läuft der Prozess in einer Jailbreak-Umgebung. Dies ist eine zuverlässigere Prüfung, da HideJB eine bereits in einen Prozess geladene Bibliothek nicht entladen kann.
- (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;
}
Dynamische Prüfungen führen Aktionen aus, die in der iOS-Sandbox verboten sind, und analysieren das Ergebnis. Wenn die Aktion nicht blockiert wird — ist das Gerät höchstwahrscheinlich jailbroken.
In stock iOS gibt fork() -1 mit errno = EPERM zurück. Auf einem jailbreak-Gerät kann fork() erfolgreich sein, da die Sandbox-Beschränkungen entfernt wurden. Diese Prüfung ist zuverlässig, kann aber auf einigen iOS-Versionen zu Fehlalarmen führen. fork() kann auch durch posix_spawn() ersetzt werden, um die Möglichkeit zum Starten eines Kindprozesses zu überprüfen.
Versuch, Dateien in eingeschränkten Zonen zu lesen: /etc/master.passwd, /var/log/system.log, /private/var/cache. In stock iOS geben diese Lesevorgänge einen Fehler zurück. Wenn die Anwendung diese Dateien erfolgreich liest — ist die Sandbox deaktiviert. Zusätzlich wird die Fähigkeit zum Schreiben in /private/ überprüft — in einer Sandbox sind alle Systempartitionen für normale Anwendungen schreibgeschützt eingehängt.
Jailbreak modifiziert Systembibliotheken, einschließlich des dyld Shared Cache. Die Überprüfung des Hashs von System-Frameworks oder einzelner Symbole kann eine Modifikation aufdecken. Für iOS 14+ wird das Vorhandensein des Symbols jit_region_create oder anderer Anzeichen von Fugu14/checkra1n im Kernel-Adressraum durch Lesen von sysctl kern.version überprüft.
- (BOOL)isJailbrokenByRuntime {
// Prüfung von fork()
int pid = fork();
if (pid == 0) {
exit(0);
}
if (pid > 0) {
waitpid(pid, NULL, 0);
return YES;
}
// Prüfung des Zugriffs auf Systemdateien
FILE *f = fopen("/etc/master.passwd", "r");
if (f) {
fclose(f);
return YES;
}
// Prüfung von 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-Code wird leicht disassembliert und über Substrate umgangen. Eine native Objective-C-Implementierung mit direkten Aufrufen von libobjc und C-Systemfunktionen macht Prüfungen deutlich widerstandsfähiger gegen Umgehung.
Der stat()-Aufruf aus libc kann auf Objective-C-Ebene nicht abgefangen werden. HideJB-Tweaks, die NSFileManager-Methoden abfangen, beeinflussen stat() nicht. Eine native Prüfung mit stat() erkennt Dateiindikatoren selbst auf Geräten mit installierten HideJB-Modulen. Die Kombination von stat() für Dateien und dlopen() mit RTLD_NOLOAD für Bibliotheken bietet zwei nicht überlappende Erkennungskanäle.
Die native Funktion SecStaticCodeCheckValidity überprüft die Code-Signatur der Anwendung gegen das Apple-Zertifikat. Auf einem jailbreak-Gerät kann diese Prüfung über einen Kernel-Patch gefälscht werden. Um die Fälschung zu umgehen, sollte die Prüfung aus nativem Code mit einem Aufruf über dlopen() aus Security.framework erfolgen, nicht über Swift Bridge.
#import <sys/stat.h>
#import <dlfcn.h>
- (BOOL)nativeCheckForJailbreak {
// stat() umgeht den NSFileManager-Hook
struct stat st;
if (stat("/Applications/Cydia.app", &st) == 0) {
return YES;
}
// dlopen zur Überprüfung von Substrate ohne Laden
void *substrate = dlopen(
"/Library/MobileSubstrate/MobileSubstrate.dylib",
RTLD_NOLOAD
);
if (substrate) {
dlclose(substrate);
return YES;
}
return NO;
}
Das Verständnis von Umgehungstechniken ist für den Aufbau eines robusten Schutzes unerlässlich. Moderne Umgehungswerkzeuge entwickeln sich aktiv weiter, und ein statischer Satz von Prüfungen wird innerhalb weniger Monate unwirksam.
HideJB ist ein Tweak, das Aufrufe an NSFileManager, stat(), dlopen() und fork() abfängt und Rückgabewerte ersetzt. HideJB arbeitet auf Cydia-Substrate-Ebene und fängt sowohl Objective-C- als auch C-Funktionen ab. Die Version von HideJB für iOS 15–16 (Shadow) verwendet Kernel-Level-Hook-Methodik. Gegenmaßnahme: Führen Sie die Prüfung in einem separaten Prozess mit Ergebnisübermittlung über IPC durch, was die Hook-Kette unterbricht.
Choicy ermöglicht das Deaktivieren von Substrate für bestimmte Prozesse. Der Benutzer deaktiviert einfach die Injektion für die geschützte Anwendung — alle Bibliotheksprüfungen geben false zurück. Liberty Lite ist eine umfassende Umgehung, die die meisten Prüfungen gängiger Schutzbibliotheken abdeckt. Gegenmaßnahme: Serverseitige Überprüfung über DeviceCheck und App Attest — der Server überprüft, ob das Gerät ein gültiges Apple-Zertifikat besitzt, das auf einem jailbreak-Gerät nicht gefälscht werden kann.
Kernel-Exploits wie Fugu14 und KFD führen Code im Kernel-Space aus und ermöglichen das Abfangen von Systemaufrufen, bevor die Anwendung sie sieht. Auf dieser Ebene werden stat()- und fork()-Prüfungen unwirksam. Die einzig zuverlässige Gegenmaßnahme ist die serverseitige Attestierung mit Überprüfung, dass das Gerät die Apple-Attestierungsprozedur bestanden hat. Dieses Protokoll basiert auf kryptografischen Schlüsseln innerhalb der Secure Enclave, die selbst mit einem Kernel-Level-Exploit nicht gelesen werden können.
Für eine effektive Jailbreak Detection ist es notwendig zu verstehen, welche iOS-Sicherheitsmechanismen während eines Jailbreaks deaktiviert werden.
iOS startet über eine Sequenz von Signaturprüfungen: Boot ROM → iBoot → iOS Kernel. Wenn der Jailbreak einen Bootrom-Exploit (checkra1n) verwendet, ist die gesamte Secure Boot Chain kompromittiert — Prüfungen auf Anwendungsebene sind nutzlos. Wenn ein reiner Software-Exploit (unc0ver, Taurine, Fugu14) verwendet wird, ist die Boot-Kette nicht gebrochen, und Apple-Dienste wie App Attest bleiben vertrauenswürdig.
Ab iOS 10 führte Apple KPP ein — Hardwareschutz, der die Kernel-Integrität alle 200 ms erneut überprüft. Alle modernen Jailbreaks (iOS 14–17) verwenden KTRR-Bypass über PAC oder APRR, aber KPP hinterlässt Spuren in Form von modifizierten sysctl-Systemtabellen. Die Überprüfung von kern.version auf das Vorhandensein von Strings wie pwned, prod oder xnu mit einer nicht standardmäßigen Version kann einen Kernel-Patch aufdecken.
Die iOS-Sandbox arbeitet auf TrustedBSD-Ebene unter Verwendung von Berechtigungen. Jailbreak ersetzt das Sandbox-Profil durch allow-all. Eine Anwendung kann die Sandbox überprüfen, indem sie versucht, eine Datei außerhalb ihres Documents-Verzeichnisses zu lesen. Bei Erfolg — wurde die Sandbox modifiziert. Die Sandbox-Integrität ist einer der wenigen Indikatoren, die ohne einen Kernel-Level-Exploit nicht gefälscht werden können, da die Berechtigungsprüfung im Kernel durchgeführt wird, bevor sie abgefangen werden kann.
Häufig gestellte Fragen
Root Detection für Android überprüft das Vorhandensein des su-Binärprogramms und von Magisk. Jailbreak Detection für iOS sucht nach Cydia, Sileo, MobileSubstrate, überprüft die Fähigkeit, fork() auszuführen, und liest Systemdateien. Die iOS-Sandbox-Architektur ist strenger als Android, daher verlassen sich iOS-Prüfungen mehr auf den Versuch, verbotene Aktionen auszuführen, als auf das Lesen von Systemindikatoren.
Ja, die Jailbreaks Dopamine, palera1n und checkra1n sind für iOS 16–17 relevant. Jailbreak Detection funktioniert, erfordert aber eine Aktualisierung der Prüfungen für neue Werkzeuge. In iOS 17 hat Apple die Sandbox verstärkt, und viele alte Prüfungen (z.B. fork()) sind aufgrund von Änderungen in XNU unzuverlässig geworden.
Der einfachste Weg ist HideJB oder Shadow, die Prüfungen auf Bibliotheksebene abfangen. Für komplexeren Schutz wird Frida oder Choicy verwendet, um die Injektion für eine bestimmte Anwendung zu deaktivieren. Die serverseitige Attestierung (App Attest) kann nur über einen Kernel-Level-Exploit umgangen werden, der den Secure-Enclave-Hardwareschlüssel ersetzt, was praktisch undurchführbar ist.
Jede Anwendung auf einem jailbreak-Gerät kann folgenden Gefahren ausgesetzt sein: SSL-Verkehrsabfang durch Modifikation des Vertrauensspeichers, Keychain-Lesen über Dateisystemzugriff, Code-Injektion über Substrate mit Abfangen von Token-Behandlungsmethoden und Speicher-Dumping zum Erhalten von Verschlüsselungsschlüsseln.
App Attest ist ein Apple-Dienst zur Überprüfung der Integrität von Anwendung und Gerät. Beim Start erhält die Anwendung eine Attestierungs-Challenge vom Apple-Server, signiert sie mit einem privaten Schlüssel aus der Secure Enclave und sendet sie an ihren eigenen Server. Wenn das Gerät jailbroken ist, gibt die Secure Enclave einen Attestierungsfehler zurück, der den Zugriff auf geschützte Funktionen blockiert.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch