Android WebView遠(yuǎn)程執(zhí)行代碼漏洞淺析

原文:http://blog.csdn.net/fengling59/article/details/50379522

在過(guò)去的一段時(shí)間里,WebView遠(yuǎn)程代碼執(zhí)行漏洞可以說(shuō)是橫掃了一大批的Android App辙浑,查詢Wooyun平臺(tái)可以得到大致的情況,鑒于很多存在漏洞的App并沒(méi)有披露司志,因此WebVeiw遠(yuǎn)程執(zhí)行代碼漏洞的影響程度會(huì)更大。由于Google Android 系統(tǒng)碎片化程度很高降宅,大量的Android系統(tǒng)無(wú)法得到及時(shí)有效地更新骂远,這個(gè)漏洞目前依然在被利用。

本文從WebView的概念開(kāi)始詳細(xì)介紹了webView漏洞的成因腰根,利用和檢測(cè)方法激才,并在文章的末尾對(duì)此類漏洞進(jìn)行了一些思考和總結(jié)。

一. WebView 的簡(jiǎn)介

根據(jù)Google的文檔额嘿,WebView 就是A View that displays web pages 繼承的結(jié)構(gòu)如下:

從上圖中可以得知瘸恼,WebView 也是一個(gè)View,在Android 中一個(gè)View就可以簡(jiǎn)單地理解為顯示在屏幕上的一個(gè)界面册养,而WebView就是用于展示W(wǎng)eb頁(yè)面的界面东帅。Android的WebView的主要作用有下面兩個(gè):

Activity上顯示在線的網(wǎng)頁(yè)內(nèi)容

WebView可以實(shí)現(xiàn)一個(gè)接受簡(jiǎn)單控制的Web瀏覽器

WebView的實(shí)現(xiàn)發(fā)生了很大的改變,在Android < 4.4 (KitKat)上的WebView是基于Webkit實(shí)現(xiàn)的球拦,而Android >= 4.4 的WebView 則是基于Chrome for Android version 30實(shí)現(xiàn)的靠闭,因此差異十分明顯。

在Android系統(tǒng)中使用WebView是很容易的坎炼,首先需要在layout 中定義WebView節(jié)點(diǎn)愧膀。

在layout中添加了WebView節(jié)點(diǎn)后,在Activity中就可以直接使用了谣光,

打開(kāi)WebView的Activity檩淋,就會(huì)訪問(wèn)index.html頁(yè)面,這就是WebView的基本用法萄金。

二. WebView RCE 相關(guān)的幾個(gè)CVE

進(jìn)幾年和WebView遠(yuǎn)程代碼執(zhí)行相關(guān)的漏洞主要有CVE-2012-6336,CVE-2014-1939,CVE-2014-7224, 這些漏洞中最核心的漏洞是CVE-2012-6336蟀悦,另外兩個(gè)CVE只是發(fā)現(xiàn)了幾個(gè)默認(rèn)存在的接口,下面就具體說(shuō)明這些漏洞的情況氧敢。

3.1 CVE-2012-6636

Android API 16.0及之前的版本中存在安全漏洞日戈,該漏洞源于程序沒(méi)有正確限制使用WebView.addJavascriptInterface方法。遠(yuǎn)程攻擊者可通過(guò)使用Java Reflection API利用該漏洞執(zhí)行任意Java對(duì)象的方法

Google Android <= 4.1.2 (API level 16) 受到此漏洞的影響福稳。

3.2 CVE-2014-1939

java/android/webkit/BrowserFrame.java 使用addJavascriptInterface API并創(chuàng)建了SearchBoxImpl類的對(duì)象涎拉。攻擊者可通過(guò)訪問(wèn)searchBoxJavaBridge_接口利用該漏洞執(zhí)行任意Java代碼。

Google Android <= 4.3.1 受到此漏洞的影響

3.3 CVE-2014-7224

香港理工大學(xué)的研究人員發(fā)現(xiàn)當(dāng)系統(tǒng)輔助功能中的任意一項(xiàng)服務(wù)被開(kāi)啟后的圆,所有由系統(tǒng)提供的WebView都會(huì)被加入兩個(gè)JS objects鼓拧,分別為是accessibility和accessibilityTraversal。惡意攻擊者就可以使用accessibilityaccessibilityTraversal這兩個(gè)Java Bridge來(lái)執(zhí)行遠(yuǎn)程攻擊代碼.

Google Android < 4.4 受到此漏洞的影響越妈。

三. WebView RCE 漏洞分析

要理解WebView 的遠(yuǎn)程代碼執(zhí)行漏洞首先要理解JAVA的反射機(jī)制(Java Reflection)

4.1 Java Reflection

反射是java語(yǔ)言提供的一種機(jī)制季俩,使Java程序可以在運(yùn)行時(shí)檢查類、接口梅掠、方法和成員酌住,而不需要在編譯的時(shí)候知道類的名字和方法等細(xì)節(jié)信息。

JAVA反射機(jī)制是在運(yùn)行狀態(tài)中阎抒,對(duì)于任意一個(gè)類酪我,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為java語(yǔ)言的反射機(jī)制且叁。

為了使用Java Reflection都哭,我們首先需要了解獲得Class Object的方法,一般的情況下有下面幾種方法逞带。

Classc1=Test.class;

Classc2=Class.forName(“com.reflection.Test”);

Classc3=newTest().getClass();

得到了Class object 后就可以得到非常強(qiáng)大的能力欺矫,Class Object是Reflection API 中的核心,一般常用的方法有下面幾個(gè):

– getName()

– getFields()

– getDeclaredFields()

– getMethods()

為了更好地理解展氓,參考下面的幾個(gè)比較典型的例子

4.1.1 執(zhí)行Private 方法

packageReflect;

importjava.lang.reflect.Method;

classDemo{

privatevoida1(){

System.out.println("I am a1");

}

publicvoida2(){

System.out.println("I am a2");

}

}

classhello{

publicstaticvoidmain(String[]args){

Demodemo=newDemo();

ClassmObjectClass=demo.getClass();

System.out.println(mObjectClass.getName());

Method[]methods=mObjectClass.getDeclaredMethods();

for(Methodmethod:methods){

System.out.println("method = "+method.getName());

}

try{

Objecto=mObjectClass.newInstance();

methods[0].setAccessible(true);

methods[0].invoke(o);

}catch(Throwablee){

}

}

}

>javac-d.Reflect/hello.java

>javaReflect.hello

運(yùn)行結(jié)果:

Reflect.Demo

method=a1

method=a2

Iama1

利用反射的方法穆趴,我們已經(jīng)成功調(diào)用了Demo的private a1 方法。

4.1.2 執(zhí)行命令

packageReflect;

importjava.lang.reflect.Method;

classDemo{

publicvoida1(){

}

publicvoida2(){

}

}

classhello{

publicstaticvoidmain(String[]args){

Demodemo=newDemo();

ClassmObjectClass=demo.getClass();

System.out.println(mObjectClass.getName());

Method[]methods=mObjectClass.getMethods();

for(Methodmethod:methods){

System.out.println("method = "+method.getName());

}

try{

Classc=mObjectClass.forName("java.lang.Runtime");

Methodm=c.getMethod("getRuntime",null);

m.setAccessible(true);

Objectobj=m.invoke(null,null);

Classc2=obj.getClass();

String[]array={"/bin/sh","-c","id > /tmp/id"};

Methodn=c2.getMethod("exec",array.getClass());

n.invoke(obj,newObject[]{array});

}catch(Throwablee){

System.out.println(e.toString());

}

}

}

執(zhí)行上面的java 代碼遇汞,會(huì)將 id 命令的結(jié)果寫(xiě)入 /tmp/id 文件未妹,這個(gè)代碼其和WebView漏洞的實(shí)際情況已經(jīng)很接近了。

4.2 WebView的addJavascriptInterface 方法

接下來(lái)我們來(lái)看看WebView漏洞的實(shí)際情況勺疼,Android 官方網(wǎng)站對(duì)addJavascriptInterface的介紹如下:

