目录
摘要
一、WebView 简介
二、WebView 对外暴露
WebView 对外暴露的接口风险
三、通用型 XSS - Universal XSS 介绍
四、WebView 跨域访问
五、与本地代码交互 js
5.1接口暴露风险:
5.2漏洞利用:
5.3JavaScript 与 Native 代码通信
六、Chrome 开发者工具可信根证书
七:纵深防御体系构建
7.1. WebView基础加固
7.2. 跨域访问控制矩阵
7.3. 安全交互协议设计
7.4. 证书安全增强
总结
摘要
在移动互联网飞速发展的当下,移动 Web 安全的重要性愈发凸显。《白帽子讲 Web 安全》对移动 Web 安全进行了详细阐述,为我们揭开了这一领域的神秘面纱。
一、WebView 简介
WebView 是移动端(如 Android、iOS)用于嵌入网页的核心,显示网页内容的组件允许开发者在原生应用中嵌入网页,实现混合应用开发,,允许应用内直接加载 Web 内容。其本质是一个轻量级浏览器,但默认安全配置较弱,容易成为攻击入口。
在 Android 系统中,WebView 基于 Chromium 内核,能加载并渲染 HTML、CSS 和 JavaScript 代码。
例如,许多新闻类应用通过 WebView 加载网页形式的新闻详情,电商应用利用 WebView 展示商品介绍页面等。它为开发者提供了便捷的方式,将 Web 技术与原生应用相结合,丰富应用功能和用户体验。
二、WebView 对外暴露
WebView 对外暴露的接口风险
WebView 对外暴露存在诸多安全隐患。由于 WebView 可以执行 JavaScript 代码,若应用对 WebView 的使用缺乏严格管控,恶意代码可能会利用 WebView 的漏洞进行攻击。
JavaScript 接口暴露:开发者可能通过
addJavascriptInterface
方法将本地 Java 对象暴露给 WebView 中的 JavaScript 代码。若未严格过滤输入,攻击者可利用反射机制调用敏感系统 API(如发送短信、读取文件)。
案例:
1.某应用通过 WebView 调用 getUserInfo()
接口时,未校验调用来源,导致恶意网页可窃取用户数据。
2.攻击者可能通过构造恶意网页,在 WebView 加载该网页时,利用 JavaScript 代码获取应用内的敏感信息,如用户登录凭证、个人资料等。此外,若 WebView 被配置为允许执行任意来源的 JavaScript,攻击者还可能通过注入恶意脚本,控制 WebView 的行为,进而对整个应用造成损害。
三、通用型 XSS - Universal XSS 介绍
通用型 XSS(UXSS)是一种严重的安全漏洞。它不同于传统的 XSS(跨站脚本攻击),不受限于特定的网站或应用,而是能够在广泛的环境中利用 WebView 的漏洞进行攻击。
2022 年,Android 的 WebView 爆出 UXSS 漏洞,这一漏洞影响范围广泛。攻击者利用该漏洞,可通过精心构造的恶意网页,在用户使用搭载存在漏洞 WebView 的 Android 设备访问时,执行任意 JavaScript 代码。这意味着攻击者能够突破应用的安全边界,获取设备信息、篡改应用数据,甚至可能控制设备,对用户隐私和设备安全构成极大威胁。
防御措施
- 及时更新 WebView 内核:使用最新 Chromium 内核的 WebView 版本,修复已知漏洞。
- 禁用危险 API:如限制
eval()
函数、避免动态执行未签名脚本。
四、WebView 跨域访问
关键配置方法 | 默认值 | 作用与风险场景 |
---|---|---|
setAllowFileAccess | true | 控制是否允许通过 file:// 协议加载本地文件。默认开启,可能泄露应用私有文件。,允许file协议访问本地文件 |
setAllowFileAccessFromFileURLs | false | 控制 file:// 域页面能否访问其他 file:// 域内容。建议关闭以减少横向渗透风险。,file域页面访问其他file资源 |
setAllowUniversalAccessFromFileURLs | false | 控制 file:// 域页面能否访问任意 HTTP/HTTPS 内容。必须关闭以防止跨协议攻击。,file域访问任意http/https资源 |
- setAllowFileAccess:此属性用于设置 WebView 是否允许访问本地文件。若设置为 true,WebView 可以访问设备本地存储中的文件。然而,这也带来了安全风险,恶意网页可能借此读取用户设备上的敏感文件,如存储在本地的数据库文件、配置文件等。例如,攻击者构造的恶意网页,在 WebView 允许访问本地文件的情况下,可能尝试读取用户的登录密码存储文件(若存在此类不安全存储方式),从而获取用户密码。
- setAllowFileAccessFromFileURLs:该属性控制 WebView 是否允许从文件 URL 中访问其他文件。当设置为 true 时,从本地文件 URL 加载的页面可以访问其他本地文件。同样,这可能被攻击者利用,通过在本地文件中嵌入恶意代码,进而访问更多本地文件,扩大攻击范围。
- setAllowUniversalAccessFromFileURLs:此属性决定是否允许从文件 URL 中进行跨域访问。若设置为 true,从本地文件 URL 加载的页面不仅可以访问本地其他文件,还可能突破限制访问外部网络资源。这无疑为攻击者提供了更多机会,他们可以通过本地文件漏洞,进一步与外部恶意服务器进行交互,获取更多敏感信息或下载恶意软件到设备上。
五、与本地代码交互 js
WebView 允许 JavaScript 与本地代码进行交互,这为应用开发带来了便利,但也存在安全风险。通过 JavaScript 接口,WebView 可以调用原生应用的功能,如访问摄像头、获取地理位置等。然而,如果接口设计不当或缺乏有效的安全验证,攻击者可能通过 JavaScript 代码调用这些接口,获取用户的隐私信息。
例如:恶意网页中的 JavaScript 代码可能在用户不知情的情况下,调用摄像头拍摄照片或获取地理位置信息,并发送给攻击者。开发者在实现 JavaScript 与本地代码交互时,必须严格验证调用来源,确保接口只能被信任的代码调用。
5.1接口暴露风险:
通过addJavascriptInterface
绑定Java对象
// 危险示例:暴露系统级API
webView.addJavascriptInterface(new SystemAPI(), "nativeObj");
5.2漏洞利用:
反射调用敏感方法
// JS调用执行系统命令
nativeObj.getClass().forName("java.lang.Runtime").getMethod("exec", String.class).invoke("rm -rf /");
5.3JavaScript 与 Native 代码通信
风险场景:通过 WebView 调用摄像头、定位等硬件功能时,若未对参数进行类型和范围校验,可能引发越权操作。
防御方案:
- 白名单校验:仅允许特定域名或协议调用 Native 接口。
- 输入过滤:对 JavaScript 传递的参数进行类型强制转换和内容过滤(如正则表达式匹配)。
六、Chrome 开发者工具可信根证书
Chrome 开发者工具可信根证书
- 作用:开发者工具(如 Chrome DevTools)允许用户导入自定义根证书,用于调试 HTTPS 流量。但若设备被植入恶意根证书,攻击者可解密 HTTPS 通信,实施中间人攻击。
- 风险案例:恶意应用在用户设备安装伪造根证书,劫持银行应用的 HTTPS 请求。
解析:
Chrome 开发者工具在移动 Web 开发和调试中被广泛使用。在使用 Chrome 开发者工具调试移动设备上的 WebView 时,需要安装可信根证书。这是因为 WebView 在加载网页时,会验证网页的 SSL 证书以确保通信安全。当使用 Chrome 开发者工具进行调试时,工具会充当中间人,对 WebView 与服务器之间的通信进行拦截和分析。为了让 WebView 信任 Chrome 开发者工具的中间人角色,需要安装其提供的可信根证书。然而,这也带来了安全风险,如果恶意软件获取了该可信根证书,就可能伪装成合法的中间人,拦截和篡改 WebView 与服务器之间的通信,窃取用户数据或进行其他恶意操作。因此,在安装和使用 Chrome 开发者工具可信根证书时,必须谨慎操作,确保证书的安全性。
防御建议
- 证书锁定(Certificate Pinning):在应用中预置合法证书公钥,仅接受指定证书的通信。
- 用户教育:提示用户不要随意安装未知来源的
七:纵深防御体系构建
7.1. WebView基础加固
// 安全配置模板
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(false); // 非必要不开启JS
settings.setAllowFileAccess(false);
settings.setAllowContentAccess(false);
settings.setAllowUniversalAccessFromFileURLs(false);
7.2. 跨域访问控制矩阵
业务场景 | 推荐配置 |
---|---|
纯在线应用 | 关闭所有file协议访问 |
本地文件渲染 | 开启setAllowFileAccess,禁用其他跨域权限 |
混合内容加载 | 严格白名单控制(setAllowedOriginRules) |
7.3. 安全交互协议设计
-
接口暴露原则:
-
使用
@JavascriptInterface
注解限定可调用方法 -
双向参数校验(示例):
-
@JavascriptInterface public void safeMethod(String param) {if(!Pattern.matches("[a-z]+", param)) {throw new SecurityException("非法参数");}// 安全逻辑 }
-
7.4. 证书安全增强
-
证书锁定(Certificate Pinning):
#kotlin val certPinner = CertificatePinner.Builder().add("example.com", "sha256/AAAAAAAA...").build() val client = OkHttpClient.Builder().certificatePinner(certPinner).build()
-
防中间人攻击:
-
禁用开发者工具调试(生产环境)
-
强制使用CertificateTransparency验证
-
总结
移动 Web 安全涉及多个方面,WebView 作为移动应用与 Web 内容交互的关键组件,其安全性至关重要。开发者在使用 WebView 时,必须充分了解其特性和潜在风险,采取有效的安全措施,如严格控制 WebView 的对外暴露、合理配置跨域访问权限、加强 JavaScript 与本地代码交互的安全验证以及妥善管理 Chrome 开发者工具可信根证书等,以保障移动应用的安全和用户的隐私。
喜欢的点点赞和关注,共同进步