☰
OWASP MASTG 实战指南:Android 深链(Deep Links)清单枚举与清单分析技术
2026/10/9 4:52:44 网站建设 项目流程
  • 文档
  • 教程
  • 网络安全

【免费下载链接】mastg

The OWASP Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app security testing and reverse engineering. It describes technical processes for verifying the OWASP Mobile Security Weakness Enumeration (MASWE) weaknesses, which are in alignment with the OWASP MASVS.

项目地址:https://gitcode.com/gh_mirrors/ow/mastg
点击查看免费下载

深链(Deep Links)是 Android 应用中常见的外部入口,也是安全测试中必须优先盘点的一类攻击面。本文以 OWASP Mobile Application Security Testing Guide(MASTG)中的MASTG-TECH-0172技术条目为核心,系统讲解如何通过解析AndroidManifest.xml、使用dumpsys以及自动化脚本完成深链的完整枚举,并区分自定义 URL Scheme、Deep Link 与 App Link 三类入口的判定标准。读者完成本文学习后,将能够在任何 Android 应用中快速、准确、无遗漏地列出全部深链,为后续的 App Link 验证与处理器逻辑审计(对应 MASTG-TEST-0028)奠定基础。

一、前置准备:先取得可读的 AndroidManifest.xml

深链的声明全部位于应用的AndroidManifest.xml中,因此枚举深链的第一步是先提取并解码 Manifest。需要特别注意的是,APK 内的 Manifest 以二进制 XML 格式存储,直接解压得到的文件无法阅读,必须借助工具将其转换为人类可读格式。MASTG 中对应的前置技术条目为 MASTG-TECH-0117(获取 Manifest)与 MASTG-TECH-0150(分析 Manifest)。

1.1 使用 jadx 提取(含 uses-sdk 信息)

jadx 可只解码资源、不反编译全部源码:

jadx --no-src -d out_dir MASTG-DEMO-0001.apk

Manifest 会完整输出到out_dir/resources/AndroidManifest.xml。与其他工具不同,jadx 输出中包含<uses-sdk>元素(minSdkVersion、targetSdkVersion),这在评估深链风险与 Android 12 以上的行为差异时很有价值:

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" ...> <uses-sdk android:minSdkVersion="29" android:targetSdkVersion="35" />

1.2 使用 apktool 提取

apktool d -s -f -o output_dir MASTG-DEMO-0001.apk

-s参数跳过 dex 反汇编(baksmali),速度更快。解码后的 Manifest 位于output_dir/AndroidManifest.xml。注意:apktool 会将<uses-sdk>的值移入独立的apktool.yml,而非写回 XML:

sdkInfo: minSdkVersion: 29 targetSdkVersion: 35

1.3 使用 aapt2 快速查询

如果只需要部分属性,可使用 aapt2 直接查询(输出不是 XML 格式,属性命名也不同,例如application-debuggable而非android:debuggable):

aapt2 d badging MASTG-DEMO-0001.apk

拿到可读的 Manifest 后,即可开始定位<intent-filter>元素。正如 MASTG-TECH-0150 所述,也可用grep、aapt2、xmllint/xmlstarlet等工具做定向检索:

grep -i "android.intent.action.VIEW" output_dir/AndroidManifest.xml

二、核心方法一:在 Android Manifest 中识别深链

深链是否被定义,取决于<activity>(或<activity-alias>)内部是否存在包含android.intent.action.VIEW动作的<intent-filter>元素,并配合对应的<data>声明。根据声明方式的不同,可以将入口分为三类。

2.1 自定义 URL Scheme

下面的示例声明了一个自定义 URL Scheme 深链,完整链接形式为myapp://path:

<activity android:name=".MyUriActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="myapp" android:host="path" /> </intent-filter> </activity>

自定义 Scheme(非http/https)意味着设备上任意应用都可以构造并触发该入口。MASTG 的静态分析规则 mastg-android-custom-deeplink-scheme.yml 正是针对这种模式:它匹配intent-filter内同时包含android.intent.action.VIEW、android.intent.category.BROWSABLE,且<data android:scheme>的值不是http/https的声明,并给出告警 "Custom deeplink scheme detected in an intent-filter (potentially exposed deeplink). Any app on the device can invoke this handler."。

2.2 标准 Deep Link(http/https)

如果同时使用http://与https://Scheme,并指定 host 与 path,即可构成标准 Web 深链。下面的示例中,完整匹配的 URL 为https://www.myapp.com/my/app/path:

<intent-filter> ... <data android:scheme="http" android:host="www.myapp.com" android:path="/my/app/path" /> <data android:scheme="https" android:host="www.myapp.com" android:path="/my/app/path" /> </intent-filter>

2.3 App Link(需验证成功)

若<intent-filter>带有android:autoVerify="true"标志,Android 系统会访问声明的android:host域名,尝试获取其上的 Digital Asset Links 文件(assetlinks.json)以验证 App Link 归属:

<intent-filter android:autoVerify="true">

关键判定标准:只有验证成功,深链才能被称为 App Link。如果验证失败(例如文件缺失、JSON 无效、存在重定向等),该链接在 Android 12(API level 31)之前会扩大应用攻击面,甚至可能导致同一应用内其他 App Link 全部失效——这一点在 MASTG-TEST-0028 中有明确的风险描述。相应地,规则 mastg-android-deeplink-autoverify-missing.yml 会捕获那些声明了 http/https 深链却缺少android:autoVerify="true"的 intent-filter,提示恶意应用可能劫持链接。

