Jailbreak Detection — ένα σύνολο μηχανισμών που ανιχνεύουν την παρουσία jailbreak σε μια συσκευή iOS και εμποδίζουν την εκκίνηση της εφαρμογής σε περιβάλλον χωρίς περιορισμούς. Το jailbreak παρέχει πρόσβαση στο σύστημα αρχείων εκτός του sandbox, επιτρέποντας την εγκατάσταση τροποποιημένων βιβλιοθηκών και την υποκλοπή κλήσεων συστήματος. Σύμφωνα με το Apple Security Documentation (2024), οι συσκευές με jailbreak δεν ανταποκρίνονται στο μοντέλο ασφαλούς εκκίνησης Secure Boot. Το Jailbreak Detection συνδυάζει ελέγχους δεικτών αρχείων, ανάλυση κλήσεων κατά τον χρόνο εκτέλεσης και έλεγχο ακεραιότητας υπογραφής sandbox.
Κύρια σημεία
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 συσκευές, ωστόσο συνιστά τον συνδυασμό ελέγχων από την πλευρά του πελάτη και του διακομιστή για να μην βασίζεται αποκλειστικά στον κώδικα πελάτη που μπορεί να τροποποιηθεί.
Η αρχιτεκτονική του Jailbreak Detection στο iOS είναι πιο περίπλοκη από το Root Detection στο Android λόγω του μοντέλου sandbox. Στο Android, η εφαρμογή μπορεί να διαβάσει /proc για ανάλυση συστήματος. Το sandbox του iOS μπλοκάρει την άμεση πρόσβαση στους περισσότερους δείκτες συστήματος. Οι προγραμματιστές αναγκάζονται να χρησιμοποιούν τεχνικές παράκαμψης, όπως ο έλεγχος διαθεσιμότητας αρχείων σε απαγορευμένες ζώνες μέσω API canAccessFile ή η εκκίνηση θυγατρικών διεργασιών μέσω fork() με έλεγχο κωδικού εξόδου. Οι σύγχρονοι έλεγχοι βασίζονται στην προσπάθεια εκτέλεσης ενεργειών που είναι διαθέσιμες μόνο σε jailbreak και στην ανάλυση του αποτελέσματος.
Η απλούστερη και ιστορικά πρώτη προσέγγιση — έλεγχος παρουσίας αρχείων και εφαρμογών που εγκαθίστανται μόνο σε συσκευές με jailbreak. Παρά την απλότητα, οι έλεγχοι αρχείων παραμένουν ένα βασικό επίπεδο προστασίας, καθώς η παράκαμψή τους απαιτεί ενεργές ενέργειες από τον χρήστη.
Σε μια jailbreak συσκευή υπάρχουν οι εφαρμογές Cydia, Sileo, Zebra ή Installer. Η παρουσία τους ελέγχεται μέσω NSFileManager: [[NSFileManager defaultManager] fileExistsAtPath:@"/Applications/Cydia.app"]. Παρόμοια ελέγχονται πακέτα από unc0ver, checkra1n, Taurine και Chimera. Αυτοί οι έλεγχοι παρακάμπτονται μέσω tweak 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;
}
Οι δυναμικοί έλεγχοι εκτελούν ενέργειες που απαγορεύονται στο sandbox του iOS και αναλύουν το αποτέλεσμα. Εάν η ενέργεια δεν μπλοκαριστεί — η συσκευή πιθανότατα έχει jailbreak.
Στο stock iOS, η κλήση fork() επιστρέφει -1 με errno = EPERM. Σε μια jailbreak συσκευή, το fork() μπορεί να εκτελεστεί, καθώς οι περιορισμοί sandbox έχουν αφαιρεθεί. Αυτός ο έλεγχος είναι αξιόπιστος αλλά μπορεί να οδηγήσει σε ψευδώς θετικά αποτελέσματα σε ορισμένες εκδόσεις iOS. Το fork() μπορεί επίσης να αντικατασταθεί με posix_spawn() για έλεγχο της δυνατότητας εκκίνησης θυγατρικής διεργασίας.
Προσπάθεια ανάγνωσης αρχείων σε απαγορευμένες ζώνες: /etc/master.passwd, /var/log/system.log, /private/var/cache. Στο stock iOS, αυτές οι αναγνώσεις επιστρέφουν σφάλμα. Εάν η εφαρμογή διαβάζει επιτυχώς αυτά τα αρχεία — το sandbox είναι απενεργοποιημένο. Επιπλέον, ελέγχεται η δυνατότητα εγγραφής στο /private/ — στο sandbox, όλες οι κατατμήσεις συστήματος είναι προσαρτημένες ως μόνο για ανάγνωση για συνηθισμένες εφαρμογές.
Το 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. Τα tweak HideJB που υποκλέπτουν μεθόδους NSFileManager δεν επηρεάζουν τη stat(). Ο εγγενής έλεγχος με stat() ανιχνεύει δείκτες αρχείων ακόμη και σε συσκευές με εγκατεστημένα modules 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() παράκαμψη hook 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 — ένα tweak που υποκλέπτει κλήσεις NSFileManager, stat(), dlopen() και fork() και αντικαθιστά τις επιστρεφόμενες τιμές. Το HideJB λειτουργεί σε επίπεδο Cydia Substrate, επομένως υποκλέπτει τόσο συναρτήσεις Objective-C όσο και C. Η έκδοση HideJB για iOS 15–16 (Shadow) χρησιμοποιεί μεθοδολογία hook σε επίπεδο πυρήνα. Αντίμετρο: εκτέλεση του ελέγχου σε ξεχωριστή διεργασία με μεταφορά του αποτελέσματος μέσω IPC, που σπάει την αλυσίδα hook.
Το Choicy επιτρέπει την απενεργοποίηση του Substrate για συγκεκριμένες διεργασίες. Ο χρήστης απλώς απενεργοποιεί την εισαγωγή για την προστατευμένη εφαρμογή — όλοι οι έλεγχοι βιβλιοθηκών επιστρέφουν false. Liberty Lite — ολοκληρωμένη παράκαμψη που καλύπτει τους περισσότερους ελέγχους από δημοφιλείς βιβλιοθήκες προστασίας. Αντίμετρο: επαλήθευση διακομιστή μέσω DeviceCheck και App Attest — στον διακομιστή ελέγχεται ότι η συσκευή έχει έγκυρο πιστοποιητικό Apple που δεν μπορεί να πλαστογραφηθεί σε jailbreak συσκευή.
Εκμεταλλεύσεις πυρήνα, όπως τα Fugu14 και KFD, εκτελούν κώδικα στο χώρο του πυρήνα (kernel-space), επιτρέποντας την υποκλοπή κλήσεων συστήματος πριν τις δει η εφαρμογή. Σε αυτό το επίπεδο, οι έλεγχοι stat() και fork() καθίστανται αναποτελεσματικοί. Το μόνο αξιόπιστο αντίμετρο — πιστοποίηση διακομιστή με έλεγχο ότι η συσκευή έχει περάσει τη διαδικασία Apple Attestation. Αυτό το πρωτόκολλο βασίζεται σε κρυπτογραφικά κλειδιά εντός του Secure Enclave, τα οποία δεν είναι αναγνώσιμα ακόμη και σε εκμετάλλευση επιπέδου πυρήνα.
Για την οικοδόμηση αποτελεσματικού 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 με μη τυπική έκδοση μπορεί να αποκαλύψει την παρουσία επιδιόρθωσης πυρήνα.
Το Sandbox του iOS λειτουργεί σε επίπεδο TrustedBSD χρησιμοποιώντας entitlements. Το jailbreak αντικαθιστά το προφίλ sandbox με allow-all. Η εφαρμογή μπορεί να ελέγξει το sandbox επιχειρώντας να διαβάσει οποιοδήποτε αρχείο εκτός του καταλόγου Documents της. Εάν επιτύχει — το sandbox έχει τροποποιηθεί. Ακεραιότητα Sandbox — ένας από τους λίγους δείκτες που δεν μπορεί να πλαστογραφηθεί χωρίς εκμετάλλευση επιπέδου πυρήνα, καθώς ο έλεγχος δικαιωμάτων εκτελείται στον πυρήνα πριν μπορέσει να υποκλαπεί.
Συχνές Ερωτήσεις
Το Root Detection για Android ελέγχει την παρουσία του su δυαδικού και του Magisk. Το Jailbreak Detection για iOS αναζητά Cydia, Sileo, MobileSubstrate, ελέγχει τη δυνατότητα fork() και διαβάζει αρχεία συστήματος. Η αρχιτεκτονική του sandbox iOS είναι αυστηρότερη από αυτήν του Android, επομένως οι έλεγχοι iOS βασίζονται περισσότερο στην προσπάθεια εκτέλεσης απαγορευμένων ενεργειών παρά στην ανάγνωση δεικτών συστήματος.
Ναι, για iOS 16–17 είναι ενεργά τα jailbreak Dopamine, palera1n και checkra1n. Το Jailbreak Detection λειτουργεί, αλλά απαιτεί ενημέρωση ελέγχων για νέα εργαλεία. Στο iOS 17, η Apple ενίσχυσε το sandbox και πολλοί παλιοί έλεγχοι (για παράδειγμα, fork()) έπαψαν να είναι αξιόπιστοι λόγω αλλαγών στο XNU
Ο απλούστερος τρόπος — HideJB ή Shadow, που υποκλέπτουν ελέγχους σε επίπεδο βιβλιοθήκης. Για πιο περίπλοκη προστασία, χρησιμοποιείται Frida ή Choicy με απενεργοποίηση εισαγωγής για τη συγκεκριμένη εφαρμογή. Η πιστοποίηση διακομιστή (App Attest) παρακάμπτεται μόνο μέσω εκμετάλλευσης επιπέδου πυρήνα με αντικατάσταση του υλικού κλειδιού του Secure Enclave, κάτι που είναι πρακτικά αδύνατο.
Οποιαδήποτε εφαρμογή σε jailbreak συσκευή μπορεί να υποστεί: υποκλοπή κίνησης SSL μέσω τροποποίησης του αξιόπιστου χώρου αποθήκευσης, ανάγνωση Keychain μέσω πρόσβασης στο σύστημα αρχείων, εισαγωγή κώδικα μέσω Substrate με υποκλοπή μεθόδων εργασίας με κουπόνια, απόρριψη μνήμης διεργασίας για λήψη κλειδιών κρυπτογράφησης.
App Attest — η υπηρεσία της Apple για έλεγχο ακεραιότητας εφαρμογής και συσκευής. Κατά την εκκίνηση, η εφαρμογή λαμβάνει από τον διακομιστή Apple ένα attestation challenge, το υπογράφει με το ιδιωτικό κλειδί από το Secure Enclave και το στέλνει στον δικό της διακομιστή. Εάν η συσκευή έχει jailbreak, το Secure Enclave απαντά με attestation failure, που μπλοκάρει την πρόσβαση σε προστατευμένες λειτουργίες.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης