0X01 前言
Intent scheme url是一種用於在web頁面中啓動終端app activity的特殊URL,在針對intent scheme URL攻擊大爆發以前,不少android的瀏覽器都支持intent scheme url。
Intent scheme url的引入雖然帶來了必定的便捷性,但從另一方面看,給惡意攻擊頁面經過intent-based攻擊終端上已安裝應用提供了便利,儘管瀏覽器app已經採起了必定的安全策略來減小這一類風險,但顯然是不夠的。
2014年3月,一篇關於intent scheme url攻擊的文章:
Whitepaper – Attacking Android browsers via intent scheme URLs
詳細介紹了相關的攻擊手法,以後國內的漏洞收集平臺上開始被這一類型漏洞刷屏。
0X02 Intent scheme url解析
一個intent scheme url的使用示例:
若是瀏覽器支持intent scheme url,在加載了改web頁面後,將根據url生成一個intent,並嘗試經過intent打來指定的activity。此過程當中瀏覽器的須要完成的工做能夠拆分爲3步:
Step1:
根據url生成對應的intent object,此過程經過如下代碼完成:
Intent intent = Intent.parseUri(url);
intent scheme url的內容能夠根據一下語法規則設置的比較完善:
intent:android
HOST/URI-path // Optional host #Intent; package=[string]; action=[string]; category=[string]; component=[string]; scheme=[string]; end;
Step2:
intent過濾,安全起見,不少瀏覽器對step1中的intent object進行過濾,以抵禦intent-based攻擊,不用的瀏覽器,過濾規則各不相同。
Step3:
組件調用,最後一步就是使用step2過濾後的intent調用指定的組件,瀏覽器中通常使用Context#startActivityIfNeeded() 或者 Context#startActivity()方法實現。
下面是各大瀏覽器對Intent scheme URL的支持狀況 :
web
0X03攻擊場景
主要由兩種攻擊場景。
類型1:瀏覽器攻擊
由於intent是瀏覽器依據url生成並以瀏覽器本身的身份發送的,所以攻擊者惡意頁面中的intent scheme url不只能夠調起導出組件,還能夠調起私有組件。
類型2:終端上安裝的任意APP
intent-based攻擊通常是經過終端上安裝的惡意app來實現的,但經過瀏覽器加載包含特定intent scheme url的惡意頁面,能夠實現對終端上安裝的任意app遠程intent-based攻擊的效果。在2013年東京的Pwn2Own上比賽上,次攻擊方式被應用於攻陷三星Samsung Galaxy S4。chrome
0X04 攻擊案例
如下介紹三個瀏覽器的intent scheme url攻擊案例,攻擊主要源於這些瀏覽器在step2(也就是intent過濾過程)中存在缺陷。
Opera mobile for Android cookie theft
Opera瀏覽器中缺乏intent過濾步驟,一次能夠經過惡意頁面中的intent scheme url調起瀏覽器的任意activity,包括私有的activity,經過以下攻擊代碼能夠獲取到Opera瀏覽器的cookie:
"com.admarvel.android.ads.AdMarvelActivity"是Opera瀏覽器的私有組件,"url=file:///data/data/com.opera.browser/app_opera/cookies"是Opera瀏覽器cookie文件的存放位置。
Chrome for Android UXSS (Universal XSS)
Chrome的UXSS漏洞利用相對複雜,這裏先介紹一下Intent Selector。Intent Selector機制提供一種main intent不匹配的狀況下能夠設置替補的方案。以下的intent scheme url:
其中「SEL」是selector intent的標識。
在chrome中包含如下代碼:
1:Intent intent = Intent.parseUri(uri);
2:intent.addCategory("android.intent.category.BROWSABLE");
3:intent.setComponent(null);
4:context.startActivityIfNeeded(intent, -1);
第二行添加了BROWSABLE category(目標Activity容許自己經過 Web 瀏覽器啓動,以顯示連接引用的數據,以此過濾/防止一些不應被調起的組件被調起),第三行將組建設置爲null,用以抵禦intent-based攻擊,但若是使用selector intent能夠完美的bypass以上限制。
如下是android chrome上的一個UXSS攻擊的POC:
Old stock browser cookie theft
Android stock browser (com.android.browser)的問題相似於android chrome,一樣是在step2中對intent的過濾問題,最終攻擊者能夠盜取瀏覽器的cookie。此漏洞可能只存在於Android 4.3如下的設備,以後的版本中不必定預裝stock browser。
0X05 總結
有效抵禦intent scheme url攻擊的方法主要是在step2中對intent作嚴格的安全限制:瀏覽器
// convert intent scheme URL to intent object Intent intent = Intent.parseUri(uri); // forbid launching activities without BROWSABLE category intent.addCategory("android.intent.category.BROWSABLE"); // forbid explicit call intent.setComponent(null); // forbid intent with selector intent intent.setSelector(null); // start the activity by the intent context.startActivityIfNeeded(intent, -1);
0X06 參考
http://www.mbsd.jp/Whitepaper...
騰訊御安全爲開發者推出了安全保護服務,其中包括漏洞掃描、應用加固、SO加固等,可以幫助企業軟件發現潛在漏洞風險、防逆向、防篡改、防二次打包。有需求的團隊能夠登陸御安全官網試用。
(騰訊御安全原創,轉載請註明來源)安全