# iOS Custom URI Handlers / Deeplinks / Custom Schemes {{#include ../../banners/hacktricks-training.md}} ## Basic Information Οι προσαρμοσμένες διευθύνσεις URL επιτρέπουν στις εφαρμογές να επικοινωνούν χρησιμοποιώντας ένα προσαρμοσμένο πρωτόκολλο, όπως αναφέρεται στην [Apple Developer Documentation](https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple_ref/doc/uid/TP40007072-CH6-SW1). Αυτές οι διευθύνσεις πρέπει να δηλώνονται από την εφαρμογή, η οποία στη συνέχεια χειρίζεται τις εισερχόμενες διευθύνσεις URL σύμφωνα με αυτές τις διευθύνσεις. Είναι κρίσιμο να **επικυρώνετε όλους τους παραμέτρους URL** και να **απορρίπτετε οποιεσδήποτε κακώς σχηματισμένες διευθύνσεις URL** για να αποτρέψετε επιθέσεις μέσω αυτού του διαύλου. Δίνεται ένα παράδειγμα όπου η URI `myapp://hostname?data=123876123` καλεί μια συγκεκριμένη ενέργεια εφαρμογής. Μια αναφερόμενη ευπάθεια ήταν στην εφαρμογή Skype Mobile, η οποία επέτρεπε μη επιτρεπόμενες ενέργειες κλήσεων μέσω του πρωτοκόλλου `skype://`. Οι καταχωρημένες διευθύνσεις μπορούν να βρεθούν στο `Info.plist` της εφαρμογής κάτω από `CFBundleURLTypes`. Οι κακόβουλες εφαρμογές μπορούν να εκμεταλλευτούν αυτό επανακαταχωρώντας URIs για να παγιδεύσουν ευαίσθητες πληροφορίες. ### Application Query Schemes Registration Από το iOS 9.0, για να ελέγξετε αν μια εφαρμογή είναι διαθέσιμη, το `canOpenURL:` απαιτεί τη δήλωση διευθύνσεων URL στο `Info.plist` κάτω από `LSApplicationQueriesSchemes`. Αυτό περιορίζει τις διευθύνσεις που μπορεί να ερωτήσει μια εφαρμογή σε 50, ενισχύοντας την ιδιωτικότητα αποτρέποντας την καταμέτρηση εφαρμογών. ```xml LSApplicationQueriesSchemes url_scheme1 url_scheme2 ``` ### Δοκιμή Χειρισμού και Επικύρωσης URL Οι προγραμματιστές θα πρέπει να εξετάσουν συγκεκριμένες μεθόδους στον πηγαίο κώδικα για να κατανοήσουν την κατασκευή και την επικύρωση διαδρομών URL, όπως `application:didFinishLaunchingWithOptions:` και `application:openURL:options:`. Για παράδειγμα, το Telegram χρησιμοποιεί διάφορες μεθόδους για το άνοιγμα URL: ```swift func application(_ application: UIApplication, open url: URL, sourceApplication: String?) -> Bool { self.openUrl(url: url) return true } func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { self.openUrl(url: url) return true } func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { self.openUrl(url: url) return true } func application(_ application: UIApplication, handleOpen url: URL) -> Bool { self.openUrl(url: url) return true } ``` ### Δοκιμή Αιτημάτων URL σε Άλλες Εφαρμογές Μέθοδοι όπως το `openURL:options:completionHandler:` είναι κρίσιμες για το άνοιγμα URLs για αλληλεπίδραση με άλλες εφαρμογές. Η αναγνώριση της χρήσης τέτοιων μεθόδων στον πηγαίο κώδικα της εφαρμογής είναι κλειδί για την κατανόηση των εξωτερικών επικοινωνιών. ### Δοκιμή για Καταργημένες Μεθόδους Οι καταργημένες μέθοδοι που χειρίζονται το άνοιγμα URLs, όπως το `application:handleOpenURL:` και το `openURL:`, θα πρέπει να αναγνωρίζονται και να εξετάζονται για τις επιπτώσεις στην ασφάλεια. ### Fuzzing URL Schemes Το fuzzing URL schemes μπορεί να εντοπίσει σφάλματα διαφθοράς μνήμης. Εργαλεία όπως το [Frida](https://codeshare.frida.re/@dki/ios-url-scheme-fuzzing/) μπορούν να αυτοματοποιήσουν αυτή τη διαδικασία ανοίγοντας URLs με ποικιλία payloads για να παρακολουθούν για κρασαρίσματα, όπως φαίνεται από τη χειραγώγηση URLs στην εφαρμογή iGoat-Swift: ```bash $ frida -U SpringBoard -l ios-url-scheme-fuzzing.js [iPhone::SpringBoard]-> fuzz("iGoat", "iGoat://?contactNumber={0}&message={0}") Watching for crashes from iGoat... No logs were moved. Opened URL: iGoat://?contactNumber=0&message=0 ``` ## Hijacking προσαρμοσμένων URL scheme Σύμφωνα με [**αυτή την ανάρτηση**](https://evanconnelly.github.io/post/ios-oauth/), κακόβουλες εφαρμογές θα μπορούσαν **να καταχωρήσουν άλλες προσαρμοσμένες ρυθμίσεις εφαρμογών,** στη συνέχεια η κακόβουλη εφαρμογή μπορεί να ανοίξει έναν περιηγητή που έχει όλα τα cookies της εφαρμογής Safari με [ASWebAuthenticationSession](https://developer.apple.com/documentation/authenticationservices/aswebauthenticationsession/2990952-init#parameters). Με τον περιηγητή, η κακόβουλη εφαρμογή μπορεί να φορτώσει μια ιστοσελίδα που ελέγχεται από τον επιτιθέμενο και το TCC θα ζητήσει από τον κινητό χρήστη άδειες για να ανοίξει αυτή την εφαρμογή. Στη συνέχεια, η κακόβουλη ιστοσελίδα θα μπορούσε να ανακατευθύνει σε μια σελίδα θύματος, για παράδειγμα, μια ροή OAuth με την παράμετρο `prompt=none`. Αν ο χρήστης ήταν ήδη συνδεδεμένος στη ροή OAuth, η ροή OAuth θα στείλει το μυστικό πίσω στην εφαρμογή θύματος χρησιμοποιώντας το προσαρμοσμένο scheme της εφαρμογής θύματος.\ Ωστόσο, επειδή η κακόβουλη εφαρμογή το έχει επίσης καταχωρήσει και επειδή ο χρησιμοποιούμενος περιηγητής είναι μέσα στην κακόβουλη εφαρμογή, το προσαρμοσμένο scheme θα διαχειριστεί σε αυτή την περίπτωση από την κακόβουλη εφαρμογή, η οποία θα είναι σε θέση να κλέψει το OAuth token. ## Αναφορές - [https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0075/](https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0075/) - [https://evanconnelly.github.io/post/ios-oauth/](https://evanconnelly.github.io/post/ios-oauth/) {{#include ../../banners/hacktricks-training.md}}