:OWASP MASTG-DEMO-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通过一系列可复现的 Demo 演示移动应用安全测试的具体手法。本文以 MASTG-DEMO-0008 为骨架完整讲解如何在 Android 应用中用静态分析工具 semgrep 检测使用非随机源生成随机值这一高危密码学缺陷从漏洞样本代码、semgrep 规则原理、命令行运行方式到扫描结果的解读与人工复核流程帮助读者掌握一套可复制到真实项目中的静态安全测试SAST实操方案。读完本文你将能够独立编写并运行针对new Date()、System.currentTimeMillis()、Calendar.get(...)等非随机源的 semgrep 检测规则并能结合 MASTG 测试用例流程对告警做安全相关性人工研判。Demo 背景为什么非随机源是密码学弱点MASTG-DEMO-0008 属于 MASTG 中 MASVS-CRYPTO 类别移动应用密码学要求下的演示用例其关联的测试用例为 MASTG-TEST-0205Non-random Sources Usage。该测试用例指出Android applications sometimes use non-random sources to generate random values, leading to potential security vulnerabilities. Common practices include relying on the current time, such asDate().getTime(), or accessingCalendar.MILLISECONDto produce values that are easily guessable and reproducible.问题本质在于时间戳、日历字段等值具有高度可预测性。若开发者在生成加密密钥、初始化向量IV、nonce、认证令牌authentication token、会话标识session identifier、密码或 PIN 时使用了这类伪随机来源攻击者只需掌握生成时间或算法规律就能推算出这些值从而绕过认证或解密敏感数据。这与 MASTG 知识库中的 MASTG-KNOW-0013Random Number Generation一脉相承密码学需要安全的伪随机数生成器PRNG标准 Java 类如java.util.Random及时间来源无法提供足够的随机性可能导致攻击者猜出下一个生成值正确做法是使用SecureRandom的默认无参构造器其底层由 AndroidOpenSSL/Conscrypt 提供的SHA1PRNG实现并遵循最佳实践 MASTG-BEST-0001Use a cryptographically secure pseudorandom number generator as provided by the platform or programming language you are using.。MASTG-DEMO-0008 正是通过一个精心构造的恶意样本演示如何用 semgrep 自动定位这类非随机源代码位置。样本代码故意埋入的非随机随机数Demo 的核心样本为 MastgTest.kt原始 Kotlin 代码如下package org.owasp.mastestapp import android.content.Context import java.util.Calendar import java.util.Date class MastgTest (private val context: Context){ fun mastgTest(): String { // SUMMARY: This sample demonstrates different ways of creating non-random tokens in Java. // FAIL: [android-insecure-random-use] The app uses Date().time for generating authentication tokens. val random1 Date().time.toInt() val c Calendar.getInstance() // FAIL: [android-insecure-random-use] The app uses Calendar.getInstance().timeInMillis for generating authentication tokens. val random2 c.get(Calendar.MILLISECOND) return Generated random numbers:\n$random1 \n$random2 } }样本在mastgTest()方法中故意使用两种非随机源生成随机数Date().time.toInt()取当前时间戳并截断为Int用于生成认证令牌Calendar.getInstance()后调用c.get(Calendar.MILLISECOND)取出当前时间的毫秒字段同样用于生成认证令牌。代码注释中的FAIL: [android-insecure-random-use]明确标注了这两处是预期被检测出的漏洞点。注意两点实践细节这类时间来源生成的随机数随运行时刻变化攻击者只要知道大致生成时间就能大幅缩小猜测范围不具备密码学所需的不可预测性样本同时演示了令牌/安全值生成逻辑被塞进普通方法的典型反模式这正是后续人工研判时需要关注安全相关性的原因。逆向视角Kotlin 反编译后的 Java 形态MASTG 的静态分析通常作用在逆向产物而非原始源码上因此 Demo 提供了反编译版本 MastgTest_reversed.java。该文件是 Kotlin 字节码反编译含Metadata注解与Intrinsics检查后的 Java 代码核心方法如下public final String mastgTest() { int random1 (int) new Date().getTime(); Calendar c Calendar.getInstance(); int random2 c.get(14); return Generated random numbers:\n random1 \n random2; }关键观察点Date().time.toInt()被还原为(int) new Date().getTime()c.get(Calendar.MILLISECOND)被还原为c.get(14)——Calendar.MILLISECOND是编译期常量值为 14。这意味着在反编译/去混淆后的代码中常量字段名可能被数值替换扫描规则需要具备对这种形态的识别能力本 Demo 规则通过(Calendar $C).get(...)匹配.get(...)调用本身来覆盖这一点反编译产物中import java.util.Calendar;、import java.util.Date;依然保留是 semgrep 能够跨文件识别类型的基础。Semgrep 规则原理MASTG 官方非随机源检测规则MASTG 为这一检测场景提供了现成的 semgrep 规则文件 rules/mastg-android-non-random-use.yml完整内容如下rules: - id: mastg-android-non-random-use severity: WARNING languages: - java metadata: summary: This rule looks for common patterns including classes and methods that represent non-random sources e.g. via Calendar.MILLISECOND or new Date(). original_source: https://github.com/mindedsecurity/semgrep-rules-android-security/blob/main/rules/crypto/mstg-crypto-6.yaml message: [MASVS-CRYPTO-1] The application makes use of non-random sources. pattern-either: - patterns: - pattern-inside: $M(...){ ... } - pattern-either: - pattern: new Date() - pattern: System.currentTimeMillis() - pattern: (Calendar $C).get(...)逐项拆解该规则的检测逻辑配置项值作用idmastg-android-non-random-use规则唯一标识会出现在扫描结果中severityWARNING告警级别非随机源本身是风险信号是否构成漏洞取决于具体用途安全相关性languagesjava作用于 Java 语言代码对反编译产物、Java 源码均有效message[MASVS-CRYPTO-1] The application makes use of non-random sources.输出到告警信息的说明直接关联 MASVS-CRYPTO-1 要求pattern-either三类子模式命中任一模式即告警核心是pattern-either中的三种非随机源模式new Date()直接匹配java.util.Date的无参构造调用System.currentTimeMillis()匹配系统当前毫秒时间获取调用(Calendar $C).get(...)匹配对任意Calendar实例调用get()方法——这是为了覆盖Calendar.getInstance()之后的各种字段读取如MILLISECOND、SECOND、MINUTE等。同时外层用pattern-inside: $M(...){ ... }将匹配限定在方法体内部避免误报类字段初始化等非方法上下文的用法。pattern-either与内层pattern-either的嵌套实际表达的是在任意方法内若出现new Date()或System.currentTimeMillis()或(Calendar $C).get(...)三者中任意一种即触发告警。metadata.summary还给出了规则的语义说明并标注了该规则源自社区 semgrep 规则集mindedsecurity/semgrep-rules-android-security中的mstg-crypto-6.yaml便于追踪规则血缘。从源码结构看MASTG 将这类规则统一存放在仓库 rules 目录下如mastg-android-non-random-use.yml、mastg-android-non-random-use相关规则体系供各 Demo 直接引用形成规则即文档、规则可复用的测试资产模式。运行步骤用 Semgrep 扫描反编译代码Demo 的 run.sh 给出了标准的命令行调用方式NO_COLORtrue semgrep -c ../../../../rules/mastg-android-non-random-use.yml ./MastgTest_reversed.java output.txt命令分解NO_COLORtrue禁用 semgrep 输出的 ANSI 颜色码便于将结果重定向到文件或接入 CI 日志semgrep扫描器本体MASTG-TOOL-0110 将其定位为能够扫描 Java、Kotlin 和 Swift 的静态代码扫描器-c ../../../../rules/mastg-android-non-random-use.yml指定规则配置文件路径从 Demo 目录向上四级到达仓库根目录rules/下./MastgTest_reversed.java扫描目标——注意这里是反编译后的 Java 文件而非原始 Kotlin 源码体现了真实安全测试拿 APK 逆向产物做静态分析的工作流 output.txt把扫描报告写入 output.txt。前置条件安装 semgrep参考 MASTG-TOOL-0110 对应的 semgrep 官方安装方式如pip install semgrep或各包管理器发行版若从零分析一个 APK通常先按 MASTG-TECH-0013Reverse Engineering Android Apps对 APK 进行反编译得到可供扫描的 Java 代码对反编译代码做静态分析时可进一步参考 MASTG-TECH-0014Static Analysis on Android了解通用方法论——该技术页明确以 grep 与 semgrepMASTG-TOOL-0110为静态分析工具示例并演示了如何用 semgrep 检测new SecureRandom($SEED)这类确定性种子用法。由于 Demo 中run.sh的规则路径是相对 Demo 目录的../../../../rules/...在实际项目中复用时请将规则路径调整为你的工作目录结构亦可在仓库根目录直接执行semgrep -c rules/mastg-android-non-random-use.yml demos/android/MASVS-CRYPTO/MASTG-DEMO-0008/MastgTest_reversed.java观察结果命中报告解读运行上述命令后得到的 output.txt 内容如下┌─────────────────┐ │ 2 Code Findings │ └─────────────────┘ MastgTest_reversed.java ❯❱ rules.mastg-android-non-random-use [MASVS-CRYPTO-1] The application makes use of non-random sources. 22┆ int random1 (int) new Date().getTime(); ⋮┆---------------------------------------- 24┆ int random2 c.get(14);报告解读要点命中数量共 2 处 Code Findings与样本中故意埋入的 2 处非随机源一一对应命中规则rules.mastg-android-non-random-use即上文分析的规则 ID告警消息[MASVS-CRYPTO-1] The application makes use of non-random sources.与规则message字段一致直接对应 MASVS-CRYPTO-1密码学实现正确性精确行号定位第 22 行int random1 (int) new Date().getTime();——命中new Date()模式第 24 行int random2 c.get(14);——命中(Calendar $C).get(...)模式且证实了前文推断Calendar.MILLISECOND反编译后成为字面量14规则通过匹配get(...)调用而非常量名保证了在常量被内联后依然有效。这个输出正是 MASTG-TEST-0205 中Observation所要求的形态The output should contain a list of locations where non-random sources are used.——即产出非随机源使用位置的清单供测试人员逐一定位与后续处置。评估阶段对命中点做安全相关性人工研判MASTG-DEMO-0008 的最后一步是 Review each of the reported instances逐一审查每个报告实例这一步对应 MASTG-TEST-0205 的 Evaluation 逻辑The test case fails if you can find security-relevant values, such as passwords or tokens, generated using non-random sources.也就是说静态规则只负责找位置是否构成漏洞测试失败取决于这些位置是否用于安全相关目的。测试用例给出的人工复核流程如下使用 MASTG-TECH-0023Reviewing Decompiled Java Code逐一检查每个被报告的位置判断生成的值是否用于安全相关用途例如生成加密密钥cryptographic keys生成初始化向量 IVinitialization vectors生成nonce生成认证令牌authentication tokens生成会话标识session identifiers生成密码或 PINpasswords or PINs。套用到本 Demo样本代码注释明确写道generating authentication tokens即random1、random2被用于生成认证令牌属于安全相关用途。因此如果这是真实应用代码测试结论应为失败——存在使用非随机源生成安全敏感值的漏洞攻击者可预测令牌值。若命中的位置仅用于 UI 展示、动画随机偏移、A/B 分流等非安全场景则规则告警可视为误报/低风险无需修复——这正是severity: WARNING而非ERROR的原因也是静态扫描 人工研判组合的意义所在。修复方向与最佳实践确认漏洞后修复方向遵循 MASTG-BEST-0001 与 MASTG-KNOW-0013 的指导使用SecureRandom默认无参构造器替代一切时间/日历来源例如import java.security.SecureRandom; SecureRandom secureRandom new SecureRandom(); byte[] token new byte[32]; secureRandom.nextBytes(token);避免向SecureRandom传入确定性种子如new SecureRandom(seed)除非种子来源本身具备足够熵关注低版本兼容性若应用需支持 Android 4.4API level 19以下的系统需注意 Android 4.1–4.3API 16–18上 PRNG 初始化缺陷的历史问题详见 MASTG-KNOW-0013 中引用的官方说明在初始化阶段做额外加固建立回归防线将 mastg-android-non-random-use.yml 这类规则接入 CI让new Date()、System.currentTimeMillis()、Calendar.get(...)出现在安全敏感路径时能被自动拦截再配合人工 review 判定安全相关性。总结从 Demo 到可复用的检测能力MASTG-DEMO-0008 演示了一条完整的漏洞样本 → 静态规则 → 命令行扫描 → 结果解读 → 人工研判链路样本MastgTest.kt与反编译产物MastgTest_reversed.java展示了非随机源的典型写法及其逆向形态规则mastg-android-non-random-use.yml用pattern-either精准覆盖new Date()、System.currentTimeMillis()、(Calendar $C).get(...)三类模式命令run.sh演示了 semgrep 的标准调用方式输出output.txt证明规则在反编译代码上稳定命中两处漏洞点研判对照 MASTG-TEST-0205明确了非随机源 安全相关用途 测试失败的判定标准。这套方法完全可以直接迁移到真实项目把规则文件引入你的扫描配置针对反编译代码或源码库执行 semgrep再按安全相关性分级处置告警即可将 MASTG 的密码学检测能力落地为可持续运行的自动化防线。赞分享文档教程网络安全【免费下载链接】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点击查看免费下载相关推荐DiT 文档图像 Transformer 在 FUNSD 文本检测任务上的微调实战Mask R-CNN 全流程指南DiT 文档图像 Transformer 在 FUNSD 文本检测任务上的微调实战Mask R CNN 全流程指南 导读 本文围绕 dit/text_dete文档教程网络安全OWASP MASTG Android 最佳实践在生产构建中禁用 WebView 调试MASTG-BEST-0008 深度解析OWASP MASTG Android 最佳实践在生产构建中禁用 WebView 调试MASTG BEST 0008 深度解析 本文基于 OWASP MA文档教程网络安全OWASP MASTG 最佳实践iOS 应用如何正确使用安全随机数生成器CSPRNG API 选型与检测指南OWASP MASTG 最佳实践iOS 应用如何正确使用安全随机数生成器CSPRNG API 选型与检测指南 随机数是密钥生成、初始化向量IV、non文档教程网络安全上一篇Docker容器资源限制完全指南下一篇神经反馈可视化技术揭秘NeuroLab Android频谱图与记忆图谱解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考