iOS Custom URI Handlers / Deeplinks / Custom Schemes

Support HackTricks

Basic Information

Користувацькі URL-схеми дозволяють додаткам спілкуватися, використовуючи власний протокол, як детально описано в документації Apple Developer. Ці схеми повинні бути оголошені додатком, який потім обробляє вхідні URL відповідно до цих схем. Важливо перевіряти всі параметри URL та відкидати будь-які неправильно сформовані URL, щоб запобігти атакам через цей вектор.

Наводиться приклад, де URI myapp://hostname?data=123876123 викликає певну дію програми. Відзначена вразливість була в додатку Skype Mobile, який дозволяв неприпустимі дії дзвінків через протокол skype://. Зареєстровані схеми можна знайти в Info.plist додатка під CFBundleURLTypes. Зловмисні програми можуть використовувати це, повторно реєструючи URI для перехоплення чутливої інформації.

Application Query Schemes Registration

З iOS 9.0, щоб перевірити, чи доступний додаток, canOpenURL: вимагає оголошення URL-схем у Info.plist під LSApplicationQueriesSchemes. Це обмежує схеми, які може запитувати додаток, до 50, підвищуючи конфіденційність, запобігаючи перерахуванню додатків.

<key>LSApplicationQueriesSchemes</key>
<array>
<string>url_scheme1</string>
<string>url_scheme2</string>
</array>

Testing URL Handling and Validation

Розробники повинні перевірити конкретні методи в вихідному коді, щоб зрозуміти побудову та валідацію URL-адрес, такі як application:didFinishLaunchingWithOptions: та application:openURL:options:. Наприклад, Telegram використовує різні методи для відкриття URL-адрес:

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:, є критично важливими для відкриття URL для взаємодії з іншими додатками. Визначення використання таких методів у вихідному коді додатка є ключовим для розуміння зовнішніх комунікацій.

Тестування застарілих методів

Застарілі методи, що обробляють відкриття URL, такі як application:handleOpenURL: та openURL:, повинні бути виявлені та переглянуті на предмет безпекових наслідків.

Фаззинг URL схем

Фаззинг URL схем може виявити помилки корупції пам'яті. Інструменти, такі як Frida, можуть автоматизувати цей процес, відкриваючи URL з різними навантаженнями для моніторингу на предмет збоїв, що ілюструється маніпуляцією URL у додатку iGoat-Swift:

$ 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

Викрадення користувацьких URL-схем

Згідно з цим постом, шкідливі програми можуть реєструвати інші програми з користувацькими схемами, тоді шкідлива програма може відкрити браузер, який має всі куки Safari App за допомогою ASWebAuthenticationSession.

За допомогою браузера шкідлива програма може завантажити веб-сторінку, контрольовану зловмисником, і TCC запитає у мобільного користувача дозволи на відкриття цієї програми. Потім шкідлива веб-сторінка може перенаправити на сторінку жертви, наприклад, на OAuth потік з параметром prompt=none. Якщо користувач вже увійшов у OAuth потік, OAuth потік надішле секрет назад до жертви, використовуючи користувацьку схему жертви. Однак, оскільки шкідлива програма також зареєструвала її і оскільки використовуваний браузер знаходиться всередині шкідливої програми, користувацька схема в цьому випадку буде оброблятися шкідливою програмою, яка зможе вкрасти OAuth токен.

Посилання

Support HackTricks

Last updated