0x00 Webview简介
Webview交互是指App使用webview加载展示功能页面,在使用过程中会存在一些风险,导致app被攻击者利用,加载恶意代码,窃取用户信息。
0x01 file协议跨域访问
1、漏洞原理
webview控件将setAllowFileAccessFromFileURLs
或setAllowUniversalAcessFromFileURLsAPI
设置为true
,开启了file域访问,且允许file域访问HTTP域,但是并未对file域的路径做严格限制。
2、检测方法
- webview控件是否将
setAllowFileAccessFromFileURLs
或setAllowUniversalAcessFromFileURLsAPI
设置为true
。 - 客户端是否对
file://
路径进行严格限制。
3、相关设置
-
setJavaScriptEnabled(boolean)
- webview 能否执行javascript代码。 默认设置为
false
。
- webview 能否执行javascript代码。 默认设置为
-
setAllowFileAccess(boolean)
-
设置是否允许 WebView 使用 File 协议。默认设置为
true
,即允许在 File 域下访问app资源。 -
若无需使用file协议,则设置为false;若需使用file协议,则 禁止 file 协议加载 JavaScript 。
-
-
setAllowFileAccessFromFileURLs(boolean)
-
设置是否允许运行在file域中的javascript 代码访问本地file域资源。
-
此功能破坏了同源策略SOP的限制。
-
注意:如果setAllowUniversalAccessFromFileURLs设置为true,则setAllowFileAccessFromFileURLs设置为false没有意义(被忽略)。
在Android 4.0.4(API level 15) 前默认允许 在Android 4.1.x(API level 16) 后默认禁止
-
-
setAllowUniversalAccessFromFileURLs(boolean)
- 设置是否允许运行在file域中的javascript 代码访问其他的源(包括http、https等源)的资源。
- 在Android 4.0.4(API level 15) 前默认允许 在Android 4.1.x(API level 16) 后默认禁止
4、漏洞危害
造成应用克隆攻击。
-
场景1. 仅仅适用于Android 7(API Level 24)以下的设备中,采用“符号链接跨源攻击 。
-
攻击条件:
- setAllowFileAccess(true) (默认开启)
- setJavaScriptEnabled(true)
- WebView可以被外部调用,并能够加载外部可控的HTML文件
这一攻击能奏效的原因是:通过 javascript 的延时执行和将当前文件替换成指向其它文件的软链接就可以读取到被符号链接所指的文件。 (案例参考:小米有品2.2.3 版本应用克隆漏洞)
漏洞修复:Android 7.0 webview禁止了这种不安全的延迟替换
-
场景2. 应用克隆漏洞(也适用于Android 7(API Level 24)以上的系统版本)。
-
攻击条件:
- setAllowFileAccessFromFileURLs(true) 或者 setAllowUniversalAccessFromFileURLs(true)
- setJavaScriptEnabled(true)
- WebView可以被外部调用,并能够加载外部可控的HTML文件 (案例参考:支付宝应用克隆漏洞)
5、修复方案
- 非功能需求时,显式动配置
setAllowFileAccessFromFileURLs
和setAllowUniversalAccessFromFileURLs
两个API为false
。 - 如果有开启的必要,设置file路径的白名单,严格控制file域的访问范围:
- (1)固定不变的HTML文件可以放在assets或res目录下,
file:///android_asset
和file:///android_res
在不开启API的情况下也可以访问; - (2)可能会更新的HTML文件放在
/data/data/(app)
目录下,避免被第三方替换或修改; - (3)对file域请求做白名单限制时,需要对
“../../”
特殊情况进行处理,避免白名单被绕过。
- (1)固定不变的HTML文件可以放在assets或res目录下,
- 对于不需要使用file协议的应用,禁用file协议; 对于需要使用file协议的应用,禁止file协议加载 JavaScript。
0x02 SSL证书校验
1、漏洞原理
Android WebView组件加载网页发生证书认证错误时,会调用WebViewClient
类的onReceivedSslError
方法,如果该方法实现调用了handler.proceed()
来忽略该证书错误,则会受到中间人攻击的威胁,会导致隐私泄露。
错误代码:
public void (WebView view, SslErrorHandler handler, SslError error){
// 只简单地调用proceed()方法,忽略证书错误问题
paramSslErrorHandler.proceed();
}
onReceivedSslError()
方法里不能简单地用proceed()
方法进行处理,建议给用户一定的提示。 一般来说,使用Webview连接带有可信机构颁发证书的HTTPs站点,onReceivedSslError()
方法里无需作任何处理 。
2、检测方法
查看onReceivedSslError()
中是否调用了Handler.proceed()
方法来忽略证书错误。
3、相关设置
- 继承关系
- java.lang.Object——android.os.Handler——android.webkit.SslErrorHandler
- 相关方法
- Handler.proceed()
- 忽略SSL证书错误,继续加载页面
- Handler.cancel( )
- 停止加载问题页面
4、漏洞危害
造成中间人攻击。
5、修复方案
- 不调用android.webkit.SslErrorHandler的
proceed
方法 - 当证书认证发生错误时,采用默认的处理方法
handler.cancel()
,停止加载问题页面
0x03 明文存储
1、漏洞原理
WebView默认开启密码保存功能 :mWebView.setSavePassword(true)
开启后。当用户选择保存在WebView中输入的用户名和密码,则会被明文保存到应用数据目录的databases/webview.db
中。如果手机被root就可以获取明文保存的密码,造成用户的个人敏感数据泄露 。
2、检测方法
是否设置mWebView.setSavePassword(false)
。
3、相关设置
- mWebView.setSavePassword(boolean)
- 开启密码保存功能 ,默认为
true
。
- 开启密码保存功能 ,默认为
4、漏洞危害
如果手机被root就可以获取明文保存的密码,造成用户的个人敏感数据泄露 。
5、修复方案
使用mWebView.getSettings().setSavePassword(false)
来禁止保存密码
0x04 远程代码执行
1、漏洞原理
在Android 4.2(API Level 17)
版本及以下的Android设备存在安全风险,应用程序的WebView加载的不安全的javascript代码通过反射调用Android对象中所有方法,包括系统类(java.lang.Runtimel类),从而进行任意代码执行。
(1)addJavascriptInterface()
addJavascriptInterface方法用于实现本地Java和JavaScript的交互,但是该函数并没有对方法调用进行限制,导致攻击者可以调用任何JAVA类,最终导致JavaScript代码对设备进行任意攻击
(2)WebView 内置导出的 searchBoxJavaBridge_
对象
在Android 3.0以下,Android系统会默认通过searchBoxJavaBridge的Js接口给 WebView 添加一个JS映射对象:searchBoxJavaBridge
对象。 该接口可能被利用,实现远程任意代码,建议删除该接口。
webview.removeJavascriptInterface("searchBoxJavaBridge_");
(3)WebView 内置导出的 accessibility
和accessibilityTraversal Object
对象
该接口可能被利用,实现远程任意代码,建议删除该接口。
webview.removeJavascriptInterface("accessibility");` webview.removeJavascriptInterface("accessibilityTraversal");
(2)和(3)都是webview组件包含3个隐藏的系统接口:searchBoxJavaBridge_
, accessibilityTraversal
以及accessibility
,恶意程序可以利用它们实现远程代码执行。
2、检测方法
(1)对于addJavascriptInterface()
-
Android系统版本是否低于4.2
-
查找Webview是否使用addJavascriptInterface方法注册可供JavaScript调用的Java对象。
特征:Landroid/webkit/WebView;->addJavascriptInterface(
(2)对于系统隐藏的接口漏洞
检查webview组件中的getSettings()
中没有移除隐藏接口的API(removeJavascriptInterface
)。
3、漏洞危害
执行Java代码,造成攻击。
4、修复方案
(1)对于addJavascriptInterface()
-
尽量移除该接口
-
如果一定要使用addJavascriptInterface接口,需使用以下方法
- Android4.2以上,允许被JavaScript调用的方法必须以@JavascriptInterface进行注解声明,从而避免漏洞攻击。
- Android4.2以下,采用setWebChromeClient重新onJsPrompt()拦截prompt()消息进行交互。
-
在使用js2java的bridge时候,需要对每个传入的参数进行验证,避免恶意代码的攻击。
(2)针对系统隐藏的接口漏洞
如果使用了WebView,那么应使用WebView.removeJavascriptInterface(String name)
API,显示移除searchBoxJavaBridge_
、accessibility
、accessibilityTraversal
这三个接口。
0x05 参考
https://juejin.cn/post/6844904151256678408#heading-3
https://blog.csdn.net/u013107656/article/details/51729115
https://blog.csdn.net/u013107656/article/details/51728576
https://xuanxuanblingbling.github.io/ctf/android/2018/02/12/Android_app_part1/