iOS Custom URI Handlers / Deeplinks / Custom Schemes

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras formas de apoiar o HackTricks:

Esta é um resumo das informações relacionadas de https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0075/

Informações Básicas

Os esquemas de URL personalizados permitem que os aplicativos se comuniquem usando um protocolo personalizado, conforme detalhado na Documentação do Desenvolvedor da Apple. Esses esquemas devem ser declarados pelo aplicativo, que então lida com URLs de entrada seguindo esses esquemas. É crucial validar todos os parâmetros de URL e descartar URLs malformadas para evitar ataques por meio desse vetor.

Um exemplo é dado onde o URI myapp://hostname?data=123876123 invoca uma ação específica do aplicativo. Uma vulnerabilidade observada foi no aplicativo móvel do Skype, que permitia ações de chamada não permitidas via o protocolo skype://. Os esquemas registrados podem ser encontrados no Info.plist do aplicativo em CFBundleURLTypes. Aplicativos maliciosos podem explorar isso ao re-registrar URIs para interceptar informações sensíveis.

Registro de Esquemas de Consulta do Aplicativo

A partir do iOS 9.0, para verificar se um aplicativo está disponível, canOpenURL: requer a declaração de esquemas de URL no Info.plist em LSApplicationQueriesSchemes. Isso limita os esquemas que um aplicativo pode consultar para 50, aprimorando a privacidade ao evitar a enumeração de aplicativos.

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

Testando o Manuseio e Validação de URLs

Os desenvolvedores devem inspecionar métodos específicos no código-fonte para entender a construção e validação do caminho do URL, como application:didFinishLaunchingWithOptions: e application:openURL:options:. Por exemplo, o Telegram emprega vários métodos para abrir URLs:

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
}

Testando Solicitações de URL para Outros Apps

Métodos como openURL:options:completionHandler: são cruciais para abrir URLs e interagir com outros aplicativos. Identificar o uso desses métodos no código-fonte do aplicativo é fundamental para entender as comunicações externas.

Testando Métodos Obsoletos

O tratamento de métodos obsoletos para abertura de URLs, como application:handleOpenURL: e openURL:, deve ser identificado e revisado quanto às implicações de segurança.

Fuzzing em Esquemas de URL

O fuzzing em esquemas de URL pode identificar bugs de corrupção de memória. Ferramentas como Frida podem automatizar esse processo abrindo URLs com payloads variados para monitorar falhas, exemplificado pela manipulação de URLs no aplicativo 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

Referências

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

Last updated