ARTICLE DETAIL

资讯详情

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

MASTG-DEMO-0001 深度解析:Android 外部存储敏感数据泄露检测实战(getExternalFilesDir 与 MediaStore 文件系统快照)

MASTG-DEMO-0001 深度解析:Android 外部存储敏感数据泄露检测实战(getExternalFilesDir 与 MediaStore 文件系统快照) 文档教程网络安全【免费下载链接】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 仓库中的 MASTG-DEMO-0001 为实战样本完整演示如何通过「时间戳 文件系统快照」技术在 Android 设备上定位并取证应用写入外部存储的未加密敏感文件。读完本文你将掌握getExternalFilesDir与MediaStore两种外部存储写入路径的源码级风险识别方法能够使用 adb 脚本自动化「前后比对」流程并依据 MASTG-TEST-0200 的标准做出合规性评估。Demo 定位一条可复现的外部存储泄露链MASTG-DEMO-0001标题为File System Snapshots from External Storage是 OWASP MASTG 移动应用安全测试指南中用于演示「敏感数据明文落盘外部存储」漏洞的官方样本它对应 MASTG-TEST-0200Files Written to External Storage并覆盖旧版测试用例 MASTG-TEST-0001Testing Local Storage for Sensitive Data 中 MSTG-STORAGE-1 与 MSTG-STORAGE-2 的检测范围。整个 Demo 由以下文件组成位于 demos/android/MASVS-STORAGE/MASTG-DEMO-0001/MastgTest.ktKotlin 编写的漏洞样本代码通过两种 API 向外部存储写入敏感数据run_before.sh/run_after.sh基于 adb 的快照捕获与差分脚本output.txt应用运行后捕获到的「新增文件清单」new_files/secret.txt与new_files/secretFile75.txt从设备拉取到的明文敏感文件。脆弱样本代码分析两条写入路径样本代码位于 MastgTest.kt属于org.owasp.mastestapp包。核心入口mastgTest()依次调用两个函数分别对应两种最典型的外部存储写入方式package org.owasp.mastestapp import android.content.Context import android.util.Log import java.io.File import java.io.FileOutputStream import java.io.IOException import android.content.ContentValues import android.os.Environment import android.provider.MediaStore import java.io.OutputStream class MastgTest (private val context: Context){ fun mastgTest(): String { mastgTestApi() mastgTestMediaStore() return SUCCESS!!\n\nFiles have been written with API and MediaStore } fun mastgTestApi() { val externalStorageDir context.getExternalFilesDir(null) val fileName File(externalStorageDir, secret.txt) val fileContent secr3tPa\$\$W0rd\n try { FileOutputStream(fileName).use { output - output.write(fileContent.toByteArray()) Log.d(WriteExternalStorage, File written to external storage successfully.) } } catch (e: IOException) { Log.e(WriteExternalStorage, Error writing file to external storage, e) } } fun mastgTestMediaStore() { try { val resolver context.contentResolver var randomNum (0..100).random().toString() val contentValues ContentValues().apply { put(MediaStore.MediaColumns.DISPLAY_NAME, secretFile$randomNum.txt) put(MediaStore.MediaColumns.MIME_TYPE, text/plain) put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS) } val textUri resolver.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, contentValues) textUri?.let { val outputStream: OutputStream? resolver.openOutputStream(it) outputStream?.use { it.write(MAS_API_KEY8767086b9f6f976g-a8df76\n.toByteArray()) it.flush() } Log.d(MediaStore, File written to external storage successfully.) } ?: run { Log.e(MediaStore, Error inserting URI to MediaStore.) } } catch (exception: Exception) { Log.e(MediaStore, Error writing file to URI from MediaStore, exception) } } }路径一getExternalFilesDir写入应用专属外部目录mastgTestApi()使用context.getExternalFilesDir(null)获取应用专属外部存储目录并借助FileOutputStream写入名为secret.txt的明文密码secr3tPa$$W0rd。该目录在设备上的实际位置形如/sdcard/Android/data/package-name/files/本 Demo 中即/sdcard/Android/data/org.owasp.mastestapp/files/secret.txt。尽管这类目录被 Android 称为「应用专属」app-specific但其位于外部存储上存在多重风险Android 10API 29及以下具备权限的恶意应用可读取其他应用写入的应用专属外部目录见 MASTG-KNOW-0042 的说明启用 USB 大容量存储时用户可直接修改这些文件文件在应用卸载时会被删除但在此之前任何人都可能接触到敏感内容。知识条目 MASTG-KNOW-0042 给出了同款风险的等价 Kotlin 片段——用context.getExternalFilesDir(null)明文写入password.txt并明确指出getExternalStoragePublicDirectory这类 API 返回的是其他应用也能访问的共享位置属于「Shared Storage Requiring No User Interaction」具备权限的第三方应用即可读取其中的敏感数据。路径二MediaStoreAPI 写入公共下载集合mastgTestMediaStore()走的是更现代、也更隐蔽的MediaStore路径构造ContentValues指定DISPLAY_NAME随机文件名secretFile0..100.txt、MIME_TYPEtext/plain与RELATIVE_PATHEnvironment.DIRECTORY_DOWNLOADS即 Download 公共目录通过resolver.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, contentValues)在系统媒体数据库中登记一个新条目获得content://URI通过resolver.openOutputStream(uri)向该 URI 写入明文 API KeyMAS_API_KEY8767086b9f6f976g-a8df76。从代码结构可以推断这种写法刻意制造了「检测盲区」文件不是通过文件路径直接创建的而是经由 ContentProvider 的抽象层落盘。因此仅靠对文件路径的静态分析难以发现它只有动态文件系统快照才能捕获。MediaStore写入的最终落盘位置为/sdcard/Download/secretFile75.txt见下文output.txt属于公共共享存储任何拥有相应权限的应用或直接通过 USB 连接的用户都可读取。复现步骤时间戳驱动的文件系统快照Demo 的检测思路非常朴素却有效在触发应用行为之前打一个时间戳标记在之后找出所有「比该标记新」的文件从而精确锁定本次运行期间应用新创建的文件。这正对应 MASTG-TEST-0200 的核心方法——「在运行应用前后分别获取外部存储文件清单计算差分」。完整流程如下Step 1安装应用可用 MASTG-TECH-0005 描述的安装方式例如adb install。Step 2执行run_before.sh建立时间基准。脚本内容run_before.sh#!/bin/bash # SUMMARY: This script creates a dummy file to mark a timestamp that we can use later # on to identify files created during the app exercising adb shell touch /data/local/tmp/test_start它在设备上创建一个空文件/data/local/tmp/test_start其修改时间mtime即为后续差分的时间基准。Step 3打开应用并充分操作。运行mastgTest()触发两条写入路径让应用真实创建文件。原文档特别强调要「exercise it to trigger file creations」——与 MASTG-TEST-0200 中「尽可能多地触发应用流程、在能输入的地方输入敏感数据」的要求一致确保敏感数据生成路径全部被执行。Step 4执行run_after.sh捕获并拉取新文件。脚本内容run_after.sh#!/bin/bash # SUMMARY: List all files created after the creation date of a file created in run_before adb shell find /sdcard/ -type f -newer /data/local/tmp/test_start output.txt adb shell rm /data/local/tmp/test_start mkdir -p new_files while read -r line; do adb pull $line ./new_files/ done output.txt关键点解读find /sdcard/ -type f -newer /data/local/tmp/test_start递归枚举外部存储中所有修改时间晚于时间基准文件的普通文件结果重定向到output.txtrm清理时间基准文件设备端操作通过adb shell执行逐行读取output.txt用adb pull将每个新增文件拉取到本地new_files/目录——这正是 MASTG-TECH-0002Host-Device Data Transfer 描述的adb pull remote local批量取回文件的标准用法底层由 MASTG-TOOL-0004adb 驱动。Step 5测试完成后关闭应用避免后续操作污染后续轮次的快照。观察结果清单与明文内容output.txt记录了应用运行期间新增到外部存储的全部文件output.txt/sdcard/Android/data/org.owasp.mastestapp/files/secret.txt /sdcard/Download/secretFile75.txt两个文件分别印证了上文的两条写入路径应用专属外部目录中的secret.txt与公共 Download 目录下的secretFile75.txt。从设备拉回的内容同样一目了然明文new_files/secret.txtsecr3tPa$$W0rdnew_files/secretFile75.txtMAS_API_KEY8767086b9f6f976g-a8df76一个是应用密码一个是 API Key——典型的高价值凭据数据。评估为什么该测试必然失败按照 MASTG-TEST-0200 的评估标准若发现的文件未加密且泄露敏感数据则测试失败。本 Demo 的判定为敏感数据成立secret.txt含明文密码secr3tPa$$W0rdsecretFile75.txt含明文 API KeyMAS_API_KEY8767086b9f6f976g-a8df76未加密成立两个文件均为纯文本明文无任何加密层可被他人获取文件落在外部存储含公共 Download 目录攻击面明确。因此测试失败。原文档还建议通过逆向工程应用并检查代码进一步确认——即回到MastgTest.kt源码直接看到fileContent与MAS_API_KEY常量验证明文写入行为。同时需要注意 MASTG-TEST-0001 给出的 MASVS 合规基线L1 合规允许数据以明文存放在应用内部存储沙箱中L2 合规则要求使用 Android KeyStore 安全管理的密钥进行加密如 DEKKEK 信封加密或 Android Security Library 的EncryptedFile/EncryptedSharedPreferences。外部存储的明文敏感数据在任何等级下都不合规。底层原理外部存储为何危险外部存储的风险根源在于其共享性。结合 MASTG-KNOW-0042 可梳理出以下关键事实共享属性外部存储可能是可移除的 SD 卡也可能是系统模拟的不可移除分区其中的公共目录对所有应用开放。版本差异Scoped StorageAndroid 10API 29起默认启用分区存储scoped storage应用默认无法访问其他应用的应用专属目录但 API 29 及以下版本的应用可通过android:requestLegacyExternalStoragetrue临时退出分区存储且 Android 11API 30起该属性被系统忽略。权限演进READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE在 Android 13API 33起不再生效访问媒体集合需改用READ_MEDIA_IMAGES/READ_MEDIA_VIDEO/READ_MEDIA_AUDIOMANAGE_EXTERNAL_STORAGE「所有文件访问」仅适用于 targetSdk 30且受 Google Play 政策严格限制。实战攻击面除恶意应用读取外还包括「Man-in-the-Disk」类攻击攻击者替换外部存储中被应用信任的数据文件以及用户通过 USB 直接导出文件等场景。因此 Android 官方安全准则的建议是不要在外部存储存放敏感数据若必须使用需对数据做输入校验并配合加密。加固建议如何修复该漏洞针对本 Demo 暴露的问题修复方向分为两层1. 存储位置整改敏感数据密码、API Key、Token 等应优先存入应用内部存储沙箱/data/data/package-name/files/或在 Android Keystore 中保存仅将非敏感媒体内容写入外部存储。2. 强制加密对必须持久化的敏感数据使用加密存储。EncryptedFile与EncryptedSharedPreferencesandroidx.security:security-crypto是常见方案——虽然该库当前已标记为弃用官方替代方案尚未发布MASTG-TEST-0001 建议在替代品发布前继续使用其核心思想仍是用 Android Keystore 保护的密钥KEK加密数据密钥DEK实现信封加密密钥永不以明文离开安全硬件。3. 静态分析预防在代码审查阶段即可拦截此类问题——检查AndroidManifest.xml中的READ/WRITE_EXTERNAL_STORAGE等权限声明并在源码中检索getExternal*系列函数、FileOutputStream、getExternalFilesDir、MediaStore写入调用等风险 API完整检索清单见 MASTG-TEST-0001 的 Static Analysis 一节同时对硬编码密钥、XOR 拼接密钥等弱加密手法保持警惕。配套资源样本源码MastgTest.kt快照脚本run_before.sh / run_after.sh观察产物output.txt、secret.txt、secretFile75.txt测试标准MASTG-TEST-0200、MASTG-TEST-0001知识背景MASTG-KNOW-0042External Storage技术工具MASTG-TECH-0002Host-Device Data Transfer、MASTG-TOOL-0004adb赞分享文档教程网络安全【免费下载链接】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点击查看免费下载相关推荐使用 Semgrep 检测 Android 键盘缓存敏感输入MASTG-DEMO-0064 实战解析使用 Semgrep 检测 Android 键盘缓存敏感输入MASTG DEMO 0064 实战解析 MASTG DEMO 0064 是 OWASP MAS文档教程网络安全shadcn-vue Dropdown Menu 组件完整指南安装、API 与实战示例shadcn vue Dropdown Menu 组件完整指南安装、API 与实战示例 本指南围绕 shadcn vue 中的 Dropdown Menu下文档教程网络安全使用 Frooky 检测 Firebase Analytics 敏感用户数据外发MASTG-DEMO-0081 实战演示使用 Frooky 检测 Firebase Analytics 敏感用户数据外发MASTG DEMO 0081 实战演示 导读 本文以 OWASP Mobil文档教程网络安全上一篇ZeroMail0开源 AI 邮件项目 Agent 开发协作指南monorepo 结构、命令体系与工程规范全解析下一篇无人机巡检新范式用CuPy实现毫秒级GPU图像处理与缺陷识别创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表