尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
使用 Semgrep 检测 Android 应用中的非随机源(Non-random Sources):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),仅供参考
RELATED

相关推荐

Webots Supervisor 教程:用机器人上帝视角操控仿真世界(移动、生成、追踪与变色全实战)

Webots Supervisor 教程:用机器人上帝视角操控仿真世界(移动、生成、追踪与变色全实战)

科研自动驾驶物理引擎 【免费下载链接】webots Webots Robot Simulator 项目地址: https://gitcode.com/gh_mirrors/web/webots 点击查看 免费下载 Webots 中的 Supervisor 是一个"拥有特殊权限的机器人":它既能像普通 Robot 一样驱动设备、运…

📅 2026/10/6 12:10:43
docker-selenium 4.30.0 的 Edge 122 镜像发布实录:从版本探测到多级标签矩阵的完整机制解析

docker-selenium 4.30.0 的 Edge 122 镜像发布实录:从版本探测到多级标签矩阵的完整机制解析

测试后端云原生容器编排可观测性 【免费下载链接】docker-selenium Provides a simple way to run Selenium Grid with Chrome, Firefox, and Edge using Container Platform, making it easier to perform browser automation at scale 项目地址: https://gitcode.…

📅 2026/10/6 12:10:43
攻击溯源与应急响应系统设计:从日志分析到处置闭环实战指南

攻击溯源与应急响应系统设计:从日志分析到处置闭环实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/6 12:05:43
MORE NEWS

更多资讯

📰

数字人直播频繁弹窗网络状态不佳?从网络诊断到推流优化全排查

最近不少使用安东星做数字人直播的朋友反馈同一个问题:打开客户端、准备开播或者推流的过程中,页面弹出“网络状态不佳”的提示,然后直播间画面卡住、素材加载失败、数字人无法正常驱动。这个提示本身没有给出详细的错误码,也没有…

📰

WinForms并发任务最佳实践:Parallel.For+SemaphoreSlim+Timer组合

做WinForms开发的人,迟早会碰到这么一类需求:界面上点一个按钮,后台要处理大批量数据,界面不能卡死,进度还得实时可见。我以前接手过一个导入工具,数据量小的时候一切正常,量一大就出现两个问题…

📰

深度实测:如何将论文AIGC检测率从99.8%降至6.7%

2026年3月,我把自己熬了四个多月的论文初稿第一次送进AIGC检测系统,页面加载完的那一刻我盯着屏幕上的数字愣了很久:99.8%。也就是说,在系统眼里,这篇论文几乎没有一个句子像是人写的。接下来的两周,我一边…

📰

产线级实时SPC系统设计与实现:从Modbus采集到控制图告警

简介:本资源是一套面向高校自动化、工业工程及质量管理专业学生的毕业设计项目,聚焦于统计过程控制(SPC)在制造业质量监控中的落地实践,旨在帮助学习者构建具备数据采集、实时分析、可视化预警能力的在线质量分析系统。…

📰

U盘系统盘制作全指南:镜像选择、工具对比与引导兼容

做系统盘这件事,听起来好像只属于电脑修理店和装机老手,但你真碰到一次电脑无法启动,或者 C 盘已经爆红到只剩几百兆,就知道手里有一张靠谱的系统安装盘有多重要。这篇文章想聊的,就是怎么从零开始把 U 盘制作成能装系…

📰

逻辑回归鸢尾花分类实战:训练、评估与避坑指南

简介:这是一份基于Python语言实现逻辑回归鸢尾花分类的机器学习大作业资源,面向期末大作业、课程设计或初学者入门实践场景。资源包含带详细注释的完整项目源码、实验报告及文档说明,覆盖数据加载、特征处理、模型训练、分类评估等关键环节&a…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