ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

使用 semgrep 静态扫描 Android 应用中不安全的对称加密算法:OWASP MASTG 的 MASVS-CRYPTO-1 实战演示

使用 semgrep 静态扫描 Android 应用中不安全的对称加密算法:OWASP MASTG 的 MASVS-CRYPTO-1 实战演示 文档教程网络安全【免费下载链接】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仓库中的演示用例 MASTG-DEMO-0022 为主线完整演示如何用 semgrep 静态扫描 Kotlin/Java 代码中的 DES、3DES、RC4、Blowfish 等不安全对称加密算法并解读规则文件、反编译代码与扫描输出之间的关系。读完本文你将掌握一条可复用的「漏洞样本 → 静态分析规则 → 反编译验证 → 扫描取证」的完整链路可直接用于 Android 应用安全测试中的 MASVS-CRYPTO-1对称加密安全性检测。背景为什么要检测破损的对称加密算法OWASP Mobile Application Security Verification StandardMASVS的MASVS-CRYPTO-1要求验证 App 是否使用了密码学上安全的对称加密算法、密钥与填充方案。在 MASTG V2 体系中这条需求由 MASTG-TEST-0013已标记为 deprecated的继承者MASTG-TEST-0221覆盖而MASTG-DEMO-0022正是为MASTG-TEST-0221提供的可复现演示。DES56 位有效密钥、3DES/DESede有效安全强度仅约 112 位且已被 Sweet32 生日攻击削弱、RC4存在严重统计偏差已被 TLS 社区全面弃用、Blowfish64 位分组过小、易受生日攻击均属于公认的不安全算法。Android 的Cipher.getInstance仍允许直接以这些算法名实例化加密器因此这类代码在真实应用尤其是历史遗留代码中并不罕见静态扫描是发现它们的最高效手段。演示样本Kotlin 源码中的四种漏洞实现演示样本位于 demos/android/MASVS-CRYPTO/MASTG-DEMO-0022/MastgTest.kt是一个名为MastgTest的 Kotlin 类包名org.owasp.mastestapp。它刻意实现了四个典型反模式方法每个方法都完整覆盖了生成弱密钥 → 初始化 Cipher → 加密 → Base64 输出的完整链路DES56 位有效密钥 已废弃算法fun vulnerableDesEncryption(data: String): String { try { // Insufficient key length for DES val keyBytes ByteArray(8) SecureRandom().nextBytes(keyBytes) val keySpec DESKeySpec(keyBytes) val keyFactory SecretKeyFactory.getInstance(DES) val secretKey: Key keyFactory.generateSecret(keySpec) // Broken encryption algorithm (DES) val cipher Cipher.getInstance(DES) cipher.init(Cipher.ENCRYPT_MODE, secretKey) val encryptedData cipher.doFinal(data.toByteArray()) return Base64.encodeToString(encryptedData, Base64.DEFAULT) } catch (e: Exception) { return Encryption error: ${e.message} } }注意这里的问题点不止算法本身DES 的密钥只有 8 字节64 位其中 8 位为校验位有效强度仅 56 位代码注释也明确标注了Insufficient key length for DES。3DES / DESede名义 168 位、实际强度不足fun vulnerable3DesEncryption(data: String): String { try { val keyBytes ByteArray(24) SecureRandom().nextBytes(keyBytes) val keySpec DESedeKeySpec(keyBytes) val keyFactory SecretKeyFactory.getInstance(DESede) val secretKey: Key keyFactory.generateSecret(keySpec) val cipher Cipher.getInstance(DESede) cipher.init(Cipher.ENCRYPT_MODE, secretKey) ... } catch (e: Exception) { return Encryption error: ${e.message} } }3DES 使用 24 字节密钥但通过密钥分离攻击其实际安全强度远低于名义值属于看起来很强、实际已过时的典型样本。RC4 / ARCFOUR已废弃的流密码fun vulnerableRc4Encryption(data: String): String { return try { val keyBytes ByteArray(16) SecureRandom().nextBytes(keyBytes) val secretKey SecretKeySpec(keyBytes, RC4) val cipher Cipher.getInstance(RC4) cipher.init(Cipher.ENCRYPT_MODE, secretKey) ... } catch (e: Exception) { Encryption error: ${e.message} } }RC4 通过SecretKeySpec直接构造密钥而非SecretKeyFactory这也是扫描时需要覆盖的另一种密钥构造路径。Blowfish64 位分组 8 字节弱密钥fun vulnerableBlowfishEncryption(data: String): String { return try { // Insufficient key length for Blowfish val keyBytes ByteArray(8) // Only 8 bytes (64-bit key) - not secure SecureRandom().nextBytes(keyBytes) val secretKey: SecretKey SecretKeySpec(keyBytes, Blowfish) val cipher Cipher.getInstance(Blowfish) cipher.init(Cipher.ENCRYPT_MODE, secretKey) ... } catch (e: Exception) { Encryption error: ${e.message} } }Blowfish 支持 32448 位可变密钥但本例只给了 64 位8 字节源码注释明确标注not secure。汇总入口方法mastgTest()依次调用上述四个方法对敏感字符串Hello from the OWASP MASTG Test app.加密并把四段密文拼成一行返回——这一步让整个类在运行时也能直观地暴露同一份数据被四种弱算法加密的事实fun mastgTest(): String { val sensitiveString Hello from the OWASP MASTG Test app. val desEncryptedString vulnerableDesEncryption(sensitiveString) val tripleDesEncryptedString vulnerable3DesEncryption(sensitiveString) val rc4EncryptedString vulnerableRc4Encryption(sensitiveString) val blowfishEncryptedString vulnerableBlowfishEncryption(sensitiveString) return DES Encrypted: $desEncryptedString\n3DES Encrypted: $tripleDesEncryptedString\nRC4 Encrypted: $rc4EncryptedString\nBlowfish Encrypted: $blowfishEncryptedString }扫描规则一条正则锁定四种算法MASTG 仓库为这条检测提供了开箱即用的 semgrep 规则文件 rules/mastg-android-broken-encryption-algorithms.yamlrules: - id: mastg-android-broken-encryption-algorithms languages: - java severity: WARNING metadata: summary: This rule looks for broken encryption algorithms. message: [MASVS-CRYPTO-1] Broken encryption algorithms found in use. pattern-regex: Cipher\.getInstance\(?(DES|DESede|RC4|Blowfish)(/[A-Za-z0-9](/[A-Za-z0-9])?)??\)对这条规则做逐段拆解能帮你将来自定义同类规则片段含义Cipher\.getInstance\(匹配 Android/JCE 的 Cipher 工厂方法调用\.转义避免匹配任意字符?算法名可选地被双引号包裹兼容字符串字面量写法(DES\|DESede\|RC4\|Blowfish)命中四种不安全算法的任意一种(/[A-Za-z0-9](/[A-Za-z0-9])?)?可选匹配/transformation后缀如DES/CBC/PKCS5Padding中的模式和填充?\)收尾引号与右括号关键点pattern-regex是纯正则匹配因此它不要求Cipher.getInstance的参数是字面量——只要源码文本中出现Cipher.getInstance(DES)、Cipher.getInstance(DESede/CBC/PKCS5Padding)等形态即可命中。规则针对 Java 语言languages: [java]而反编译产物恰恰是 Java这正是演示中选择先反编译再扫描的原因。severity: WARNING与消息[MASVS-CRYPTO-1] Broken encryption algorithms found in use.让扫描结果可以直接对应到 MASVS 需求编号。执行步骤反编译 semgrep 扫描演示文档给出的完整流程是先对 APK 进行反编译如使用 MASTG-TECH-0017 描述的技术与 MASTG-TOOL-0018 工具得到 Java 代码再让 semgrep 规则扫描反编译产物。示例的反编译结果保存在 demos/android/MASVS-CRYPTO/MASTG-DEMO-0022/MastgTest_reversed.java执行脚本为 run.shNO_COLORtrue semgrep -c ../../../../rules/mastg-android-broken-encryption-algorithms.yaml ./MastgTest_reversed.java output.txt命令要点NO_COLORtrue禁用 semgrep 的 ANSI 彩色输出保证落盘的output.txt是纯文本便于后续做差异比对或引入 CI 日志-c rulefile指定规则文件路径相对脚本位置等价于仓库根目录的 rules/mastg-android-broken-encryption-algorithms.yaml扫描目标是反编译后的MastgTest_reversed.java而非 Kotlin 源码——因为规则声明为languages: [java] output.txt把结果重定向保存output.txt 即是本演示的可复现取证文件。semgrep 本身是 MASTG 收录的通用静态扫描工具MASTG-TOOL-0110官方能力覆盖 Java、Kotlin 与 Swift 的扫描因此这套规则思路同样可以横向迁移到 iOS 侧的 Swift 代码。扫描结果4 处发现逐一对号入座执行脚本后得到的 output.txt 显示 semgrep 共报告4 Code Findings全部命中rules.mastg-android-broken-encryption-algorithms规则消息均为[MASVS-CRYPTO-1] Broken encryption algorithms found in use.┌─────────────────┐ │ 4 Code Findings │ └─────────────────┘ MastgTest_reversed.java ❯❱ rules.mastg-android-broken-encryption-algorithms [MASVS-CRYPTO-1] Broken encryption algorithms found in use. 39┆ Cipher cipher Cipher.getInstance(DES); ⋮┆---------------------------------------- 62┆ Cipher cipher Cipher.getInstance(DESede); ⋮┆---------------------------------------- 81┆ Cipher cipher Cipher.getInstance(RC4); ⋮┆---------------------------------------- 100┆ Cipher cipher Cipher.getInstance(Blowfish);将这四个行号与反编译文件 MastgTest_reversed.java 对照扫描报告行号反编译代码上下文对应 Kotlin 方法39Cipher cipher Cipher.getInstance(DES);vulnerableDesEncryption62Cipher cipher Cipher.getInstance(DESede);vulnerable3DesEncryption81Cipher cipher Cipher.getInstance(RC4);vulnerableRc4Encryption100Cipher cipher Cipher.getInstance(Blowfish);vulnerableBlowfishEncryption反编译产物清晰地还原了 Kotlin 源文件的全部结构vulnerableDesEncryption中byte[] keyBytes new byte[8]对应 8 字节 DES 弱密钥DESKeySpec/SecretKeyFactory.getInstance(DES)/cipher.init(1, secretKey)1即Cipher.ENCRYPT_MODE与 Kotlin 源码一一对应vulnerableRc4Encryption和vulnerableBlowfishEncryption则还原为SecretKeySpec直接构造密钥的形态。这说明即使攻击者只能拿到反编译代码拿不到原始 Kotlin 源码这类安全问题依然可以被静态规则精确锁定这正是移动 App 黑盒安全评估的价值所在。评估与修复建议结论该测试失败fail。样本代码在Cipher.getInstance中使用了四种破损的对称加密算法——DES、3DES、RC4 与 Blowfish直接违反MASVS-CRYPTO-1由MASTG-TEST-0221覆盖详见 MASTG-TEST-0013 的covered_by关系。修复时把Cipher.getInstance的算法参数替换为 AES 的推荐形态即可例如Cipher cipher Cipher.getInstance(AES/GCM/NoPadding);同时还应遵循以下配套要求算法使用 AES推荐 256 位密钥可用KeyGenParameterSpec/Android Keystore 生成与存储而不是SecretKeySpec明文密钥模式与填充首选 GCM认证加密避免 ECB填充尽量使用NoPadding与 GCM 搭配密钥管理不要将密钥硬编码或存放在应用资源中应使用 Android Keystore 或服务端密钥托管加固扫描链路将本文的 semgrep 规则接入 CI在每次构建/发版前对反编译产物或源码统一执行一次静态扫描把破损算法挡在上线之前。小结MASTG-DEMO-0022展示了一条完整的、可直接复用的检测范式用带注释的 Kotlin 漏洞样本模拟真实缺陷 → 反编译得到 Java 证据 → 用 rules/mastg-android-broken-encryption-algorithms.yaml 一条正则同时锁定 DES/DESede/RC4/Blowfish → 用 run.sh 产出可审计的文本报告 → 依据行号回追反编译代码完成取证。这套方法不依赖具体业务代码规则与脚本都可直接迁移到真实项目中是 MASVS-CRYPTO-1 合规检测与移动应用安全审计中成本最低、效果最直观的起步方案。赞分享文档教程网络安全【免费下载链接】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点击查看免费下载相关推荐MASTG 实践指南在 Android 应用中使用安全加密算法AES-256 GCM 与 ChaCha20MASTG 实践指南在 Android 应用中使用安全加密算法AES 256 GCM 与 ChaCha20 摘要导读 本文围绕 OWASP MASTG 最文档教程网络安全用 Go 的 crypto/aes 实现数据加解密Web 应用中的对称加密实战用 Go 的 crypto/aes 实现数据加解密Web 应用中的对称加密实战 本文是《Build Web Application with Golang》第文档教程OWASP MASTG 最佳实践 MASTG-BEST-0005Android 应用应使用 AES-GCM / AES-CCM 等安全认证加密模式OWASP MASTG 最佳实践 MASTG BEST 0005Android 应用应使用 AES GCM / AES CCM 等安全认证加密模式 本篇技术指文档教程网络安全上一篇RevokeMsgPatcher 微信QQ防撤回补丁下一篇终极指南如何使用Catppuccin/nvim美化CMP代码补全视觉效果 创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表