iOS Universal Links
Reading time: 10 minutes
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
介绍
Universal links 为用户提供了 无缝重定向 的体验,通过直接在应用中打开内容,绕过了 Safari 重定向的需要。这些链接是 唯一 和安全的,因为它们不能被其他应用声明。这是通过在网站的根目录中托管 apple-app-site-association
JSON 文件来确保的,从而建立网站与应用之间的可验证链接。在应用未安装的情况下,Safari 将接管并将用户引导到网页,保持应用的存在。
对于渗透测试人员来说,apple-app-site-association
文件特别引人关注,因为它可能会揭示 敏感路径,可能包括与未发布功能相关的路径。
分析关联域名权限
开发人员通过在 Xcode 的 Capabilities 选项卡中配置 关联域名 或检查 .entitlements
文件来启用 Universal Links。每个域名前缀为 applinks:
。例如,Telegram 的配置可能如下所示:
<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
(或 /.well-known/apple-app-site-association
)。像Apple App Site Association (AASA) 验证器这样的工具可以帮助完成此过程。
从 macOS/Linux shell 快速枚举
# 假设您已将权限提取到 ent.xml doms=$(plutil -extract com.apple.developer.associated-domains xml1 -o - ent.xml | \ grep -oE 'applinks:[^<]+' | cut -d':' -f2) for d in $doms; do echo "[+] Fetching AASA for $d"; curl -sk "https://$d/.well-known/apple-app-site-association" | jq '.' done
在应用中处理 Universal Links
应用必须实现特定方法以正确处理 universal links。需要关注的主要方法是application:continueUserActivity:restorationHandler:
。处理的 URL 的方案必须是 HTTP 或 HTTPS,其他方案将不被支持。
验证数据处理方法
当一个 universal link 打开应用时,一个 NSUserActivity
对象会与 URL 一起传递给应用。在处理此 URL 之前,验证和清理它以防止安全风险是至关重要的。以下是一个在 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 对此非常有用,如下所示:
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
}
}
通过 勤奋的配置和验证,开发者可以确保通用链接在增强用户体验的同时,维护安全和隐私标准。
常见漏洞与渗透测试检查
# | 弱点 | 测试方法 | 利用/影响 |
---|---|---|---|
1 | AASA 文件中的 paths / components 过于宽泛(例如 "/": "*" 或通配符如 "/a/*" )。 | • 检查下载的 AASA,寻找 * 、尾部斜杠或 {"?": …} 规则。• 尝试请求仍然匹配规则的未知资源( https://domain.com/a/evil?_p_dp=1 )。 | 通用链接劫持:注册相同域名的恶意 iOS 应用可以声称所有这些链接并呈现钓鱼 UI。一个现实世界的例子是 2025 年 5 月的 Temu.com 漏洞赏金报告,其中攻击者可以将任何 /a/* 路径重定向到他们自己的应用。 |
2 | 缺少深层链接路径的服务器端验证。 | 在识别允许的路径后,向不存在的资源发出 curl /Burp 请求并观察 HTTP 状态码。任何不是 404 的状态码(例如 200/302)都是可疑的。 | 攻击者可以在允许的路径后托管任意内容,并通过合法域名提供,从而提高钓鱼或会话令牌盗窃的成功率。 |
3 | 应用端 URL 处理未进行方案/主机白名单(CVE-2024-10474 – Mozilla Focus < 132)。 | 查找直接的 openURL: /open(_:options:) 调用或转发任意 URL 的 JavaScript 桥接。 | 内部页面可以走私 myapp:// 或 https:// URL,绕过浏览器的 URL 栏安全检查,导致欺骗或意外的特权操作。 |
4 | 在权限中使用通配符子域(*.example.com )。 | 在权限中 grep 查找 *. 。 | 如果任何子域被接管(例如通过未使用的 S3 存储桶),攻击者将自动获得通用链接绑定。 |
快速检查清单
-
提取权限并列举每个
applinks:
条目。 - 下载每个条目的 AASA 并审核通配符。
- 验证 Web 服务器对未定义路径返回 404。
- 在二进制文件中确认 仅 处理受信任的主机/方案。
-
如果应用使用较新的
components
语法(iOS 11+),模糊查询参数规则({"?":{…}}
)。
工具
- GetUniversal.link: 帮助简化应用的通用链接和 AASA 文件的测试和管理。只需输入您的域名以验证 AASA 文件的完整性,或使用自定义仪表板轻松测试链接行为。该工具还帮助您确定 Apple 下次何时索引您的 AASA 文件。
- Knil: 开源 iOS 工具,获取、解析并让您直接在设备上 tap-test 每个由域声明的通用链接。
- universal-link-validator: CLI / Web 验证器,执行严格的 AASA 合规性检查并突出危险的通配符。
参考文献
- 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://medium.com/@m.habibgpi/universal-link-hijacking-via-misconfigured-aasa-file-on-temu-com-eadfcb745e4e
- https://nvd.nist.gov/vuln/detail/CVE-2024-10474
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。