publicvoidaddJavascriptInterface(Objectobject,Stringname)

AddedinAPIlevel1

InjectsthesuppliedJavaobjectintothisWebView.Theobjectisinjected

intotheJavaScriptcontextofthemainframe,usingthesuppliedname.

ThisallowstheJavaobject'smethodstobeaccessedfromJavaScript.

ForapplicationstargetedtoAPIlevelJELLY_BEAN_MR1andabove,

onlypublicmethodsthatareannotatedwithJavascriptInterfacecanbe

accessedfromJavaScript.ForapplicationstargetedtoAPIlevel

JELLY_BEANorbelow,allpublicmethods(includingtheinheritedones)

canbeaccessed,seetheimportantsecuritynotebelowforimplications.

NotethatinjectedobjectswillnotappearinJavaScriptuntilthe

pageisnext(re)loaded.Forexample:

classJsObject{

@JavascriptInterface

publicStringtoString(){return"injectedObject";}

}

webView.addJavascriptInterface(newJsObject(),"injectedObject");

webView.loadData("","text/html",null);

webView.loadUrl("javascript:alert(injectedObject.toString())");

從上面的介紹我們可以了解到教寂,addJavascriptInterface往 WebView里注入了一個(gè)Java Object, 而這個(gè)Jave Object 的方法可以被Javascript 訪問(wèn)。之所以提供addJavascriptInterface是為了WebView中的Javascript可以和本地的App通訊执庐,這確實(shí)是一個(gè)很強(qiáng)大的功能酪耕,這么做的好處在于本地App邏輯不變的情況下,不需要升級(jí)App就可以對(duì)程序進(jìn)行更新轨淌,修改相應(yīng)的Web頁(yè)面就可以了迂烁。

但是在Android 的早期版本并沒(méi)有對(duì)可以訪問(wèn)的方法做限制,利用Java 的反射機(jī)制递鹉,可以調(diào)用任意對(duì)象的任意方法盟步,這就是WebView漏洞的根本成因。

四. WebView RCE漏洞利用方法

使用受漏洞影響的WebView訪問(wèn)包含下面腳本的頁(yè)面就會(huì)執(zhí)行相關(guān)的命令躏结。

jsinterface是導(dǎo)出的Java對(duì)象却盘,如果利用成功,獲得的權(quán)限是app的用戶權(quán)限,也就是說(shuō)利用WebView漏洞獲得的權(quán)限是app的權(quán)限黄橘,受限于Android application sandbox, 受限于AndroidManifest.xml中申請(qǐng)的權(quán)限兆览。像上面的語(yǔ)句要成功寫(xiě)入文件,需要AndroidManifest.xml中存在 android.permission.WRITE_EXTERNAL_STORAGE 權(quán)限塞关。

五. WebView 遠(yuǎn)程漏洞檢測(cè)

使用WebView訪問(wèn)下面頁(yè)面抬探,輸出的接口名稱則存在漏洞。利用Ajax等方法完全可以對(duì)WebView漏洞進(jìn)行自動(dòng)化測(cè)試帆赢。

在Android 4.1.2 分兩種情況訪問(wèn)測(cè)試頁(yè)面小压,測(cè)試的結(jié)果如下:

(1) 沒(méi)有打開(kāi)任何一個(gè)輔助功能

(2) 打開(kāi)一個(gè)輔助功能

在沒(méi)有打補(bǔ)丁的情況下,已經(jīng)成功地檢測(cè)出CVE-2014-1939和CVE-2014-7224漏洞中所指出的有JS object椰于,這個(gè)漏洞檢測(cè)代碼是有效的怠益。

六. 修復(fù)方法和現(xiàn)狀

Google宣布不為小于Android 4.4 的系統(tǒng)提供WebView補(bǔ)丁, 具體可以參見(jiàn)鏈接:

https://community.rapid7.com/community/metasploit/blog/2015/01/11/google-no-longer-provides-patches-for-webview-jelly-bean-and-prior

