资讯详情

资讯详情

通过用户界面泄露敏感数据的检测:Android 应用 UI 输入掩码与通知泄漏的静态与动态测试指南(MASTG-TEST-0008)

文档教程网络安全【免费下载链接】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 Mobile Application Security Testing GuideMASTG仓库中的测试用例 tests/android/MASVS-PLATFORM/MASTG-TEST-0008.md对应 MASVS v1 的 MSTG-STORAGE-7、MASVS v2 的 MASVS-PLATFORM-3现已弃用并由 MASTG-TEST-0316 与 MASTG-TEST-0315 取代系统讲解 Android 应用如何通过 UI 文本输入框与系统通知两条路径向用户界面泄露密码、PIN、OTP 等敏感数据并给出完整的静态分析与动态分析测试方法。读完本文你将掌握如何在 XML 与 Jetpack Compose 中识别未掩码的敏感输入框、如何定位与审查NotificationManager相关代码、如何利用 Semgrep 规则与 Frida 等工具完成源码级检测与运行时验证以及如何结合minSdkVersion与POST_NOTIFICATIONS权限正确评估通知泄漏的暴露面。说明MASTG 仓库中本文关联的原测试用例 MASTG-TEST-0008 在 V2 中已被标记为deprecated其功能分别由 MASTG-TEST-0316输入框掩码 与 MASTG-TEST-0315通知泄漏 承接本文在继承原测试步骤的基础上融合 V2 版测试与仓库内 Demo、Semgrep 规则作为纵深佐证。一、测试目标与威胁模型1.1 本测试覆盖什么该测试用例检查应用是否通过用户界面User Interface泄露敏感数据重点关注两类泄露面文本输入框Text Fields输入密码、PIN 等敏感信息时若EditText未启用掩码masking输入内容会以明文形式直接显示在屏幕上可被旁窥shoulder surfing、屏幕录制或投屏泄露系统通知App Notifications应用通过NotificationManager创建的通知若包含 PII姓名、邮箱、OTP、健康或财务数据会在锁屏界面、状态栏或通知抽屉中被他人看到同样构成 UI 层面的数据泄露。在 MASVS v1 中该用例编号为MSTG-STORAGE-7用户隐私保护类别属于 L1/L2 级别在 MASVS v2 中归入MASVS-PLATFORM-3平台交互安全仅在 L2 profile 下生效。1.2 为什么静态检查EditText与NotificationManagerUI 层的敏感数据泄露具有两个典型特征发生在展示层而非存储层数据本身可能从未落盘不触发数据存储类测试但会在输入与通知两个环节被明文暴露因此需要专门的 UI 审查既有静态特征又有运行时行为输入掩码与通知内容的敏感度判定依赖业务上下文该输入框是否承载密码、通知正文是否包含 PII单纯静态或单纯动态都难以覆盖必须静态定位 动态确认双管齐下。这也解释了为什么原测试文档把Static Analysis与Dynamic Analysis作为两个并列章节——前者负责定位代码位置后者负责验证实际运行时的暴露行为。二、静态分析定位 UI 中的敏感数据暴露点2.1 文本输入框Text Fields静态审查的第一步是逐一检查所有既能展示敏感信息、又能接收敏感信息输入的 UI 组件。对于 XML 视图体系关键是检查EditText的定义中是否包含掩码属性EditText android:inputTypetextPassword ... /android:inputTypetextPassword的作用是让输入内容以圆点dots代替实际字符显示从而防止密码或 PIN 在输入过程中明文显示在屏幕上。需要注意的等价/变体写法还包括android:inputTypenumberPassword适用于纯数字 PIN/验证码android:inputTypetextVisiblePassword显示明文密码的输入框属于高风险写法应标记为可疑android:digits与android:passwordtrue旧式写法效果等同于textPassword但已不推荐作为唯一的掩码依据。从仓库的静态检测规则看Android 源码中还存在通过setInputType(...)动态设置输入类型的情况rules/mastg-android-keyboard-cache-input-types.yml 中的mastg-android-non-caching-input-types规则会扫描所有setInputType()调用用于检查输入框的键盘缓存与输入类型配置可在审查时一并覆盖rules: - id: mastg-android-non-caching-input-types severity: WARNING languages: - java metadata: summary: This rule scans all usages of setInputType(). message: [MASVS-STORAGE] Set input type detected ($OBJ) with $ARG patterns: - pattern: $OBJ.setInputType($ARG)Jetpack Compose 场景V2 测试的补充原文档仅覆盖 XMLEditTextV2 的 MASTG-TEST-0316 将掩码检查扩展到 Jetpack Compose 体系现代 Compose 应用应使用SecureTextField其textObfuscationMode参数默认值为TextObfuscationMode.RevealLastTyped即只明文显示最后一个键入字符其余以掩码显示开发者无需显式配置即可获得基本的防旁窥保护也可以显式指定TextObfuscationMode.Hidden达到完全隐藏关键风险点即使默认或显式配置了RevealLastTyped/Hidden代码仍可在运行时将其改为TextObfuscationMode.Visible因此静态审查必须同时检查是否存在此类程序化修改。SecureTextField( // textObfuscationMode 默认值为 TextObfuscationMode.RevealLastTyped textObfuscationMode TextObfuscationMode.RevealLastTyped, // 或 TextObfuscationMode.Hidden ... )判定失败条件来自 MASTG-TEST-0316 的 Evaluation 章节承载访问码密码/PIN或验证码OTP的输入字段使用TextField未掩码SecureTextField被显式配置为TextObfuscationMode.Visible。预期漏报Expected False Negatives如果应用使用自定义输入控件自定义 UI 框架、游戏引擎等而不依赖标准TextField/SecureTextField类本测试可能产生漏报需要结合人工逆向审查。2.2 应用通知App Notifications静态评估的第二条主线是通知建议在反编译代码中搜索NotificationManager类的使用它是应用进行通知管理创建、发布、取消通知的标志。一旦确认使用了该类下一步是理解应用如何生成通知即追踪通知内容的来源与组装过程重点关注以下 API 的调用点Notification.Builder.setContentTitle(...)/setContentText(...)NotificationCompat.Builder.setContentTitle(...)/setContentText(...)这些代码位置可直接馈入下文动态分析章节为运行时挂接与追踪提供精确锚点。仓库已内置两条与通知相关的 Semgrep 检测规则可直接用于批量扫描rules/mastg-android-sensitive-data-in-notifications.yml —— 在 Java/Kotlin 代码中匹配所有setContentTitle/setContentText调用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(...)rules/mastg-android-sensitive-data-in-notifications-manifest.yml —— 检查AndroidManifest.xml中是否声明POST_NOTIFICATIONS运行时权限Android 13 / API 33 及以上发布通知的必要条件同时读取minSdkVersion以评估旧版本系统上的通知暴露风险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$X2.3 静态分析的关键工具与配套技术在原测试文档中静态定位依赖人工代码审查V2 测试则将定位流程标准化为一系列 MASTG 技术条目可直接复用目的对应技术说明逆向反编译应用MASTG-TECH-0013使用 jadx 等工具将 APK 反编译为可读 Java 代码搜索相关 APIMASTG-TECH-0014在反编译产物中定位EditText、NotificationManager等 API 调用点审查反编译代码MASTG-TECH-0023在 jadx-gui 中浏览、重命名并追溯类与方法调用链判断字段是否承载敏感数据提取 AndroidManifest.xmlMASTG-TECH-0117从 APK 中提取 Manifest获取 minSdkVersionMASTG-TECH-0150从 Manifest 读取最低 SDK 版本获取权限声明MASTG-TECH-0126检查相关权限如POST_NOTIFICATIONS其中 MASTG-TECH-0023 的核心方法论是在反编译代码中逐步为混淆的类名、方法名做语义标注如把a.a重命名为Validator.check_input并沿调用链追溯数据流向直至确认某 UI 组件是否处理敏感数据——这一方法同样适用于判断输入框掩码与通知内容的敏感度。三、动态分析在运行时验证 UI 数据泄露静态分析只能证明存在泄露的可能性动态分析则在真实设备或模拟器上验证是否真的泄露。3.1 文本输入框运行应用逐一操作所有可输入组件观察输入敏感信息密码、PIN、OTP时的屏幕表现如果字符被替换为星号asterisks或圆点dots显示则说明应用对输入做了掩码处理没有向 UI 泄露数据如果输入内容以明文显示则判定存在 UI 数据泄露结合静态分析定位到的输入框代码位置出具证据。补充验证点切换输入法、旋转屏幕、锁屏/解锁后重新聚焦输入框确认掩码在视图重建后依然生效同时检查是否存在TextObfuscationMode.Visible之类的运行时修改逻辑。3.2 应用通知动态阶段需要走完整条应用及所有可用功能寻找一切可能触发通知的路径。要点在于部分通知只有在应用外部完成特定操作后才会触发例如收到推送消息、第三方登录回调、后台任务完成等因此测试时不能只停留在应用主界面还需主动模拟外部事件运行期间建议对通知创建相关函数进行运行时追踪tracing例如通过 Frida 挂接NotificationCompat.Builder的setContentTitle、setContentText方法观察每次调用传入的参数并在测试结束后汇总追踪日志评估其中是否包含敏感信息。追踪的目标调用链示例对应 MASTG-DEMO-0078 中反编译后的 Java 形态Notification notificationBuild new Notification.Builder(this.context) .setContentTitle(MASTG Test) .setContentText(sensitiveString) // 追踪点确认 sensitiveString 是否含 PII/OTP .build();四、仓库实例通知泄漏 Demo 的完整检测闭环MASTG 仓库在 demos/android/MASVS-PLATFORM/MASTG-DEMO-0078 提供了一个与通知泄漏直接对应的可复现实例对应 V2 测试 MASTG-TEST-0315完整演示了从静态规则扫描到人工评估的检测闭环。4.1 漏洞样本代码Demo 的 Kotlin 源码 MastgTest.kt 构造了四种通知创建方式均把包含 PII 的字符串写入通知标题与正文Notification.Builder无通知渠道Notification.Builder 通知渠道NotificationChannelNotificationCompat.BuilderAndroidX 兼容版NotificationCompat.Builder 通知渠道其中敏感数据被硬编码为Hi John Doe与Hi John Doe - This is a sensitive string containing PII并通过setContentTitle(sensitiveTitle)/setContentText(sensitiveText)注入通知同时使用NotificationManager.notify(...)发布 4 条通知。样本还要求AndroidManifest.xml声明POST_NOTIFICATIONS运行时权限Android API 33 及以上。真机执行前置条件需确保应用已被授予POST_NOTIFICATIONS权限可通过 ADB 命令授予adb shell pm grant org.owasp.mastestapp android.permission.POST_NOTIFICATIONS或者在设备上进入应用设置手动开启通知权限。4.2 用仓库内置 Semgrep 规则扫描按 Demo 步骤对反编译得到的 Java 代码运行 rules/mastg-android-sensitive-data-in-notifications.yml再对样本 Manifest 运行 rules/mastg-android-sensitive-data-in-notifications-manifest.yml。实际输出见 output.txt共产生4 条代码级发现┌─────────────────┐ │ 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();规则精确命中了setContentTitle与setContentText的调用位置文件 行号同时 Manifest 规则定位了POST_NOTIFICATIONS权限声明。4.3 评估结论结合 MASTG-TEST-0315 的评估标准该 Demo测试失败通知内容包含姓名PII等敏感数据且满足以下任一暴露条件minSdkVersion 33且 Manifest 中声明了POST_NOTIFICATIONS权限或minSdkVersion 32无论是否声明该权限。为什么用minSdkVersion而非targetSdkVersionMASTG-TEST-0315 中的权威解释minSdkVersion决定了应用可运行的最低 Android 版本用它评估可覆盖应用能够运行的最不安全环境即真实暴露风险targetSdkVersion只影响应用在新版本系统上的行为以及系统对新平台限制的强制程度不会改变旧版本 Android 的行为。因此一个targetSdkVersion很高但minSdkVersion很低的 App仍必须按旧版本的安全保障水平来评估。五、测试步骤汇总与输出物综合 V1 原测试与 V2 承接测试一次完整的UI 敏感数据泄露检测可按以下步骤执行使用 MASTG-TECH-0013 逆向反编译应用使用 MASTG-TECH-0014 在反编译代码中搜索EditText输入框、SecureTextField、NotificationManager、setContentTitle/setContentText等关键 API使用 MASTG-TECH-0117 与 MASTG-TECH-0150 获取AndroidManifest.xml中的minSdkVersion使用 MASTG-TECH-0126 获取POST_NOTIFICATIONS权限声明运行仓库内置规则 mastg-android-sensitive-data-in-notifications.yml 与 mastg-android-sensitive-data-in-notifications-manifest.yml 做批量静态扫描对每条静态发现使用 MASTG-TECH-0023 沿调用链追溯判断该输入框是否承载访问码/验证码、通知内容是否包含敏感数据动态运行应用验证输入掩码是否生效并通过 Frida 等工具追踪通知构建 API 的实参最终结合minSdkVersion与权限声明给出通过与失败的评估结论。输出物应包含承载访问码/验证码的输入字段位置清单含文件、行号、掩码配置POST_NOTIFICATIONS权限声明情况与minSdkVersion值通知 API 调用位置清单每处 UI 暴露点的最终评估字段是否掩码、通知内容是否含敏感数据PII、OTP、健康或财务信息。六、从 V1 到 V2测试演进的启示对比 MASTG-TEST-0008V1与 V2 的 MASTG-TEST-0316 / MASTG-TEST-0315可以观察到 MASTG 在UI 敏感数据泄露这一主题上的三个演进方向从人工审查到规则化扫描V1 依赖测试者人工搜索代码V2 与仓库 rules 目录下的 Semgrep 规则配合输出可定位到文件行号的确定性发现从单一 XML 视图到 Compose 全覆盖V1 只检查EditText的inputTypeV2 新增 Jetpack Compose 的SecureTextField/TextObfuscationMode检查并明确列出失败条件与预期漏报场景从有无泄露到暴露面量化V1 对通知仅要求评估内容是否敏感V2 引入minSdkVersion与POST_NOTIFICATIONS权限作为判定前提使是否泄露的结论与应用的系统版本暴露面严格挂钩评估结果更可复现、可仲裁。对于正在实施 MASVS-PLATFORM-3L2 profile合规测试的团队建议直接采用 V2 测试用例 仓库内置规则 MASTG-DEMO-0078 复现链路在 CI 中固化输入掩码与通知内容两类检查从源头杜绝 UI 层敏感数据泄露。赞分享文档教程网络安全【免费下载链接】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-TEST-0315OWASP MASTG 实战Android 通知敏感数据泄露测试MASTG TEST 0315 本文基于 OWASP MASTGMobile Appli文档教程网络安全用 OWASP MASTG 检测 Android 通知中的敏感数据泄露MASTG-DEMO-0078 静态分析实战用 OWASP MASTG 检测 Android 通知中的敏感数据泄露MASTG DEMO 0078 静态分析实战 导读 通知Notification是文档教程网络安全iOS 应用日志 API 敏感数据泄露静态检测实战MASTG-TEST-0297 测试指南iOS 应用日志 API 敏感数据泄露静态检测实战MASTG TEST 0297 测试指南 导读 本指南围绕 OWASP MASVS STORAGE 类别下的文档教程网络安全上一篇strands-agents Python SDK v1.33.0 解析摘要式上下文管理修复、Swarm 测试稳定性与 LiteLLM 供应链安全加固下一篇swagger-codegen 保留字模型生成实战以 C Petstore 的 Return 模型为例解读 C 客户端中保留字与命名的处理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →