iOS Universal Links

Reading time: 6 minutes

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks

介绍

Universal links 为用户提供了 无缝重定向 的体验,通过直接在应用中打开内容,绕过了 Safari 重定向的需要。这些链接是 唯一 和安全的,因为它们不能被其他应用声明。这是通过在网站的根目录中托管 apple-app-site-association JSON 文件来确保的,从而建立网站与应用之间的可验证链接。在应用未安装的情况下,Safari 将接管并将用户引导到网页,保持应用的存在。

对于渗透测试人员来说,apple-app-site-association 文件特别引人关注,因为它可能会揭示 敏感路径,可能包括与未发布功能相关的路径。

分析关联域名权限

开发人员通过在 Xcode 的 Capabilities 选项卡中配置 关联域名 或检查 .entitlements 文件来启用 Universal Links。每个域名前缀为 applinks:。例如,Telegram 的配置可能如下所示:

xml
<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:telegram.me</string>
<string>applinks:t.me</string>
</array>

对于更全面的见解,请参考归档的 Apple 开发者文档

如果使用编译的应用程序,可以按照本指南中概述的方法提取权限。

检索 Apple App Site Association 文件

apple-app-site-association 文件应从服务器上使用权限中指定的域名进行检索。确保该文件可以通过 HTTPS 直接访问,地址为 https://<domain>/apple-app-site-association。像Apple App Site Association (AASA) 验证器这样的工具可以帮助完成此过程。

应用必须实现特定的方法以正确处理 universal links。需要关注的主要方法是application:continueUserActivity:restorationHandler:。处理的 URL 的方案必须是 HTTP 或 HTTPS,其他方案将不被支持。

验证数据处理方法

当一个 universal link 打开应用时,一个 NSUserActivity 对象会与 URL 一起传递给应用。在处理此 URL 之前,验证和清理它以防止安全风险是至关重要的。以下是一个用 Swift 演示该过程的示例:

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 应该被仔细解析和验证,特别是当它们包含参数时,以防止潜在的欺骗或格式错误的数据。NSURLComponents API 对此非常有用,如下所示:

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
}
}

通过 勤奋的配置和验证,开发人员可以确保通用链接在增强用户体验的同时,维护安全和隐私标准。

工具

  • GetUniversal.link: 帮助简化应用程序的通用链接和 AASA 文件的测试和管理。只需输入您的域名以验证 AASA 文件的完整性,或使用自定义仪表板轻松测试链接行为。该工具还帮助您确定 Apple 下次何时索引您的 AASA 文件。

参考

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks