
文档教程网络安全【免费下载链接】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 MASTGMobile Application Security Testing Guide中的测试用例 MASTG-TEST-0251讲解如何对 Android 应用做动态Dynamic分析通过 HookWebView的WebSettings配置 API在运行时枚举各WebView实例的 JavaScript、Content Provider 访问与跨源访问配置并结合调用栈回溯定位配置代码评估content://数据泄露风险。读完本文你可以掌握该用例的完整操作流程、两种 Hook 思路、判定标准以及对应的修复加固方案。一、测试定位WebView Content Provider 访问的运行时视角该测试用例的元信息见 MASTG-TEST-0251 的 front matter如下字段值平台Android测试类型dynamic、hooks、manual关注 APIWebView、WebSettings、getSettings、ContentProvider、setAllowContentAccess、setAllowUniversalAccessFromFileURLs、setJavaScriptEnabled关联弱点MASWE-0034关联静态测试MASTG-TEST-0250关联知识库MASTG-KNOW-0018MASTG-TEST-0251 是 MASTG-TEST-0250静态检查“References to Content Provider Access in WebViews”的动态对应版本。两者的分工是静态测试0250反编译 APK在代码中搜索setAllowContentAccess、setJavaScriptEnabled、setAllowUniversalAccessFromFileURLs等引用并从AndroidManifest.xml提取应用声明的 Content Provider 列表动态测试0251本文主题在真实运行的进程中 Hook 这些 API观察实际生效的配置值、调用时机与调用栈。动态测试的价值在于静态分析只能看到“代码里写了什么”而运行时 Hook 能看到“真正执行了什么”——包括被混淆代码隐藏、由第三方库间接调用、或者依据运行时条件如 Build Config、设备型号、服务端开关才执行的配置逻辑。二、背景为什么 WebView 能读到 Content Provider 数据理解本测试的前提是理解 Android WebView 对 Content Provider 的访问机制。这部分知识详见 MASTG-KNOW-0018 的 “WebView Content Provider Access” 章节。2.1setAllowContentAccess的默认行为WebSettings中的setAllowContentAccess控制 WebView 是否可以通过content://URL 访问 Content Provider。该开关默认开启且从 Android 4.1API 16起一直默认为true与minSdkVersion无关——即使目标应用只面向高版本系统这个默认值也不会自动收紧。开发者必须显式调用setAllowContentAccess(false)才能关闭。2.2 攻击者或页面内的 JavaScript能访问哪些 Provider按 MASTG-TEST-0250 的说明应用自己声明的 Content ProviderWebView 中的 JS 可以访问即使它们未导出android:exportedfalse——因为 WebView 运行在应用自身进程内不受导出限制约束其他应用声明的 Provider仅当它们导出、且未通过权限等最佳实践收紧访问时才可被访问。这意味着应用私有存储内部存储以及按权限范围的外部存储中的敏感数据都可能经由自身 Provider 暴露给 WebView 中执行的脚本。2.3 三个关键开关及其默认值本测试关注的三个 API 与相关的文件访问开关其默认行为汇总如下来源MASTG-KNOW-0018 的 “WebView Local File Access Settings” 表格及 MASTG-TEST-0250API作用默认true默认false弃用情况setAllowContentAccess允许 WebView 通过content://URL 访问 Content ProviderAPI 16始终为true—否setAllowFileAccess允许 WebView 通过file://URL 加载本地文件API ≤ 29Android 10API ≥ 30Android 11否setAllowFileAccessFromFileURLs允许file://上下文中的 JS 访问其他file://URLAPI ≤ 15Android 4.0.3API ≥ 16Android 4.1是API 30 起setAllowUniversalAccessFromFileURLs允许file://上下文中的 JS 绕过同源策略访问任意源包括content://API ≤ 15Android 4.0.3API ≥ 16Android 4.1是API 30 起setJavaScriptEnabled启用 JS 执行—默认禁用否2.4 为什么“三个条件同时成立”才构成风险攻击链需要三个环节同时满足这正是后续评估标准的全部由来JavaScriptEnabled true页面中没有可执行的 JS就无法发起对content://资源的读取与外传AllowContentAccess truecontent://URL 必须被 WebView 允许访问。按 MASTG-KNOW-0018 引用的 Chromium WebView 文档content://页面默认彼此属于 opaque origin无法相互发起 CORS 请求AllowUniversalAccessFromFileURLs true这是关键一环。它放宽了默认限制使加载自file://的页面可以访问任意源的content://URI。若该开关未开启从file://页面发起对content://的 XMLHttpRequest 会被 CORS 策略拦截logcat中出现类似 MASTG-TEST-0250 中记录的错误[INFO:CONSOLE(0)] Access to XMLHttpRequest at content://org.owasp.mastestapp.provider/sensitive.txt from origin null has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, https, chrome-untrusted., source: file:/// (0)此时对外部服务器的fetch请求仍可工作即数据外传通道存在但content://文件内容读取失败——攻击链被截断。此外要注意即使应用自身调用loadUrl(content://...)加载了content://页面该页面上的 JS 也可在其上下文中继续访问content://资源因此动态测试需要覆盖应用主动加载content://的场景。三、动态测试操作步骤测试步骤在原文档中只有三步下面逐步展开并给出可落地的工具链与示例。3.1 安装被测应用MASTG-TECH-0005第一步按 MASTG-TECH-0005 使用adb install将应用安装到模拟器或已连接设备。多设备环境下可用-d物理设备、-e模拟器或-s 序列号指定目标如需测试时自动授予全部运行时权限加-g# 安装到指定设备 adb -s serial install ./myApp.apk # 安装时自动授予全部运行时权限 adb install -g ./myApp.apk # 列出已连接设备 adb devices如果设备上已存在同包名但签名不同的应用例如重打包后的 APK需先adb uninstall package再安装否则会报INSTALL_FAILED_UPDATE_INCOMPATIBLE。3.2 Hook WebView 配置 APIMASTG-TECH-0043第二步按 MASTG-TECH-0043Method HookingHook 相关 API 调用。原文档给出了两条可选路线路线 A枚举应用中的WebView实例列出它们的配置值路线 B显式 HookWebViewsettings 的各个 setter。两者可以互补使用路线 B 能捕获每一次配置动作含参数值与调用栈路线 A 能呈现某个WebView实例在某一时刻的最终生效配置setter 可能被多次调用、顺序覆盖。Hook 的实现工具可用 Frida脚本方式最灵活或 Xposed 模块常驻方式适合长周期观察。以下给出一个基于 Frida 的示例脚本同时体现两条路线。它覆盖了 front matter 中列出的核心 API并用console.trace()打印每次调用的回溯栈setImmediate(function () { Java.perform(function () { var WebSettings Java.use(android.webkit.WebSettings); // 路线 B显式 hook 各 setter记录参数值与调用栈 WebSettings.setJavaScriptEnabled.implementation function (v) { console.log([*] setJavaScriptEnabled( v )); console.trace(); return this.setJavaScriptEnabled(v); }; WebSettings.setAllowContentAccess.implementation function (v) { console.log([*] setAllowContentAccess( v )); console.trace(); return this.setAllowContentAccess(v); }; WebSettings.setAllowUniversalAccessFromFileURLs.implementation function (v) { console.log([*] setAllowUniversalAccessFromFileURLs( v )); console.trace(); return this.setAllowUniversalAccessFromFileURLs(v); }; // 路线 A在 loadUrl 时枚举该 WebView 实例当前的生效配置 var WebView Java.use(android.webkit.WebView); WebView.loadUrl.overload(java.lang.String).implementation function (url) { var s this.getSettings(); console.log([*] WebView.loadUrl( url )); console.log( JavaScriptEnabled s.getJavaScriptEnabled()); console.log( AllowContentAccess s.getAllowContentAccess()); console.log( AllowUniversalAccessFromFileURLs s.getAllowUniversalAccessFromFileURLs()); return this.loadUrl(url); }; }); });使用要点Kotlin 属性语法同样会被捕获。Kotlin 中settings.allowContentAccess true这类属性写法在编译后就是对应的setAllowContentAccess方法调用因此 setter Hook 对 Java/Kotlin 编写的代码一视同仁注意“未调用”即默认值。如果某个WebView从未出现setAllowContentAccess的 Hook 输出并不代表它关闭了 Content Provider 访问——该开关默认就是true见 2.1 节。评估时需将“无调用记录”等价处理为“继承默认值”若应用使用了 WebView 之外的加载方式如loadData、loadDataWithBaseURL建议按需补充对相应重载的 Hook以确保配置快照的完整性。启动方式参考 MASTG-TECH-0043 中的 Frida 用法例如以 spawn 方式注入脚本frida -U -f package.name -l webview_settings.js --no-pause3.3 充分操作应用第三步“Exercise the app extensively to trigger as many flows as possible and enter sensitive data wherever you can.” 具体而言遍历所有页面重点进入包含 WebView 的功能帮助页、登录页、个人中心、支付/表单页等在输入框中尽量输入敏感数据账号、手机号、Token 等以便确认哪些WebView实例与敏感信息处理相关关注日志中loadUrl输出的 URL scheme出现content://、file://时是重点分析对象记录每个WebView实例的 setter 调用序列与loadUrl时的配置快照供评估阶段对照。3.4 观察结果按原文档 Observation 一节Hook 输出应包含一组 WebView settings 调用记录包括参数值与每次调用的回溯栈backtrace配合路线 A 时各WebView实例在加载内容时刻的生效配置值。四、评估标准与进一步验证4.1 失败判定条件原文档 Evaluation 一节明确当且仅当以下三项全部成立时测试用例判定为失败JavaScriptEnabled为trueAllowContentAccess为trueAllowUniversalAccessFromFileURLs为true。与静态版 MASTG-TEST-0250 的判定措辞“explicitly set totrue或 not used at all继承默认值true”相对应动态测试观察的是运行时实际值——由于AllowContentAccess默认为true只要没有观察到setAllowContentAccess(false)的调用运行时值即为true。4.2 结合回溯栈做代码级验证仅凭配置值为true不足以定级原文档要求利用 Hook 输出的 backtraces按 MASTG-TECH-0023Reviewing Decompiled Java Code的方法在反编译代码中定位对应位置回答三个问题设置是否被显式配置为观察到的值还是仅仅继承了默认值这影响“配置疏漏”与“显式开启”的定性哪个WebView实例接收了这套配置它是否承载敏感信息或敏感功能结合 3.3 步中记录的页面与输入数据该WebView加载内容的上下文中是否存在可通过content://URL 访问 Content Provider 数据的可能4.3 与静态 Provider 清单交叉验证对识别出的高危WebView进一步判断攻击者可控的 JavaScript 能否在可以访问处理敏感数据的 Content Provider 的上下文中执行例如页面加载了外部不可信内容、存在 XSS、或加载了可被篡改的本地 HTML。判断 Provider 是否涉及敏感数据时应复用 MASTG-TEST-0250 观察步骤中已获得的、应用AndroidManifest.xml声明的 Content Provider 清单逐一核对其authorities与实际读写的存储路径。注意原文档 NoteAllowContentAccess为true本身不构成安全漏洞但它可以与其他漏洞如 XSS、注入、加载不可信远程内容等组合使用从而放大攻击影响——这正是本测试将其与JavaScriptEnabled、AllowUniversalAccessFromFileURLs联合判定的原因。五、修复与加固建议针对该测试命中的问题MASTG 给出了四条对应的最佳实践禁用 Content Provider 访问MASTG-BEST-0013由于setAllowContentAccess始终默认为true只要不显式需要访问 Content Provider就应调用setAllowContentAccess(false)。原文指出这并非“本身即漏洞”而是减少漏洞链组合点一旦被 XSS 或注入利用开启 content 访问就可能把应用私有存储中的敏感数据外传到远程服务器。安全地加载本地文件内容MASTG-BEST-0011推荐用WebViewClient配合WebViewAssetLoader通过https://URL 加载 assets/resources 目录内容替代不安全的file://URL如必须使用file://对无安全默认值的旧 API 级别显式设置setAllowFileAccess(false)、setAllowFileAccessFromFileURLs(false)、setAllowUniversalAccessFromFileURLs(false)。非必要不启用 JavaScriptMASTG-BEST-0012JS 默认禁用仅展示静态内容的 WebView帮助页、法律声明等保持禁用确需启用时加载白名单化域名、校验loadUrl/shouldOverrideUrlLoading的 scheme 与 host、关闭文件与内容访问、避免向不可信内容暴露 JS bridge并在受支持时启用 Safe BrowsingsetSafeBrowsingEnabled(true)API 26。收紧导出型 Content Provider 的访问MASTG-BEST-0049仅应用内部使用的 Provider 显式设置android:exportedfalse必须导出时使用android:readPermission/android:writePermission/android:permission限制并配合强protectionLevel如signature文件共享优先使用FileProvider并声明最小化的file_paths.xml路径范围。六、配套自动化规则与延伸阅读仓库中还提供了与 WebView 设置检测相关的 Semgrep 规则 mastg-android-webview-allow-local-access.yml。其中的mastg-android-webview-settings规则用于静态检测与本地文件访问、JavaScript 执行相关的 WebView 配置标记[MASVS-PLATFORM-2]可匹配的模式包括pattern-either: - pattern: $WEBVIEW.getSettings(...); - pattern: $SETTINGS.setJavaScriptEnabled($ARG); - pattern: $SETTINGS.setAllowContentAccess($ARG); - pattern: $SETTINGS.setAllowFileAccessFromFileURLs($ARG); - pattern: $SETTINGS.setAllowFileAccess($ARG); - pattern: $SETTINGS.setAllowUniversalAccessFromFileURLs($ARG)它可作为动态测试的前置筛选器先静态圈出配置点再按本文流程做运行时验证。延伸阅读均为仓库内文件静态对应测试MASTG-TEST-0250WebView 平台知识库MASTG-KNOW-0018安装应用MASTG-TECH-0005方法 HookXposed / FridaMASTG-TECH-0043反编译代码审查MASTG-TECH-0023赞分享文档教程网络安全【免费下载链接】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 静态测试详解检测 WebView 中 Content Provider 访问风险MASTG-TEST-0250MASTG Android 静态测试详解检测 WebView 中 Content Provider 访问风险MASTG TEST 0250 本篇指南基于文档教程网络安全MASTG 最佳实践在 Android WebView 中禁用 Content Provider 访问setAllowContentAccessMASTG 最佳实践在 Android WebView 中禁用 Content Provider 访问setAllowContentAccess 本文基于文档教程网络安全用 Frida 动态分析 Android WebViewClient 的 URL 加载处理MASTG-DEMO-0158 运行时测试实战用 Frida 动态分析 Android WebViewClient 的 URL 加载处理MASTG DEMO 0158 运行时测试实战 导读 本篇文章基于文档教程网络安全上一篇【亲测免费】 2024年数据科学学习路线图从入门到精通下一篇现代OpenGL函数指南解锁高效图形编程的新境界创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考