因此要解決WebView的RCE漏洞,靠譜的方法是升級(jí)Android系統(tǒng)瘾婿,至少要升級(jí)到 API level 17 (Android 4.2), WebView 除了最嚴(yán)重的RCE漏洞溉痢,還有各種SOP漏洞,所以至少要升級(jí)到Android 4.4才能保證安全憋他,小于Android 4.4 Google不提供補(bǔ)丁孩饼。Android 4.4 以后使用以chrome為基礎(chǔ)的WebView。

升級(jí)系統(tǒng)API level 17后竹挡,只有顯示添加 @JavascriptInterface的方法才能被JavaScript調(diào)用镀娶,這樣反射就失去作用了。

建議在使用WebView的代碼刪除出問(wèn)題的接口揪罕,具體代碼如下: removeJavascriptInterface(“accessibility”); removeJavascriptInterface(“accessibilityTraversal”); removeJavascriptInterface(“searchBoxJavaBridge_”);

七. 一些思考

由于Java 反射所帶來(lái)的安全問(wèn)題并不在少數(shù)梯码,這也給我們發(fā)掘相關(guān)漏洞提供了思路。比如CVE-2010-1871的jboss seam framework RCE好啰。

看看這個(gè)利用代碼是不是非常的相似轩娶。還有前段很火爆的Spring Framework Remote Code with Expression Language Injection,原理都是類似的框往。

真正的新漏洞并不多鳄抒,人們大多數(shù)時(shí)候都在犯同樣的錯(cuò)誤,雖然俗話說(shuō)人們不應(yīng)該在同樣的地方摔倒兩次椰弊,但是在網(wǎng)絡(luò)安全的世界里许溅,人們卻總是在同樣的地方摔倒。

參考資料:

https://developer.chrome.com/multidevice/webview/overview

http://developer.android.com/reference/android/webkit/WebView.html

https://daoyuan14.github.io/news/newattackvector.html

http://droidsploit.baidu.com/view/14100201.html

http://tutorials.jenkov.com/javareflection/index.html

http://javaxden.blogspot.sg/2007/08/hack-any-java-class-using-reflection.html

http://www.programcreek.com/2013/09/java-reflection-tutorial

https://labs.mwrinfosecurity.com/blog/2012/04/23/adventures-with-android-webviews

https://labs.mwrinfosecurity.com/advisories/2013/09/24/webview-addjavascriptinterface-remote-code-execution

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末秉版,一起剝皮案震驚了整個(gè)濱河市贤重,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌清焕,老刑警劉巖并蝗,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祭犯,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡滚停,警方通過(guò)查閱死者的電腦和手機(jī)盹憎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)铐刘,“玉大人,你說(shuō)我怎么就攤上這事影晓×常” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵挂签,是天一觀的道長(zhǎng)疤祭。 經(jīng)常有香客問(wèn)我,道長(zhǎng)饵婆,這世上最難降的妖魔是什么勺馆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮侨核,結(jié)果婚禮上草穆,老公的妹妹穿的比我還像新娘。我一直安慰自己搓译,他們只是感情好悲柱,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著些己,像睡著了一般豌鸡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上段标,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天涯冠,我揣著相機(jī)與錄音,去河邊找鬼逼庞。 笑死蛇更,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赛糟。 我是一名探鬼主播械荷,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼虑灰!你這毒婦竟也來(lái)了吨瞎?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤穆咐,失蹤者是張志新(化名)和其女友劉穎颤诀,沒(méi)想到半個(gè)月后字旭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡崖叫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年遗淳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片心傀。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡屈暗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出脂男,到底是詐尸還是另有隱情养叛,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布宰翅,位于F島的核電站弃甥,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏汁讼。R本人自食惡果不足惜淆攻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嘿架。 院中可真熱鬧瓶珊,春花似錦、人聲如沸耸彪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)搜囱。三九已至丑瞧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蜀肘,已是汗流浹背绊汹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扮宠,地道東北人西乖。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像坛增,于是被迫代替她去往敵國(guó)和親获雕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345