Android WebView安全方面的一些坑

公司一款app有將近兩年沒有更新了,雖然用戶量不大,但是因為與第三方有合作,出現(xiàn)問題時需要進(jìn)行維護(hù);沒想到最近第三方對他們所有的軟件進(jìn)行了網(wǎng)絡(luò)安全掃描,這款A(yù)ndroid app也未能幸免...

Android安全問題(WebView)

因為app是13年左右開發(fā)的,維護(hù)也只是到16、17年左右就終止了,所以,掃描出不少漏洞;因為是采用了webview+html混合開發(fā),因此,需要解決一些webview相關(guān)的問題:

一、webview隱藏接口問題(任意命令執(zhí)行漏洞)

android webview組件包含3個隱藏的系統(tǒng)接口:searchBoxJavaBridge_, accessibilityTraversal以及accessibility,惡意程序可以通過反射機(jī)制利用它們實現(xiàn)遠(yuǎn)程代碼執(zhí)行;該問題在Android4.4以下版本出現(xiàn)。
于是,在Android3.0到4.4之間的版本,我們通過移除這些隱藏接口,來解決該問題:

    // 19  4.4  Build.VERSION.KITKAT
    // 11  3.0  Build.VERSION_CODES.HONEYCOMB
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB 
        && Build.VERSION.SDK_INT < 19 && webView != null) { 
        webView.removeJavascriptInterface("searchBoxJavaBridge_");
        webView.removeJavascriptInterface("accessibility");
        webView.removeJavascriptInterface("accessibilityTraversal");
    }

二、addJavascriptInterface任何命令執(zhí)行漏洞

在webview中使用js與html進(jìn)行交互是一個不錯的方式,但是,在Android4.2(16,包含4.2)及以下版本中,如果使用addJavascriptInterface,則會存在被注入js接口的漏洞;在4.2之后,由于Google增加了@JavascriptInterface,該漏洞得以解決。
解決該問題,最徹底的方式是在4.2以下放棄使用addJavascriptInterface,采用onJsPrompt或其它方法替換?;蛘呤褂靡恍┓桨竵斫档驮撀┒磳?dǎo)致的風(fēng)險:如使用https并進(jìn)行證書校驗,如果是http則進(jìn)行頁面完整性校驗,如上面所述移除隱藏接口等。

    public boolean onJsPrompt(WebView view, String url, String message,String defaultValue, JsPromptResult result) {
        result.confirm(CGJSBridge.callJava(view, message));
        Toast.makeText(view.getContext(),"message="+message,Toast.LENGTH_LONG).show();
        return true;
    }

三、繞過證書校驗漏洞

webviewClient中有onReceivedError方法,當(dāng)出現(xiàn)證書校驗錯誤時,我們可以在該方法中使用handler.proceed()來忽略證書校驗繼續(xù)加載網(wǎng)頁,或者使用默認(rèn)的handler.cancel()來終端加載。
因為我們使用了handler.proceed(),由此產(chǎn)生了該“繞過證書校驗漏洞”。
如果確定所有頁面都能滿足證書校驗,則不必要使用handler.proceed()

    @SuppressLint("NewApi")
    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        //handler.proceed();// 接受證書
        super.onReceivedSslError(view, handler, error);
    }

四、allowFileAccess導(dǎo)致的File域同源策略繞過漏洞

如果webview.getSettings().setAllowFileAccess(boolean)設(shè)置為true,則會面臨該問題;該漏洞是通過WebView對Javascript的延時執(zhí)行和html文件替換產(chǎn)生的。
解決方案是禁止WebView頁面打開本地文件,即

    webview.getSettings().setAllowFileAccess(false);

或者更直接的禁止使用JavaScript

    webview.getSettings().setJavaScriptEnabled(false);

由于業(yè)務(wù)上的原因,這個解決方案其實并不怎么理想,如果有更好的解決方案,歡迎指教!

個人博客: IT老五
微信公眾號:【IT老五(it-lao5)】,一起源創(chuàng),一起學(xué)習(xí)!

這是都是關(guān)于WebView網(wǎng)絡(luò)安全方面的問題,其他非安全漏洞方面的坑這里就不說了。
做開發(fā)越久,越覺得自己不會的太多;如果文中有錯誤之處,麻煩指出,多謝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容