2.4 易被忽略的 data 元素合并规则

枚举深链时最容易出错的地方:同一个<intent-filter>内的多个<data>元素并非"各行其是",而是按笛卡尔积合并,覆盖所有属性组合。看下面的例子:

<intent-filter> ... <data android:scheme="https" android:host="www.example.com" /> <data android:scheme="app" android:host="open.my.app" /> </intent-filter>

直觉上可能认为它只支持https://www.example.com与app://open.my.app,但实际支持的是以下 4 个入口:

  • https://www.example.com
  • app://open.my.app
  • app://www.example.com
  • https://open.my.app

这意味着手动读清单时极易漏报。因此实际测试中应优先采用下面的自动化手段,将全部组合显式列出。

三、核心方法二:使用 dumpsys 枚举 Scheme

如果目标应用已经安装到设备或模拟器上,可以使用 adb(MASTG-TOOL-0004)通过dumpsys直接查询已注册的深链信息:

adb shell dumpsys package com.example.package

该命令会输出该包名下所有已解析的 intent-filter 数据,包括自定义 Scheme 与 http/https 深链。它反映的是系统层面实际注册的入口,与静态读取 Manifest 互为印证。若设备为 Android 12(API level 31)及以上,还可以进一步使用:

adb shell pm get-app-links com.example.package

查看每个域名的 App Link 验证状态(verified、legacy_failure等),相关内容可参见 MASTG-TEST-0028。

四、核心方法三:使用 Android "App Link Verification" Tester 脚本

在脱机场景(仅有 APK、无设备)下,推荐使用 Android "App Link Verification" Tester 脚本(deeplink_analyser.py)直接对 APK 做全量枚举。它支持两种主要操作:

  • list-all:列出全部深链(含自定义 Scheme 与 http/https)
  • list-applinks:仅列出 App Link
python3 deeplink_analyser.py -op list-all -apk ~/Downloads/example.apk

示例输出:

.MainActivity app://open.my.app app://www.example.com https://open.my.app https://www.example.com

可以看到,脚本自动给出了 4 个入口组合——正是上一节所述<data>合并规则的全量展开,避免了人工阅读清单时的漏报。建议以该输出为基准,与 Manifest 手工分析结果逐一比对。

五、从"枚举"走向"验证":下一步测试要点

MASTG-TECH-0172 属于深链测试的起点环节。完成枚举后,在 MASTG-TEST-0028 的完整测试流程中,还需要继续做三件事:

  1. 验证网站关联(App Link Verification):对每个声明了autoVerify="true"的域名,检查其/.well-known/assetlinks.json是否可访问、JSON 是否合法、是否包含目标应用的包名与签名指纹;注意系统不会验证存在重定向(如http://example.com→https://example.com,或裸域 →www子域)的链接;若一个 intent-filter 声明了多个子域(如www.example.com与mobile.example.com),每个子域都必须有独立的合法 Digital Asset Links 文件;通配符域名(*.example.com)则需要在根域example.com上发布文件。
  2. 审计处理器逻辑:在 Manifest 中找到承载<intent-filter>的<activity>,再定位其中对getIntent()、getData()、getQueryParameter()的使用,检查外部可控的 URI 参数是否被校验与清洗。MASTG 提供了对应静态分析规则 mastg-android-deeplink-unvalidated-parameter.yml,它会定位深链处理器入口点及读取的 URI 参数,并提示逐一验证每个值在使用前的类型转换、边界检查或清洗。
  3. 动态触发与监控:使用 adb 的 Activity Manager 直接构造显式 Intent 触发深链,配合 Frida hookIntent.getData观察实际传入数据;若多个应用注册了相同 Scheme,系统可能弹出选择对话框,此时应显式指定包名构造 Intent。深链参数未经校验直接进入 WebView 等组件时,可能演变为 XSS 或注入类漏洞,这也是 MASTG-TEST-0027(WebView URL 加载)等测试关注的重点场景。

六、小结:三种枚举手段的适用场景

方法前置条件输出形态适用场景
手工分析 Manifest(jadx / apktool / aapt2)仅有 APKXML 或 badging 文本快速定性、理解声明结构
adb shell dumpsys package <pkg>已安装到设备/模拟器系统解析后的包信息与静态结果互证、查看系统层面注册情况
deeplink_analyser.py(list-all / list-applinks)仅有 APK深链列表(自动展开 data 组合)全量枚举,避免<data>合并导致的漏报

将三种手段结合使用,即可完成对 Android 应用深链攻击面的完整、无遗漏盘点:先以脚本输出为基准清单,再以 Manifest 手工分析确认声明结构,最后用dumpsys或pm get-app-links在真实设备上验证系统解析与 App Link 验证状态,为后续的处理器逻辑审计与漏洞验证提供可靠输入。

  • 文档
  • 教程
  • 网络安全

【免费下载链接】mastg

The OWASP Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app security testing and reverse engineering. It describes technical processes for verifying the OWASP Mobile Security Weakness Enumeration (MASWE) weaknesses, which are in alignment with the OWASP MASVS.

项目地址:https://gitcode.com/gh_mirrors/ow/mastg
点击查看免费下载

相关推荐

上一篇:React-Redux游戏开发:5个高效状态管理模式揭秘
下一篇:palera1n 越狱指南:A8-A11 checkm8 完整利用流程

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询