
文档教程网络安全【免费下载链接】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点击查看免费下载导读通知Notification是 Android 应用展示信息的重要渠道但也是敏感数据泄露的高发区姓名、手机号、验证码、健康或金融信息一旦出现在通知标题或正文中就可能被旁人窥屏shoulder surfing或共享设备时泄露。本文以 OWASP MASTG 仓库中的演示用例 MASTG-DEMO-0078 为主线完整演示如何对一个故意包含 PII 的 Android 示例应用执行静态分析从还原后的 Java 代码与 Manifest 清单入手使用 Semgrep 规则自动定位setContentTitle/setContentText调用点与POST_NOTIFICATIONS权限声明并结合minSdkVersion判定测试结论。读完本文你将掌握一套可直接复制的通知敏感数据泄露检测命令、规则与判定方法。背景通知泄露敏感数据为什么值得专门检测通知的展示具有无感可见的特点——锁屏界面、状态栏、下拉通知栏都会直接渲染通知内容用户很难控制其可见范围。因此MASTG-TEST-0315 专门验证应用是否正确处理通知确保 PII个人身份信息、OTP一次性密码以及健康、财务等敏感数据不会通过通知暴露。该测试对应 MASVS-PLATFORM-3 安全要求确保通知不包含敏感信息并关联 MASWE-0037 弱点枚举项。本演示用例的核心价值在于它构造了一个测试失败的样本——示例代码刻意把Hi John Doe名 姓属于典型 PII写进通知标题和正文并通过 Semgrep 规则在还原后的代码上自动定位这些位置最终得出测试失败的结论。这为安全测试人员提供了一条样本 → 工具 → 证据 → 判定的完整链路。示例应用剖析四条路径把 PII 写进通知示例源码位于 MastgTest.kt它用四种方式构造通知覆盖了 Android 通知 API 的常见组合Notification.Builder无通知渠道 / 指定渠道NotificationCompat.BuilderAndroidX 兼容实现无渠道 / 指定渠道package org.owasp.mastestapp import android.R import android.app.Notification import android.app.NotificationChannel import android.app.NotificationManager import android.content.Context import androidx.core.app.NotificationCompat class MastgTest(private val context: Context) { val notificationManager (context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager).apply { createNotificationChannel( NotificationChannel( TEST_CHANNEL_ID, Test Channel, NotificationManager.IMPORTANCE_DEFAULT ) ) } val sensitiveTitle Hi John Doe val sensitiveText Hi John Doe - This is a sensitive string containing PII fun mastgTest(): String { notificationManager.notify(1, createNotification()) notificationManager.notify(2, createNotificationOnChannel()) notificationManager.notify(3, createNotificationCompat()) notificationManager.notify(4, createNotificationCompatOnChannel()) return sensitiveText } private fun createNotification() Notification.Builder(context) .setContentTitle(sensitiveTitle) .setContentText(sensitiveText) .setSmallIcon(R.drawable.ic_menu_info_details) .build() private fun createNotificationOnChannel() Notification.Builder(context, TEST_CHANNEL_ID) .setContentTitle(sensitiveTitle) .setContentText(sensitiveText) .setSmallIcon(R.drawable.ic_menu_info_details) .build() private fun createNotificationCompat() NotificationCompat.Builder(context) .setContentTitle(sensitiveTitle) .setContentText(sensitiveText) .setSmallIcon(R.drawable.ic_menu_info_details) .build() private fun createNotificationCompatOnChannel() NotificationCompat.Builder(context, TEST_CHANNEL_ID) .setContentTitle(sensitiveTitle) .setContentText(sensitiveText) .setSmallIcon(R.drawable.ic_menu_info_details) .build() }关键点在于四种构造方式全部复用了同一个sensitiveTitle与sensitiveText。这意味着只要静态规则能命中setContentTitle/setContentText调用就能发现全部泄露点而无需逐一阅读方法体。此外示例通过NotificationChannel(TEST_CHANNEL_ID, ..., IMPORTANCE_DEFAULT)创建了通知渠道并分别在有无渠道两种场景下调用notify()模拟了真实应用中老接口迁移到渠道机制的常见状态。清单声明POST_NOTIFICATIONS 与目标版本示例应用的 AndroidManifest.xml 中声明了两个与通知相关的权限/配置uses-permission android:nameandroid.permission.INTERNET / uses-permission android:nameandroid.permission.POST_NOTIFICATIONS /POST_NOTIFICATIONS是 Android 13API 33及更高版本引入的运行时权限面向 API 33 及以上目标版本的应用必须先请求该权限才能发布通知API 33 以下的系统版本则不要求此权限。因此测试阶段必须确认该权限已被授予详见下文前置条件。而从还原后的 AndroidManifest_reversed.xml 可以看到实际打包产物中的版本信息uses-sdk android:minSdkVersion29 android:targetSdkVersion35/ uses-permission android:nameandroid.permission.INTERNET/ uses-permission android:nameandroid.permission.POST_NOTIFICATIONS/minSdkVersion29是评估环节的关键输入其含义在判定逻辑一节详细展开。前置条件确保应用获得通知权限原文档特别提示在设备上执行测试前必须确保应用已获得POST_NOTIFICATIONS权限。两种途径任选其一通过 adb 命令行直接授权adb shell pm grant org.owasp.mastestapp android.permission.POST_NOTIFICATIONS在设备上进入 设置 → 应用 → 该应用 → 通知手动开启通知权限。说明adb shell pm grant适用于android.permission.POST_NOTIFICATIONS这类可授予权限如果应用已声明但未在运行时请求此命令仍可强制授予方便测试场景绕过 UI 交互。静态分析规则两条 Semgrep 规则MASTG 为通知敏感数据场景提供了两条 Semgrep 规则均位于 rules 目录规则一扫描代码中的通知内容 APIrules/mastg-android-sensitive-data-in-notifications.yml 针对 Java/Kotlin 反编译代码命中setContentTitle与setContentText两类 API 调用rules: - id: mastg-android-sensitive-data-in-notifications languages: - java severity: WARNING metadata: summary: This rule looks for notifications that may contain sensitive data. message: [MASVS-PLATFORM-3] Ensure that notifications do not contain sensitive information pattern-either: - pattern: $X.setContentTitle(...) - pattern: $X.setContentText(...)pattern-either表示任一模式命中即告警$X是元变量可匹配任意接收者对象因此无论是Notification.Builder还是NotificationCompat.Builder都能命中规则声明为WARNING级别输出时会附带[MASVS-PLATFORM-3]消息前缀便于与安全要求对应。规则二扫描清单中的权限声明与最低版本rules/mastg-android-sensitive-data-in-notifications-manifest.yml 包含两条 XML 规则rules: - id: mastg-android-sensitive-data-in-notifications-manifest languages: - xml severity: WARNING metadata: summary: This rule inspects AndroidManifest.xml for notification post permission. Notification may contain sensitive data. message: [MASVS-PLATFORM-3] Ensure that notifications do not contain sensitive information pattern: android:nameandroid.permission.POST_NOTIFICATIONS - id: mastg-android-minsdkversion languages: - xml severity: INFO metadata: summary: This rule inspects AndroidManifest.xml to obtain the minSdkVersion value. message: [MASVS-PLATFORM-3] Ensure that the minSdkVersion is evaluated for notification exposure on older Android versions pattern: android:minSdkVersion$X第一条命中POST_NOTIFICATIONS权限声明WARNING第二条提取minSdkVersion值INFO级别因为它的作用是获取评估所需的版本输入而非直接告警。执行步骤运行 Semgrep 规则MASTG 的演示统一通过 run.sh 执行静态扫描工具是 semgrep——一款可扫描 Java、Kotlin、Swift 等语言的静态代码扫描器NO_COLORtrue semgrep -c ../../../../rules/mastg-android-sensitive-data-in-notifications.yml ./MastgTest_reversed.java --text output.txt NO_COLORtrue semgrep -c ../../../../rules/mastg-android-sensitive-data-in-notifications-manifest.yml ./AndroidManifest_reversed.xml --text output2.txt命令要点扫描对象是还原后的MastgTest_reversed.java与AndroidManifest_reversed.xml模拟真实测试中拿到 APK → 反编译 → 对还原产物做静态分析的流程-c指定规则文件--text以纯文本格式输出NO_COLORtrue禁用 ANSI 颜色便于脚本化收集结果结果分别写入output.txt代码规则与output2.txt清单规则。实战提示真实项目中MastgTest_reversed.java对应的是用 jadx、apktool 等工具还原出的整个应用源码与 Manifest规则路径与扫描目标请按项目实际情况调整。观察结果解读规则命中在哪里代码扫描结果output.txt规则在还原后的 Java 代码中报告了4 处 Code Findings全部集中在 MastgTest_reversed.java┌─────────────────┐ │ 4 Code Findings │ └─────────────────┘ MastgTest_reversed.java ❯❱ rules.mastg-android-sensitive-data-in-notifications [MASVS-PLATFORM-3] Ensure that notifications do not contain sensitive information 41┆ Notification notificationBuild new Notification.Builder(this.context).setContentTitle(MASTG Test).setContentText(sensitiveString).build(); ⋮┆---------------------------------------- 41┆ Notification notificationBuild new Notification.Builder(this.context).setContentTitle(MASTG Test).setContentText(sensitiveString).build(); ⋮┆---------------------------------------- 48┆ Notification notificationBuild new Notification.Builder(this.context, TEST_CHANNEL_ID).setContentTitle(MASTG Test).setContentText(sensitiveString).build(); ⋮┆---------------------------------------- 48┆ Notification notificationBuild new Notification.Builder(this.context, TEST_CHANNEL_ID).setContentTitle(MASTG Test).setContentText(sensitiveString).build();与原文档观察一致2 处setContentTitle调用、2 处setContentText调用第 41 行与第 48 行各同时含标题与正文两个模式命中故 4 条。注意还原后的代码中setContentText(sensitiveString)参数来自反编译变量——它正是 Kotlin 源码中sensitiveText的还原形态内容即 PII 字符串。清单扫描结果output2.txt清单规则报告2 处 Findings┌─────────────────┐ │ 2 Code Findings │ └─────────────────┘ AndroidManifest_reversed.xml ❱ rules.mastg-android-minsdkversion [MASVS-PLATFORM-3] Ensure that the minSdkVersion is evaluated for notification exposure on older Android versions 11┆ android:minSdkVersion29 ❯❱ rules.mastg-android-sensitive-data-in-notifications-manifest [MASVS-PLATFORM-3] Ensure that notifications do not contain sensitive information 14┆ uses-permission android:nameandroid.permission.POST_NOTIFICATIONS/第 11 行minSdkVersion29INFO评估输入第 14 行POST_NOTIFICATIONS权限声明WARNING。评估与判定测试为何失败根据 MASTG-TEST-0315 的判定标准只要通知暴露了敏感数据并且满足以下任一条件即判定失败minSdkVersion为33 或更高且清单中声明了POST_NOTIFICATIONS权限或minSdkVersion为32 或更低无论是否声明该权限。本示例中还原代码第 41、48 行确认通知内容包含Hi John Doe名 姓属于 PII清单显示minSdkVersion29≤ 32。因此测试判定为失败test fails——即使不依赖权限声明条件29 这一低版本下限也足以构成泄露风险。为什么用 minSdkVersion 而不是 targetSdkVersion这是 MASTG-TEST-0315 专门解释的设计取舍minSdkVersion决定了应用可运行的最低 Android 版本代表应用可能运行的最不安全环境这才是真实暴露风险的边界targetSdkVersion只影响应用在新版本系统上的行为与平台限制的强制程度不会改变旧版本系统的行为。因此一个targetSdkVersion很高但minSdkVersion很低的应用仍必须按旧版本的安全保证或者说缺乏保证来评估。本示例minSdkVersion29正属于无论权限如何声明通知泄露都判定失败的区间。修复方向参考 MASTG-BEST-0027OWASP MASTG 为该场景提供了最佳实践条目 MASTG-BEST-0027Preventing Sensitive Data Exposure in Notifications其核心思路包括彻底避免在通知内容中放入敏感数据本示例即违背此原则若必须展示则设置适当的可见性级别visibility控制通知在锁屏等场景的显示粒度测试时还应结合 identify-sensitive-data 前置任务明确应用处理了哪些敏感数据类型以便对每个泄露点给出有依据的判定。小结一条可复制的检测链路通过 MASTG-DEMO-0078可以沉淀出检测通知泄露敏感数据的完整闭环还原对 APK 反编译得到 Java 源码与 AndroidManifest.xml参见示例中的 MastgTest_reversed.java 与 AndroidManifest_reversed.xml扫描用 semgrep 加载两条规则分别扫描代码setContentTitle/setContentText与清单POST_NOTIFICATIONS/minSdkVersion定位根据输出中的文件与行号本示例为第 41、48 行人工复核通知内容判定结合minSdkVersion与权限声明按 MASTG-TEST-0315 的失败条件得出结论修复对照 MASTG-BEST-0027 消除暴露或限制可见性。这套方法不依赖设备交互即可发现代码层面是否存在泄露通道是 MASVS-PLATFORM-3 合规评估中性价比最高的起点如需验证运行时真实展示效果可再配合真机/模拟器上的动态观察进行补充确认。赞分享文档教程网络安全【免费下载链接】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 最佳实践防止 Android 通知中的敏感数据泄露MASTG-BEST-0027OWASP MASTG 最佳实践防止 Android 通知中的敏感数据泄露MASTG BEST 0027 本指南基于 OWASP Mobile Appli文档教程网络安全OWASP MASTG 实战Android 内部存储明文敏感数据检测MASTG-DEMO-0010 / MASTG-TEST-0207OWASP MASTG 实战Android 内部存储明文敏感数据检测MASTG DEMO 0010 / MASTG TEST 0207 导读 本文以 OW文档教程网络安全OWASP MASTG 实战用 Semgrep 静态检测 Android StrictMode 使用MASTG-DEMO-0039OWASP MASTG 实战用 Semgrep 静态检测 Android StrictMode 使用MASTG DEMO 0039 导读 本文基于 OW文档教程网络安全创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考