
文档教程网络安全【免费下载链接】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-BEST-0011 的完整解读。核心主题是解决 Android WebView 加载本地文件内容时的安全问题用https://同源加载替代不安全的file://加载并在不得不使用file://时显式关闭本地文件访问开关。读完本文你将掌握WebViewAssetLoader的正确用法、三个setAllow*开关在不同 API 级别下的默认值与加固写法以及如何利用本仓库的测试用例与攻击演示MASTG-DEMO-0029验证和审计自己的 WebView 配置。核心结论优先用 WebViewAssetLoader https:// 替代 file://MASTG-BEST-0011 给出的推荐做法是使用WebViewClient配合 AndroidX WebKit 提供的WebViewAssetLoader通过https://URL 加载应用 assets 或 resources 目录下的内容而不是使用不安全的file://URL。这样做的收益是内容在安全、同源的环境中加载本地文件不会被暴露给潜在的跨源攻击cross-origin attacks。典型的配置代码如下// Kotlin 示例使用 WebViewAssetLoader 以 https:// 加载 assets val assetLoader WebViewAssetLoader.Builder() .addPathHandler(/assets/, WebViewAssetLoader.AssetsPathHandler(context)) .build() webView.webViewClient object : WebViewClientCompat() { override fun shouldInterceptRequest( view: WebView, request: WebResourceRequest ): WebResourceResponse? { return assetLoader.shouldInterceptRequest(request.url) } } webView.loadUrl(https://appassets.androidplatform.net/assets/index.html)// Java 示例 WebViewAssetLoader assetLoader new WebViewAssetLoader.Builder() .addPathHandler(/assets/, new WebViewAssetLoader.AssetsPathHandler(context)) .build(); webView.setWebViewClient(new WebViewClientCompat() { Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { return assetLoader.shouldInterceptRequest(request.getUrl()); } }); webView.loadUrl(https://appassets.androidplatform.net/assets/index.html);其中https://appassets.androidplatform.net/是WebViewAssetLoader约定的保留域名shouldInterceptRequest会把对该域名下路径的请求映射到 app 的 assets/resources 目录页面因此拥有一个真实的 HTTPS 同源 origin符合标准的同源策略与 CORS 行为。这一使用保留 HTTPS 域名作为 base URL的思路在仓库的演示应用中有直接印证MASTG-DEMO-0097/MastgTestWebView.kt 通过loadDataWithBaseURL(https://appassets.androidplatform.net/assets/support/, ...)为内联 HTML 指定了同样的安全 base URL使页面脚本运行在非透明的 HTTPS origin 之下。为什么 file:// 不安全威胁模型要理解最佳实践背后的逻辑需要先明白file://加载的问题所在。根据仓库知识条目 MASTG-KNOW-0018: WebViews 的说明WebView 是嵌入在应用内的浏览器内核Android 4.4 起基于 Chromium页面没有地址栏用户无法直观判断当前加载了何种内容。WebView 除了移动应用自身的威胁还会暴露在常见的 Web 威胁之下XSS、Open Redirect 等。一旦 WebView 中加载了任何不可信页面攻击者注入的脚本就可能尝试利用 WebView 桥接bridge或诱导用户。当 app 为 WebView 设置了WebViewClient后所有导航都由 WebView 自身处理任何资源都可能被加载进 WebView —— 这属于最需要防御的配置形态必须实现 URL 白名单校验。file://方案的核心风险在于本地文件页面运行在file://这一特殊 scheme 下其 origin 通常是nullopaque origin配合被放宽的文件访问开关脚本可以绕过同源策略读取本机其他文件甚至将数据外发到远程服务器。三个关键开关与默认值速查MASTG-BEST-0011 与 MASTG-KNOW-0018 明确了三个控制 WebView 本地文件访问的WebSettings方法其默认值随 API 级别不同而不同。下表汇总来源MASTG-KNOW-0018 中的 WebView Local File Access Settings 章节API作用默认True的 API 级别默认False的 API 级别是否弃用setAllowFileAccess允许 WebView 使用file://URL 从本地文件系统加载文件 29Android 10 30Android 11否setAllowFileAccessFromFileURLs允许file://上下文中的 JavaScript 访问其他file://URL 15Android 4.0.3 16Android 4.1是API level 30 起setAllowUniversalAccessFromFileURLs允许file://上下文中的 JavaScript 访问任意来源资源绕过同源策略 15Android 4.0.3 16Android 4.1是API level 30 起需要特别强调的补充点assets 与 resources 不受影响无论上述开关如何设置通过file:///android_asset与file:///android_res访问 assets/resources 始终被允许见 MASTG-KNOW-0018。也就是说只读的打包资源访问不是这些开关的管控范围真正需要警惕的是对应用内部存储、外部存储文件的访问。setAllowContentAccess的默认行为不同它控制 WebView 能否通过content://URL 访问 Content Provider在所有 Android 版本上默认都是trueAndroid 4.1/API 16 及以上默认启用不受minSdkVersion影响。该开关同样应纳入审计范围详见下文Content Provider 访问部分。逐个 API 详解与代码示例setAllowFileAccess本地文件系统访问总开关setAllowFileAccess决定 WebView 能否用file://scheme 加载本地文件内部存储、外部存储。开启后的一个典型不安全写法是加载外部存储中的 HTMLwebView.settings.apply { allowFileAccess true } webView.loadUrl(file:///sdcard/index.html)WebView 通过file://能访问到的是应用自身有权限读取的任何文件包括内部存储应用自己的内部存储目录外部存储Android 10 之前若应用持有READ_EXTERNAL_STORAGE权限可访问整个外部存储SD 卡Android 10 起分区存储无需特殊权限即可访问应用专属目录持有READ_MEDIA_IMAGES等权限可访问整个媒体目录含其他应用的数据持有MANAGE_EXTERNAL_STORAGE权限可访问整个外部存储。setAllowFileAccessFromFileURLs本地页面之间的互访该开关允许通过file://加载的本地页面从其 HTML 或 JavaScript 中访问其他本地资源。需要注意当allowUniversalAccessFromFileURLs为true时该设置的值会被忽略Android 官方文档明确说明这一行为。开启后的示例webView.settings.apply { allowFileAccess true allowFileAccessFromFileURLs true } webView.loadUrl(file:///sdcard/local_page.html)!-- In local_page.html -- !DOCTYPE html html head meta charsetUTF-8 titleLocal Page/title /head body !-- This image is loaded via a file:// URL -- img srcfile:///android_asset/images/logo.png altLogo /body /htmlChromium 官方文档仓库知识条目引用提醒放宽该 origin 规则后content://与file://开头的 URL 可以通过XMLHttpRequest访问具有相同放宽 origin 的资源例如file://foo可以向file://bar发起 XHR。开发者必须警惕用户提供的数据不要运行在content://下否则用户代码可以访问其他应用提供的任意content://URL造成严重安全问题。此外无论此开关如何设置Fetch API 都不允许访问content://与file://URL。setAllowUniversalAccessFromFileURLs最危险的开关该开关允许运行在本地file://页面中的 JavaScript完全绕过同源策略访问任意来源的资源。开启后file://页面拥有 scheme 型 origin可以跨源访问content://、http://、https://等任意资源 —— 其权限远超公开 Web 的 CORS 限制。webView.settings.apply { javaScriptEnabled true allowFileAccess true allowUniversalAccessFromFileURLs true } webView.loadUrl(file:///android_asset/local_page.html)assets 目录下local_page.html的内容!DOCTYPE html html head meta charsetUTF-8 titleUniversal Access Demo/title script // This AJAX call fetches data from a remote server despite being loaded via file:// fetch(https://api.example.com/data) .then(response response.text()) .then(data document.getElementById(output).innerText data) .catch(err console.error(err)); /script /head body div idoutputLoading.../div /body /html关于 Cookie 的注意事项来自 MASTG-KNOW-0018设置setAllowUniversalAccessFromFileURLs(true)只是让本地file://中的 JavaScript 能发起跨源请求XHR、Fetch从而绕过网络请求层面的同源策略但它并不会授予读取远程网站 Cookie 的能力Cookie 由 WebView 的CookieManager统一管理file://origin 无法通过document.cookie读取且现代站点普遍使用HttpOnly与Secure标志防护跨源请求默认也不携带 Cookie除非服务器通过Access-Control-Allow-Origin: *与Access-Control-Allow-Credentials: true等 CORS 头显式允许。必须使用 file:// 时的加固清单MASTG-BEST-0011 明确指出如果应用确实需要 WebView 加载本地file://文件必须按minSdkVersion分情况加固情况一minSdkVersion对应的默认值本身就是安全的此时应确保以下方法不被调用、保留默认值或者为保险起见显式设置为false保证 WebView 不允许本地文件访问webView.settings.apply { allowFileAccess false // setAllowFileAccess(false) allowFileAccessFromFileURLs false // setAllowFileAccessFromFileURLs(false) allowUniversalAccessFromFileURLs false // setAllowUniversalAccessFromFileURLs(false) }// Java 等价写法 webView.getSettings().setAllowFileAccess(false); webView.getSettings().setAllowFileAccessFromFileURLs(false); webView.getSettings().setAllowUniversalAccessFromFileURLs(false); webView.getSettings().setAllowContentAccess(false); // 如不需要 content:// 也应关闭情况二minSdkVersion对应的默认值不安全较旧的 API 级别例如minSdkVersion 30时setAllowFileAccess默认是trueminSdkVersion 16时另外两个开关默认是true。此时必须显式将上述方法全部设为false不能依赖默认值。此外Android 官方Things to avoid加载本地内容安全指南的反模式章节还建议本地 HTML/JS 文件应放在 app 的 assets 目录而非外部存储外部存储文件对所有人可读写属不良实践对loadUrl中的动态参数要严格校验防止本地文件包含Local File Inclusion。仓库中的验证测试用例如何判定不安全配置MASTG 仓库提供了与 MASTG-BEST-0011 直接对应的测试用例可用于验证与审计。静态测试MASTG-TEST-0252本地文件访问MASTG-TEST-0252 检查代码中对WebSettings三个方法的引用setAllowFileAccess允许 WebView 加载内部/外部存储的本地文件setAllowFileAccessFromFileURLs允许本地文件中的 JavaScript 访问其他本地文件setAllowUniversalAccessFromFileURLs移除跨源限制。注意无论该设置如何JavaScript 始终可以向任意源发送数据如 POST该开关只影响读取响应数据—— 即便请求失败数据也已经发出。该测试的失败判定条件三条同时满足即判失败setJavaScriptEnabled被显式设为truesetAllowFileAccess被显式设为true或minSdkVersion 30时未调用继承默认值truesetAllowFileAccessFromFileURLs或setAllowUniversalAccessFromFileURLs被显式设为true或minSdkVersion 16时未调用继承默认值true。测试还特别强调缺少对setAllow*方法的引用同样值得记录因为那可能意味着应用正在使用默认值而在某些场景下默认值是不安全的。审计时应尽量找出应用中的每一个 WebView 实例。当两个 file-URL 开关都保持false时被攻击页面读取本地文件会失败logcat中出现 CORS 拦截日志且攻击者服务器收不到文件内容[INFO:CONSOLE(0)] Access to XMLHttpRequest at file:///data/data/org.owasp.mastestapp/files/api-key.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) [INFO:CONSOLE(31)] File content sent successfully., source: file:/// (31)[*] Received POST data from 127.0.0.1: Error reading file: 0动态测试MASTG-TEST-0253运行时 HookMASTG-TEST-0253 是 MASTG-TEST-0252 的动态对应用例采用两种 Hook 思路之一枚举应用中的WebView实例并列出其配置值或显式 HooksetJavaScriptEnabled、setAllowFileAccess、setAllowFileAccessFromFileURLs、setAllowUniversalAccessFromFileURLs四个 setter。观察项要求输出每个 WebView 设置调用的参数值与调用栈backtrace随后借助反编译工具MASTG-TECH-0023 对应流程结合调用栈定位代码位置确认设置是否被显式使用、配置作用到哪个 WebView 实例、该 WebView 是否加载file://内容如loadUrl(file://...)或以file://为 base URL 的loadDataWithBaseURL以及攻击者可控的 JavaScript 是否可能在本地文件上下文中执行并外泄数据。Content Provider 访问MASTG-TEST-0250 / MASTG-TEST-0251由于setAllowContentAccess在所有版本默认均为true不受minSdkVersion影响MASTG-TEST-0250静态与 MASTG-TEST-0251动态专门检查 Content Provider 访问。失败判定为以下条件同时成立setJavaScriptEnabled显式为truesetAllowContentAccess显式为true或未被调用继承默认值truesetAllowUniversalAccessFromFileURLs显式为true。此时 WebView 中的 JavaScript 可以访问应用自身声明的 Content Provider即使未导出以及其他应用导出的 Provider。测试也提醒setAllowContentAccess为true本身不构成漏洞但可与其他漏洞组合放大攻击影响而allowUniversalAccessFromFileURLs是攻击关键它放宽了默认限制使file://页面可以访问包括content://在内的任意来源。若该开关未开启logcat中会出现类似拦截日志[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)历史用例MASTG-TEST-0032MASTG-TEST-0032MSTG-PLATFORM-6对应 MASVS-PLATFORM-2是 MASTG V1 时代的 WebView 协议处理器测试现已弃用由 MASTG-TEST-0250 ~ 0253 覆盖。其静态分析要点至今仍有参考价值逐一确认setAllowContentAccess、setAllowFileAccess、setAllowFileAccessFromFileURLs、setAllowUniversalAccessFromFileURLs的启用情况并判断其必要性通过loadUrl定位加载来源从外部存储加载 HTML 属不良实践文件所有人可读写应放在 assets 目录对loadUrl中的动态参数做操纵性测试防止本地文件包含建议维护允许加载的本地/远程页面与协议白名单并在启动时校验本地 HTML/JS 文件的校验和、对 JS 做压缩混淆。攻击场景演示MASTG-DEMO-0029 的数据外泄为直观展示不安全配置的后果仓库提供了可运行的攻击演示 MASTG-DEMO-0029。其核心源码 MastgTestWebView.kt 完整呈现了敏感文件 漏洞配置 XSS 注入的攻击链路应用先把一个敏感文件api-key.txt写入内部存储context.filesDir模拟缓存的凭据或私有数据WebView 配置开启javaScriptEnabled true与allowUniversalAccessFromFileURLs true且刻意不把allowContentAccess设为false保留默认的true以展示默认行为通过loadDataWithBaseURL(file:///, ...)以file://作为 base URL 加载一段被 XSS 注入的 HTML —— 非透明 origin 被替换为file://origin注入的脚本用XMLHttpRequest经content://org.owasp.mastestapp.fileprovider/internal_files/api-key.txt读取敏感文件再用fetchPOST 到http://10.0.2.2:5001/receive模拟攻击者服务器完成静默外泄。源码注释明确说明了每个开关的作用allowUniversalAccessFromFileURLs是攻击成立的关键不设置时content://请求会被 CORS 拦截上述 logcat 错误即会复现而allowContentAccess若不关闭攻击脚本就能通过 Provider 访问敏感文件。演示的评估结果记录在 evaluation.txtsetJavaScriptEnabled: True setAllowContentAccess: True setAllowUniversalAccessFromFileURLs: True三个危险配置全部命中恰好对应 MASTG-TEST-0250 的失败判定条件。这个演示从反面印证了 MASTG-BEST-0011 的价值只要按最佳实践关闭本地文件访问开关或改用WebViewAssetLoader的 HTTPS 同源方案这条攻击链路在第一步就会被切断。自动化检测静态规则 mastg-android-webview-allow-local-access.ymlMASTG 还提供可落地的自动化检测规则 rules/mastg-android-webview-allow-local-access.yml。该规则Semgrep 格式语言为 Java严重级别 INFO关联 MASVS-PLATFORM-2通过模式匹配捕获以下 WebView 相关调用$WEBVIEW.getSettings(...)$SETTINGS.setJavaScriptEnabled($ARG)$SETTINGS.setAllowContentAccess($ARG)$SETTINGS.setAllowFileAccessFromFileURLs($ARG)$SETTINGS.setAllowFileAccess($ARG)$SETTINGS.setAllowUniversalAccessFromFileURLs($ARG)规则命中后给出提示 Detected WebView settings.配合上述测试用例即可进一步人工评估参数值与攻击可达性。把该规则接入 CI 或配合静态逆向如对 MASTG-DEMO-0029 的反编译产物 运行可以快速定位仓库或目标应用中所有值得人工复核的 WebView 配置点。落地清单与总结按 MASTG-BEST-0011 落地 WebView 本地内容加载安全可按以下顺序自查首选方案用WebViewClientWebViewAssetLoader将 assets/resources 以https://appassets.androidplatform.net/...同源加载彻底规避file://必须用file://时确认minSdkVersion对应的默认值对setAllowFileAccess、setAllowFileAccessFromFileURLs、setAllowUniversalAccessFromFileURLs显式设false尤其当minSdk 30或minSdk 16时不可依赖默认值评估setAllowContentAccess它默认全版本为true若业务不需要content://显式关闭若需要确认应用自身 Provider 的导出与敏感数据情况结合源码审计找出应用内每个 WebView 实例与其WebSettings配置注意未调用setAllow*也可能意味着继承了不安全的默认值动态验证Hook 四个 setter 观察运行时参数与调用栈对应 MASTG-TEST-0251/0253并以 MASTG-DEMO-0029 为攻击样例验证防护是否生效自动化兜底接入 rules/mastg-android-webview-allow-local-access.yml 规则扫描可疑配置。深入阅读可继续查看仓库中的 MASTG-KNOW-0018 知识条目含本地文件访问设置、Content Provider 访问、WebView 存储与清理、JavaScript 桥接等完整背景以及对应测试用例 MASTG-TEST-0250、MASTG-TEST-0251、MASTG-TEST-0252、MASTG-TEST-0253。赞分享文档教程网络安全【免费下载链接】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-BEST-0012Android WebView 中 JavaScript 的安全启用与禁用策略OWASP MASTG 最佳实践 MASTG BEST 0012Android WebView 中 JavaScript 的安全启用与禁用策略 开启 Java文档教程网络安全OWASP MASTG Android 最佳实践在生产构建中禁用 WebView 调试MASTG-BEST-0008 深度解析OWASP MASTG Android 最佳实践在生产构建中禁用 WebView 调试MASTG BEST 0008 深度解析 本文基于 OWASP MA文档教程网络安全Bluebird new Promise 构造函数完全指南用法、执行契约与源码级原理Bluebird new Promise 构造函数完全指南用法、执行契约与源码级原理 new Promise 是 Bluebird 中创建 Promise 实文档教程网络安全上一篇CachyOS内核PKGBUILD详解自定义编译选项与参数说明下一篇【亲测免费】 微信小程序wxapkg解包工具——unwxapkg安装教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考