Android安全开发之WebView中的地雷(1)

yaq 御安全 关注 入门新人 普通
发表于其他技术文章版块

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任意代码执行漏洞:

Image

以聚美优品为例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

Image

 

 


评论列表 评论
yaq 御安全 入门新人 普通 2#
续篇在http://www.hadsky.com/index.php?c=read&id=518&page=1
共0条回复,点击查看回复
发布评论

评论: Android安全开发之WebView中的地雷(1)

已有0次打赏
(3) 分享
分享

请保存二维码或复制链接进行分享

取消