codeegginterviewgroup / CodeEggDailyInterview

码个蛋每日面试题
396 stars 54 forks source link

Android WebView 的漏洞有哪几种? #78

Open kukyxs opened 5 years ago

imononoke commented 5 years ago

主要三类漏洞:

  1. WebView 中 addJavascriptInterface() 接口

  2. WebView 内置导出的 searchBoxJavaBridge_对象

  3. WebView 内置导出的 accessibility 和 accessibilityTraversalObject 对象

  4. 任意代码执行漏洞

1.1 WebView 中 addJavascriptInterface()接口

原因 JS调用Android的其中一个方式是通过addJavascriptInterface接口进行对象映射,当JS拿到Android这个对象后,就可以调用这个Android对象中所有的方法,包括系统类(java.lang.Runtime 类),从而进行任意代码执行。 解决 Android 4.2以前,需要采用拦截prompt()的方式进行漏洞修复 Android 4.2以后,则只需要对被调用的函数以 @JavascriptInterface进行注解

1.2 WebView 内置导出的 searchBoxJavaBridge_对象

原因 在Android 3.0以下,Android系统会默认通过searchBoxJavaBridge_的Js接口给 WebView 添加一个JS映射对象:searchBoxJavaBridge_对象 该接口可能被利用,实现远程任意代码。

解决 删除searchBoxJavaBridge_接口

1.3 WebView 内置导出的 accessibility 和 accessibilityTraversalObject 对象 原因和解决方法同上

  1. 密码明文存储漏洞

原因 WebView默认开启密码保存功能:mWebView.setSavePassword(true) 开启后,在用户输入密码时,会弹出提示框:询问用户是否保存密码; 如果选择”是”,密码会被明文保到 /data/data/com.package.name/databases/webview.db 中,这样就有被盗取密码的危险 解决 关闭密码保存提醒:WebSettings.setSavePassword(false)

  1. 域控制不严格漏洞

getSettings类的方法对 WebView 安全性的影响

3.1 setAllowFileAccess // 设置是否允许 WebView 使用 File 协议 webView.getSettings().setAllowFileAccess(true); 如果不允许使用 file 协议,则不会存在上述的威胁; 但同时也限制了 WebView 的功能,使其不能加载本地的 html 文件

解决 对于不需要使用 file 协议的应用,禁用 file 协议; 对于需要使用 file 协议的应用,禁止 file 协议加载 JavaScript。

3.2 setAllowFileAccessFromFileURLs // 设置是否允许通过 file url 加载的 Js代码读取其他的本地文件 webView.getSettings().setAllowFileAccessFromFileURLs(true); // 在Android 4.1前默认允许 // 在Android 4.1后默认禁止

解决方案 设置setAllowFileAccessFromFileURLs(false);

3.3 setAllowUniversalAccessFromFileURLs // 设置是否允许通过 file url 加载的 Javascript 可以访问其他的源(包括http、https等源) webView.getSettings().setAllowUniversalAccessFromFileURLs(true); // 在Android 4.1前默认允许(setAllowFileAccessFromFileURLs()不起作用) // 在Android 4.1后默认禁止

解决方案 设置setAllowUniversalAccessFromFileURLs(false);

参考: https://blog.csdn.net/carson_ho/article/details/64904635