iOS Custom URI Handlers / Deeplinks / Custom Schemes

Dowiedz się, jak hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

To jest podsumowanie związanych informacji z https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0075/

Podstawowe informacje

Niestandardowe schematy URL umożliwiają aplikacjom komunikację za pomocą niestandardowego protokołu, jak szczegółowo opisano w Dokumentacji dla programistów Apple. Te schematy muszą być zadeklarowane przez aplikację, która następnie obsługuje przychodzące adresy URL zgodnie z tymi schematami. Ważne jest, aby sprawdzać wszystkie parametry URL i odrzucić wszelkie nieprawidłowe adresy URL, aby zapobiec atakom przez ten wektor.

Przykładem jest URI myapp://hostname?data=123876123, który wywołuje określoną akcję aplikacji. Zauważono podatność w aplikacji Skype Mobile, która umożliwiała nieautoryzowane akcje połączeń za pomocą protokołu skype://. Zarejestrowane schematy można znaleźć w pliku Info.plist aplikacji w sekcji CFBundleURLTypes. Złośliwe aplikacje mogą wykorzystać to, ponownie rejestrując adresy URL w celu przechwycenia poufnych informacji.

Rejestracja schematów zapytań aplikacji

Od wersji iOS 9.0, aby sprawdzić, czy aplikacja jest dostępna, canOpenURL: wymaga zadeklarowania schematów URL w pliku Info.plist w sekcji LSApplicationQueriesSchemes. Ogranicza to schematy, które aplikacja może zapytać do 50, zwiększając prywatność poprzez zapobieganie wyliczaniu aplikacji.

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

Testowanie obsługi i walidacji adresów URL

Programiści powinni sprawdzić konkretne metody w kodzie źródłowym, aby zrozumieć konstrukcję i walidację ścieżki adresu URL, takie jak application:didFinishLaunchingWithOptions: i application:openURL:options:. Na przykład, Telegram korzysta z różnych metod otwierania adresów 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
}

Testowanie żądań URL do innych aplikacji

Metody takie jak openURL:options:completionHandler: są kluczowe do otwierania adresów URL w celu interakcji z innymi aplikacjami. Zidentyfikowanie użycia takich metod w kodzie źródłowym aplikacji jest kluczowe dla zrozumienia komunikacji zewnętrznej.

Testowanie przestarzałych metod

Metody obsługujące otwieranie adresów URL, takie jak application:handleOpenURL: i openURL:, które są przestarzałe, powinny być zidentyfikowane i przeanalizowane pod kątem implikacji dla bezpieczeństwa.

Fuzzowanie schematów URL

Fuzzowanie schematów URL może pomóc w identyfikacji błędów korupcji pamięci. Narzędzia takie jak Frida mogą zautomatyzować ten proces, otwierając adresy URL z różnymi ładunkami, aby monitorować ewentualne awarie, jak to zostało pokazane na przykładzie manipulacji adresami URL w aplikacji 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

Odwołania

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated