- 文档
- 教程
- 网络安全
【免费下载链接】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.
本篇文章以 OWASP MASTG 仓库中的 MASTG-DEMO-0040 演示用例为主线,完整讲解如何利用静态分析工具 semgrep 与仓库内置规则检测 Android 应用AndroidManifest.xml中危险的android:debuggable="true"配置。读完本文,你将掌握:debuggable 标志的安全风险模型、semgrep 规则的编写与执行方法、manifest 的提取与分析流程,以及该问题对应的 MASTG 测试用例、评估标准与修复建议,可直接用于日常移动应用安全测试工作。
背景:为什么android:debuggable值得关注
android:debuggable是 AndroidApplication元素上的一个布尔型属性,用于声明应用是否允许被调试。当该标志被显式设置为true时,应用进程会额外启动一个用于处理 JDWP(Java Debug Wire Protocol)协议数据包的线程——正如 MASTG-KNOW-0007 中所述,每个启用调试的进程都会运行一个额外的 JDWP 线程,而该线程只会为设置了android:debuggable="true"的应用启动。攻击者一旦接入 JDWP 通道,即可附加调试器、读取内存中的敏感数据、设置断点、动态修改运行时行为,甚至绕过应用内已有的安全控制。
对应 MASTG-TEST-0226 的描述:该测试用例检查应用是否在AndroidManifest.xml中将debuggable标志设置为true。虽然谷歌官方指出,debuggable标志本身并不被视为一个直接的漏洞,但它会显著扩大攻击面——在生产环境中,它等于向攻击者敞开了访问应用数据与内部资源的大门。
在 MASTG 的测试体系中,该问题被归类为:
- 测试用例:MASTG-TEST-0226(static/code 类型,对应 MASWE-0063);
- 最佳实践:MASTG-BEST-0007——所有 release 构建中 debuggable 标志必须设为
false; - 旧版映射:早期版本对应的 MASTG-TEST-0039(MSTG-CODE-2)已标记为 deprecated,由 MASTG-TEST-0226 / 0227 覆盖。
Demo 用例结构速览
MASTG-DEMO-0040 演示了"规则 → 样本 → 扫描 → 输出 → 评估"的完整自动化静态检测闭环。该用例目录包含以下文件:
- MASTG-DEMO-0040.md:用例说明(Sample / Steps / Observation / Evaluation);
AndroidManifest.xml:原始(源码态)manifest 样本,作为对比参照;AndroidManifest_reversed.xml:反编译后的 manifest,即实际被扫描的对象,模拟从 APK 中逆向提取出的形态;run.sh:执行 semgrep 扫描的脚本;output.txt:扫描结果输出;- 关联规则:rules/mastg-android-debuggable-flag.yml;
- 关联工具:MASTG-TOOL-0110(semgrep)。
样本分析:源码态与反编译态 manifest 对比
原始 manifest(源码态)
AndroidManifest.xml 展示的是一个带有 debuggable 标志的示例 manifest,<application>元素中显式声明了android:debuggable="true":
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:debuggable="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.MASTestApp" tools:targetApi="31"> <activity android:name=".MainActivity" android:exported="true" android:theme="@style/Theme.MASTestApp"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>可以看到,除了android:debuggable="true"这一风险点,该样本还包含android:allowBackup="true"(另一个常见安全关注点)以及一个导出且带 LAUNCHER intent-filter 的MainActivity。作为测试样本,它刻意保留了这些典型配置,便于规则在真实形态的 manifest 上命中。
反编译后的 manifest(扫描对象)
AndroidManifest_reversed.xml 模拟了从 APK 中逆向提取出的二进制 XML 解码结果:standalone="no"、package="org.owasp.mastestapp"、compileSdkVersion="35"、compileSdkVersionCodename="15"、platformBuildVersionCode="35"。其<application>元素保留了原始源码中的全部属性,其中第 5 行明确包含android:debuggable="true":
<application android:allowBackup="true" android:appComponentFactory="androidx.core.app.CoreComponentFactory" android:dataExtractionRules="@xml/data_extraction_rules" android:debuggable="true" android:extractNativeLibs="false" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.MASTestApp">这份反编译 manifest 还展示了真实应用中常见的框架注入痕迹:androidx.core.app.CoreComponentFactory、androidx.startup.InitializationProvider、ProfileInstallReceiver、DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION等。这意味着在实际测试中,你扫描的 manifest 会包含大量与业务无关的框架声明——而 semgrep 规则恰恰能在不误报这些内容的前提下,精准定位到debuggable属性。
提示:Android 的 AndroidManifest 以二进制 XML 格式存储在 APK 中,无法通过直接解压读取,必须先经过解码工具处理。关于如何获取并解码 manifest,见下文"获取待扫描的 manifest"一节。
semgrep 规则深度解析
MASTG 为 debuggable 标志检测内置了一条 semgrep 规则,位于 rules/mastg-android-debuggable-flag.yml,完整内容如下:
rules: - id: mastg-android-debuggable-flag severity: WARNING languages: - xml metadata: summary: This rule inspects the AndroidManifest.xml for the debuggable flag. message: "[MASVS-RESILIENCE-4] debuggable detected as $ARG." patterns: - pattern: 'android:debuggable="$ARG"'逐项拆解这条规则的语义:
| 配置项 | 取值 | 含义 |
|---|---|---|
id | mastg-android-debuggable-flag | 规则的唯一标识符,将出现在扫描结果中,便于自动化流水线归类与去重 |
severity | WARNING | 告警级别。因为debuggable本身不是直接漏洞,而是风险放大因素,故定为 WARNING 而非 ERROR |
languages | xml | 声明规则匹配 XML 语言。虽然 MASTG-TOOL-0110 对 semgrep 的官方定位是"能够扫描 Java、Kotlin 和 Swift 的静态代码扫描器",但 semgrep 同样支持 XML,这正是本规则能够分析 manifest 的原因 |
message | [MASVS-RESILIENCE-4] debuggable detected as $ARG. | 命中时输出的提示信息,其中$ARG是捕获组,将实际属性值(true/false)回填到消息中,同时标注了对应的 MASVS 控制项 |
patterns | pattern: 'android:debuggable="$ARG"' | 核心匹配模式:查找形如android:debuggable="..."的属性声明,并通过$ARG元变量捕获引号内的具体取值 |
这里有一个值得注意的设计细节:规则捕获的是属性值本身($ARG),而不仅仅是指纹匹配android:debuggable字符串。这使得规则的输出信息能够明确区分true与false——虽然生产环境的要求是false,但测试人员仍可通过$ARG的值快速判断当前命中的究竟是配置错误还是合法配置,避免机械式地报告所有命中项。
执行步骤:运行 semgrep 规则
MASTG-DEMO-0040 通过 run.sh 执行扫描,脚本内容只有一条命令:
NO_COLOR=true semgrep -c ../../../../rules/mastg-android-debuggable-flag.yml ./AndroidManifest_reversed.xml > output.txt命令关键点逐一说明:
NO_COLOR=true:禁用 semgrep 输出的 ANSI 颜色转义序列,保证输出为纯文本,便于写入output.txt文件、后续做 diff 或纳入 CI 日志;semgrep -c <rule>:-c/--config参数指定规则文件。这里指向仓库根目录rules/下的mastg-android-debuggable-flag.yml(原文档中../../../../rules/...是从 demo 目录到仓库规则目录的相对路径,实际文件位于 rules/mastg-android-debuggable-flag.yml);- 扫描目标:
./AndroidManifest_reversed.xml——即反编译后的 manifest 文件; - 输出重定向:
> output.txt将扫描结果持久化。
从仓库规则目录结构看,rules/ 下存放了数十条按平台与主题组织的 semgrep 规则(mastg-android-*.yml/.yaml,覆盖加密、网络、存储、WebView、root 检测等主题),mastg-android-debuggable-flag.yml只是其中一条。这意味着你完全可以复用同一套方法论,用相同的工作流批量扫描其他风险项。也可以按仓库惯例直接指定整个规则目录进行多规则扫描:
semgrep --config rules/ --lang xml AndroidManifest_reversed.xml观察:扫描输出解读
运行上述命令后,output.txt 记录了 semgrep 的完整结果。核心内容如下:
┌────────────────┐ │ 1 Code Finding │ └────────────────┘ AndroidManifest_reversed.xml ❯❱ mastg-android-debuggable-flag [MASVS-RESILIENCE-4] debuggable detected as true. 5┆ <application android:allowBackup="true" android:appComponentFactory="androidx.core.app.CoreComponentFactory" android:dataExtractionRules="@xml/data_extraction_rules" android:debuggable="true" android:extractNativeLibs="false" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.MASTestApp">解读这份输出的几个要点:
1 Code Finding:整个文件中恰好命中 1 处代码发现,说明规则具备精准性——框架注入的众多属性声明(appComponentFactory、extractNativeLibs等)都没有触发误报,唯一命中的正是android:debuggable;- 规则标识:
❯❱ mastg-android-debuggable-flag表明命中的是仓库规则文件中的规则 id; - 规则消息:
[MASVS-RESILIENCE-4] debuggable detected as true.——$ARG捕获到的值是true,直接确认了风险配置的存在; - 源码定位:输出以
5┆起始的代码片段精确指向AndroidManifest_reversed.xml第 5 行的<application>元素,供测试人员快速人工复核。
评估:测试结论
依据 MASTG-TEST-0226 的评估标准:如果debuggable标志被显式设置为true,测试用例失败——这表示应用被配置为允许调试,对生产环境而言是不适当的。
在本 Demo 中,semgrep 规则明确识别出android:debuggable="true",因此MASTG-DEMO-0040 的评估结论为失败(Fail)。需要补充的是,MASTG-TEST-0226 同时指出:如果 manifest 中未指定该标志,对于 release 构建默认按false处理,即测试通过。
纵深扩展:从静态扫描到完整验证
获取待扫描的 manifest
静态扫描的第一步是拿到可读的AndroidManifest.xml。根据 MASTG-TECH-0117,AndroidManifest 以二进制 XML 存储于 APK 中,需要先用工具解码,常用的三种方式:
- jadx(MASTG-TOOL-0018)CLI 只解资源不解源码:
jadx --no-src -d out_dir app.apk输出位于
out_dir/resources/AndroidManifest.xml,且包含其他工具不输出的<uses-sdk>元素; - apktool(MASTG-TOOL-0011):
apktool d -s -f -o output_dir app.apk-s跳过 baksmali、只解资源,速度更快,解码结果在output_dir/AndroidManifest.xml;注意<uses-sdk>会被移入apktool.yml的sdkInfo段; - aapt2(MASTG-TOOL-0124):
aapt2 d badging app.apk注意其输出不是 XML,而是自定义解码格式(如
application-debuggable)。
解码工具的差异会影响你后续的规则编写:MASTG-TECH-0150 指出,jadx / apktool 输出标准 XML(android:debuggable="true"形式),而 aapt2 输出自定义格式(application-debuggable形式)。本 Demo 的规则针对标准 XML 形态编写,若扫描对象来自 aapt2,则需要调整匹配模式。
手工分析 manifest 的补充手段
除 semgrep 自动化扫描外,MASTG-TECH-0150 提供了手工核查 debuggable 标志的多种方法:
- grep直接检索解码后的 XML:
grep -i "android:debuggable" output_dir/AndroidManifest.xml - aapt2不解码直接查 badging 输出:
aapt2 d badging app.apk | grep -i debuggable - xmllint / xmlstarlet结构化查询:
xmlstarlet sel -t -v "//application/@android:debuggable" -n output_dir/AndroidManifest.xml
动态验证方法
静态发现之后,可用动态手段确认应用实际以可调试状态运行。早期测试用例 MASTG-TEST-0039(现已由 MASTG-TEST-0226 替代)记录了以下实用技巧:
aapt快速检查编译产物中的标志位:aapt d xmltree sieve.apk AndroidManifest.xml | grep -Ec "android:debuggable\(0x[0-9a-f]+\)=\(type\s0x[0-9a-f]+\)0xffffffff"若输出为
1,说明android:debuggable="true"指令存在;adb dumpsys检查运行时标志:adb shell dumpsys package com.mwr.example.sieve | grep -c "DEBUGGABLE"输出大于 0 说明应用带 DEBUGGABLE 标志;
run-as验证调试特权——可调试应用允许直接以该应用身份执行命令:run-as com.vulnerable.app idjdb附加调试会话:通过adb jdwp找 PID →adb forward tcp:55555 jdwp:<PID>建立通道 →jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=55555附加调试器。若附加成功,则证明调试已被激活。
这些手段与 semgrep 静态扫描互为印证,构成"静态发现 → 动态确认"的完整测试链路。
修复与加固建议
依据 MASTG-BEST-0007,修复方法非常直接:确保所有 release 构建中 AndroidManifest.xml 的 debuggable 标志设置为false。
具体到工程实践:
- 检查构建脚本(Gradle / CI 配置),确认 release 变体未注入
android:debuggable="true"; - 发布前在构建产物上执行本文所述的 semgrep 规则或
aapt2 d badging检查,作为发布门禁; - 将 rules/mastg-android-debuggable-flag.yml 集成进 CI 流水线,对
AndroidManifest_reversed.xml(或解码后的 manifest)持续扫描,阻止携带该标志的构建进入生产环境。
小结
MASTG-DEMO-0040 完整展示了如何借助 MASTG-TOOL-0110(semgrep)与仓库内置规则 mastg-android-debuggable-flag.yml,对 Android 应用的 manifest 进行自动化安全检测。整个工作流可归纳为:提取解码 manifest(MASTG-TECH-0117)→ 编写/复用规则 → 执行扫描 → 解读输出 → 对照 MASTG-TEST-0226 评估 → 按 MASTG-BEST-0007 修复。该模式同样适用于仓库 rules/ 目录下其他数十条 Android 安全规则,是 MASTG 将安全测试规范落地为可重复执行、可集成进 CI 的自动化方案的典型范例。
- 文档
- 教程
- 网络安全
【免费下载链接】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.
相关推荐
OWASP MASTG 实战:使用 semgrep 静态检测 AndroidManifest 中的危险权限(MASTG-DEMO-0033)
OWASP MASTG 实战:使用 semgrep 静态检测 AndroidManifest 中的危险权限(MASTG DEMO 0033) 本文围绕 OWAS
文档教程网络安全MASTG-BEST-0007 解读:在 AndroidManifest 中禁用 debuggable 标志的发布构建安全实践
MASTG BEST 0007 解读:在 AndroidManifest 中禁用 debuggable 标志的发布构建安全实践 导读 :本指南以 OWASP M
文档教程网络安全OWASP MASTG 实战:用 Semgrep 静态检测 Android StrictMode 使用(MASTG-DEMO-0039)
OWASP MASTG 实战:用 Semgrep 静态检测 Android StrictMode 使用(MASTG DEMO 0039) 导读 :本文基于 OW
文档教程网络安全
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考