mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-21 02:23:30 +00:00
110 lines
7.6 KiB
Markdown
110 lines
7.6 KiB
Markdown
# iOS Universal Links
|
|
|
|
|
|
{% hint style="success" %}
|
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Support HackTricks</summary>
|
|
|
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
|
|
|
</details>
|
|
{% endhint %}
|
|
|
|
|
|
## Introdução
|
|
|
|
Os links universais oferecem uma **experiência de redirecionamento** sem interrupções para os usuários, abrindo diretamente o conteúdo no aplicativo, evitando a necessidade de redirecionamento pelo Safari. Esses links são **únicos** e seguros, pois não podem ser reivindicados por outros aplicativos. Isso é garantido ao hospedar um arquivo JSON `apple-app-site-association` no diretório raiz do site, estabelecendo um link verificável entre o site e o aplicativo. Nos casos em que o aplicativo não está instalado, o Safari assume e direciona o usuário para a página da web, mantendo a presença do aplicativo.
|
|
|
|
Para testadores de penetração, o arquivo `apple-app-site-association` é de particular interesse, pois pode revelar **caminhos sensíveis**, potencialmente incluindo aqueles relacionados a recursos não lançados.
|
|
|
|
### **Analisando a Concessão de Domínios Associados**
|
|
|
|
Os desenvolvedores ativam os Links Universais configurando os **Domínios Associados** na aba Capacidades do Xcode ou inspecionando o arquivo `.entitlements`. Cada domínio é prefixado com `applinks:`. Por exemplo, a configuração do Telegram pode aparecer da seguinte forma:
|
|
```xml
|
|
<key>com.apple.developer.associated-domains</key>
|
|
<array>
|
|
<string>applinks:telegram.me</string>
|
|
<string>applinks:t.me</string>
|
|
</array>
|
|
```
|
|
Para obter informações mais abrangentes, consulte a [Documentação do Desenvolvedor Apple arquivada](https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12-SW2).
|
|
|
|
Se estiver trabalhando com um aplicativo compilado, as permissões podem ser extraídas conforme descrito [neste guia](extracting-entitlements-from-compiled-application.md).
|
|
|
|
### **Recuperando o Arquivo de Associação do Site do Aplicativo Apple**
|
|
|
|
O arquivo `apple-app-site-association` deve ser recuperado do servidor usando os domínios especificados nas permissões. Certifique-se de que o arquivo esteja acessível via HTTPS diretamente em `https://<domain>/apple-app-site-association`. Ferramentas como o [Validador de Associação de Site de Aplicativo Apple (AASA)](https://branch.io/resources/aasa-validator/) podem ajudar nesse processo.
|
|
|
|
### **Manipulando Links Universais no Aplicativo**
|
|
|
|
O aplicativo deve implementar métodos específicos para manipular links universais corretamente. O método principal a ser procurado é [`application:continueUserActivity:restorationHandler:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623072-application). É crucial que o esquema das URLs manipuladas seja HTTP ou HTTPS, pois outros não serão suportados.
|
|
|
|
#### **Validando o Método de Manipulação de Dados**
|
|
|
|
Quando um link universal abre um aplicativo, um objeto `NSUserActivity` é passado para o aplicativo com a URL. Antes de processar essa URL, é essencial validá-la e sanitizá-la para evitar riscos de segurança. Aqui está um exemplo em Swift que demonstra o processo:
|
|
```swift
|
|
func application(_ application: UIApplication, continue userActivity: NSUserActivity,
|
|
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
|
|
// Check for web browsing activity and valid URL
|
|
if userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL {
|
|
application.open(url, options: [:], completionHandler: nil)
|
|
}
|
|
|
|
return true
|
|
}
|
|
```
|
|
URLs devem ser cuidadosamente analisados e validados, especialmente se incluírem parâmetros, para se proteger contra possíveis falsificações ou dados malformados. A API `NSURLComponents` é útil para esse propósito, como demonstrado abaixo:
|
|
```swift
|
|
func application(_ application: UIApplication,
|
|
continue userActivity: NSUserActivity,
|
|
restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
|
|
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
|
|
let incomingURL = userActivity.webpageURL,
|
|
let components = NSURLComponents(url: incomingURL, resolvingAgainstBaseURL: true),
|
|
let path = components.path,
|
|
let params = components.queryItems else {
|
|
return false
|
|
}
|
|
|
|
if let albumName = params.first(where: { $0.name == "albumname" })?.value,
|
|
let photoIndex = params.first(where: { $0.name == "index" })?.value {
|
|
// Process the URL with album name and photo index
|
|
|
|
return true
|
|
|
|
} else {
|
|
// Handle invalid or missing parameters
|
|
|
|
return false
|
|
}
|
|
}
|
|
```
|
|
Através de **configuração e validação diligentes**, os desenvolvedores podem garantir que os links universais melhorem a experiência do usuário enquanto mantêm padrões de segurança e privacidade.
|
|
|
|
## Ferramentas
|
|
* [GetUniversal.link](https://getuniversal.link/): Ajuda a simplificar o teste e a gestão dos Links Universais do seu aplicativo e do arquivo AASA. Basta inserir seu domínio para verificar a integridade do arquivo AASA ou usar o painel personalizado para testar facilmente o comportamento dos links. Esta ferramenta também ajuda a determinar quando a Apple indexará seu arquivo AASA na próxima vez.
|
|
|
|
## Referências
|
|
* [https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0070/#static-analysis](https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0070/#static-analysis)
|
|
* [https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8)
|
|
|
|
{% hint style="success" %}
|
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Support HackTricks</summary>
|
|
|
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
|
|
|
</details>
|
|
{% endhint %}
|