MASTG 最佳实践:校验 Android 深链与自定义 URL Scheme 处理器的输入参数

📅 发布时间:2026/10/7 15:08:31
MASTG 最佳实践:校验 Android 深链与自定义 URL Scheme 处理器的输入参数
文档教程网络安全【免费下载链接】mastgThe 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 Link是移动应用攻击面中极易被忽略的一环设备上任意应用都能向你的处理器发送 Intent而 Android 不像 iOS 那样暴露调用方的 Bundle ID因此处理器收到的每一个参数都必须被视为不可信输入。本文是 OWASP MASTG 最佳实践 MASTG-BEST-0071 的展开解读结合仓库中的知识条目 MASTG-KNOW-0019、配套最佳实践 MASTG-BEST-0070、测试用例 MASTG-TEST-0031 与失败样例 MASTG-DEMO-0152读完你可以掌握一套可落地的校验清单类型转换、边界检查、字符串净化、白名单校验以及处理器暴露面的收敛。为什么深链参数必须被当作不可信输入深链的基本机制深链是任意 scheme 的 URI能把用户直接带到应用内的特定内容。应用通过在AndroidManifest.xml的activity上声明intent-filter来注册深链并从收到的 Intent 中提取数据跳转到对应界面。一个可浏览的 Web 深链由android.intent.action.VIEWaction、android.intent.category.DEFAULT与android.intent.category.BROWSABLE两个 category以及一个或多个定义scheme、host、path的data元素组合而成参见 MASTG-KNOW-0019。Android 支持两类深链自定义 URL Scheme使用任意自定义 scheme如myapp://系统不做任何验证Android App LinksAndroid 6.0 / API level 23 及以上使用http://与https://scheme并带有触发系统验证的autoVerify属性。攻击者的角度Deep Link Collision 与匿名调用方自定义 scheme 深链存在一个显著风险——深链碰撞Deep Link Collision设备上任何应用都可以声明并尝试处理与你的应用完全相同的深链。在较新版本的 Android 上这表现为一个消歧对话框disambiguation dialog用户可能误选恶意应用而非合法应用。更关键的是调用方身份问题iOS 会通过sourceApplication属性暴露调用方的 Bundle ID而Android 没有任何内置机制让深链处理器识别是谁发送的 Intent——只要 intent filter 被导出exported设备上任意应用都能发送匹配该 filter 的 Intent。所以处理器通过以下方式取到的任何数据都必须被当作不可信输入Intent.getData()Uri.getQueryParameter()Uri.getPathSegments()Uri.getLastPathSegment()从源码结构看仓库中的测试用例 MASTG-TEST-0028 同样强调了这一立场None of the input from these sources can be trusted; it must be validated and/or sanitized这些来源的输入一概不可信必须校验和/或净化并指出深链包括 App Links可能引入链接劫持link hijacking、敏感功能暴露等风险。核心实践一转换为预期类型Type Conversion当参数表示数值时必须显式转换并处理失败分支绝不把getQueryParameter()返回的原始字符串直接用于期望特定类型的运算。val amount uri.getQueryParameter(amount)?.toLongOrNull() ?: return // reject missing or non-numeric values要点使用toLongOrNull()或toIntOrNull()参数缺失或无法解析为数字时返回null配合 Elvis 操作符?:直接拒绝请求只接受你期望的数值类型9999999、-1、not-a-number等字符串都会被这个转换统一拦下或进入后续边界检查类型转换是后续一切校验的前提——一个仍是String的数字无法参与范围比较。反例佐证仓库中的失败样例 MASTG-DEMO-0152 展示了一个mastestapp://transfer自定义 scheme 处理器其MastgTest_reversed.java中String amount data.getQueryParameter(amount); // raw String from the URI ... return processTransfer(amount); // used as-is ... private final String processTransfer(String amount) { return Transferring amount units; // no toLong(), no bounds check }该样例刻意不带类型转换、也不做边界检查属于典型反例可直接用于对照理解校验缺失的后果。核心实践二检查边界与范围Bounds and Range Checks类型转换之后还要在采取任何业务动作之前验证数值是否落在可接受区间内。对金融或资源敏感的操作必须同时强制下限与上限if (amount 0 || amount 10_000) return这条规则的含义amount 0拒绝零值与负数防止绕过最小金额之类的业务约束amount 10_000拒绝超限值防止超量转账、资源耗尽等风险上下限应根据业务语义配置例如转账上限、单设备绑定数量上限、分页大小上限等。边界检查必须发生在作用于业务逻辑之前而不是渲染或存储之后——先算后校验等于没校验。核心实践三净化字符串参数Sanitize String Parameters不经净化精心构造的 URI 可以命中应用的不同部件典型攻击路径有三类路径遍历Path Traversal形如path../../databases/secrets.db的值若被用于文件操作可逃逸预期目录。必须解析出**规范路径canonical path**并验证其仍位于预期基目录之内脚本注入Script Injection形如qscriptalert(1)/script的值若被渲染进WebView可执行 JavaScript。这一点与 MASTG-TEST-0031 描述的 WebView 风险直接相关——JavaScript 在 WebView 中默认关闭、必须显式启用setJavaScriptEnabled(true)一旦启用注入 HTML/脚本的来源必须完全可信仅加载应用数据目录内的本地文件或可信服务器内容且用户不能通过输入控制加载来源查询或命令注入Query / Command Injection被插值进 SQL 查询或 shell 命令的值会改变原有逻辑。应使用**参数化查询parameterized queries**并避免字符串拼接。净化的总体原则是当合法输入集合已知时优先采用白名单allowlist——直接拒绝任何不匹配的值而不是试图逐个剥离可疑字符。白名单匹配天然免疫漏过滤字符类绕过也远比黑名单维护成本低。核心实践四收敛处理器暴露面Restrict the Handler Surface输入校验之外还应从声明层面收缩攻击面若深链处理器不需要被其他应用触达就在其 activity 上设置android:exportedfalse让外部应用根本无法送达 Intent对于触发敏感操作的链接优先使用经过验证的 App Links见 MASTG-BEST-0070而非自定义 URL scheme——App Links 由系统通过 Digital Asset Links 文件验证域名归属不会出现深链碰撞自定义 scheme 永远不被系统验证、任何应用都能声明若必须接受自定义 scheme则其输入必须按不可信数据校验即本文全部规则。App Links 的验证细节autoVerifytrue、https://host/.well-known/assetlinks.json、重定向导致验证失败、Android 12 前后的行为差异等可进一步阅读 MASTG-BEST-0070 与 MASTG-KNOW-0019。如何在工程与测试中落地用 Semgrep 规则定位处理器与参数读取点仓库提供了两条可执行的静态扫描规则用来定位深链处理器及其参数读取点从而人工核查校验是否完备rules/mastg-android-deeplink-unvalidated-parameter.yml 会匹配$INTENT.getData()与$URI.getQueryParameter(...)rules: - id: mastg-android-deeplink-unvalidated-parameter severity: WARNING languages: - java metadata: summary: This rule locates the deep link handler entry point and the URI parameters it reads. message: [MASVS-PLATFORM] A deep link handler reads the incoming URI (getIntent/getData) and/or extracts a parameter (getQueryParameter). Verify each value is validated (type conversion, bounds, or sanitization) before it is used. pattern-either: - pattern: $INTENT.getData() - pattern: $URI.getQueryParameter(...)配套的 mastg-android-custom-deeplink-scheme.yml 用于从 Manifest 中定位自定义 scheme 声明及其所属 activity。动态验证真实触发深链确认校验是否生效针对 MASTG-DEMO-0152 这类处理器可像样例那样用adb shell am start构造恶意深链进行动态验证adb shell am start -a android.intent.action.VIEW -d mastestapp://transfer?amount9999999 adb shell am start -a android.intent.action.VIEW -d mastestapp://transfer?amount-1 adb shell am start -a android.intent.action.VIEW -d mastestapp://transfer?amountnot-a-number触发后在应用内点击处理若结果显示Transferring 9999999 units之类的输出说明处理器直接接受了攻击者控制的值而未做数值转换与边界检查——这正是本文四步校验应该拦截的场景。修复后同样的命令应被拒绝返回、报错或不产生副作用。纳入完整深链测试流程深链安全验证不止于参数校验还需枚举全部深链注意同一intent-filter内的data元素会按属性组合合并展开、核验 App Links 的 Digital Asset Links 归属验证是否真正成功并测试所有输入数据。完整流程可参考测试用例 MASTG-TEST-0028 与验证技术 MASTG-TECH-0174。小结把 MASTG-BEST-0071 落到代码里核心是四条顺序执行的防线类型转换toLongOrNull()/toIntOrNull()拒绝缺失与非数值输入边界检查业务动作前强制最小/最大范围字符串净化规范路径校验防目录逃逸、白名单拒绝脚本/查询/命令注入、参数化查询防 SQL 注入暴露面收敛android:exportedfalse关闭非必要入口敏感流程优先验证过的 App Links。由于 Android 深链调用方匿名、自定义 scheme 可被任意应用声明这四条防线不是可选项而是处理器安全的最低要求。相关证据链知识条目、测试用例、失败样例、semgrep 规则均可从仓库直接查阅入口见 MASTG-KNOW-0019反例与动态验证步骤见 MASTG-DEMO-0152WebView 注入面分析见 MASTG-TEST-0031。赞分享文档教程网络安全【免费下载链接】mastgThe 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点击查看免费下载相关推荐OWASP MASTG 最佳实践iOS 自定义 URL Scheme 处理器的输入校验与安全加固指南OWASP MASTG 最佳实践iOS 自定义 URL Scheme 处理器的输入校验与安全加固指南 本文是 OWASP Mobile Application文档教程网络安全MASTG-DEMO-0152 深入剖析用 Semgrep 检测 Android 自定义 URL Scheme 处理器的参数未校验漏洞MASTG DEMO 0152 深入剖析用 Semgrep 检测 Android 自定义 URL Scheme 处理器的参数未校验漏洞 导读 本文以 OWAS文档教程网络安全iOS 自定义 URL Scheme 来源校验最佳实践基于 OWASP MASTG-BEST-0055 的 sourceApplication 验证指南iOS 自定义 URL Scheme 来源校验最佳实践基于 OWASP MASTG BEST 0055 的 sourceApplication 验证指南 本文文档教程网络安全创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考