黑客是如何遠(yuǎn)程攻破你的Android手機(jī)的
“你走進(jìn)一個(gè)咖啡店坐下來。等咖啡的時(shí)候,你拿出你的智能手機(jī)開始玩一款你前些天下載的游戲。接著,你繼續(xù)工作并且在電梯里收郵件。在你不知情下,有攻擊者獲取了公司網(wǎng)絡(luò)的地址并且不斷地感染你所有同事的智能手機(jī)。
等下, 什么?
我們在Bromium實(shí)驗(yàn)室博客上不會(huì)談?wù)揂ndroid太多。但是不時(shí)地我們喜歡修修補(bǔ)補(bǔ)。近來,我的同事Thomas Coudray 和我探索了下Android遠(yuǎn)程代碼執(zhí)行的易損性,想弄明白易損性在現(xiàn)實(shí)應(yīng)用中是多大的問題。
盡管權(quán)限提升技術(shù)在Android上很普遍(并形成了“root”設(shè)備的慣例),但遠(yuǎn)程代碼執(zhí)行是一種罕見且危險(xiǎn)得多的漏洞。它允許攻擊者不經(jīng)授權(quán)就在用戶設(shè)備上執(zhí)行特定代碼。這個(gè)Bug特別另人關(guān)注,因?yàn)?,即使在它被修?fù)后過了18個(gè)月,在安裝了所有補(bǔ)丁的最新型的Android設(shè)備上仍可被利 用。我們想看看,如果這是真的,利用此漏洞需要付出多少努力。我們發(fā)現(xiàn)上述場景完全可能發(fā)生。
我們用了兩種不同的方法研究此Bug。首先,我們嘗試在類似公共WIFI的環(huán)境中利用它,也就是你可能在咖啡店中遇到到環(huán)境。我們啟動(dòng)了一些 Android設(shè)備和廉價(jià)的網(wǎng)絡(luò)設(shè)備,開始攻擊。第二步是估計(jì)普通用戶有多大的可能遇到這種最壞的情形。為此,我們使用了統(tǒng)計(jì)分析技術(shù),看看有多少有漏洞 的App和設(shè)備。
在開始細(xì)節(jié)之前,先了解一下此Bug的背景知識(shí):
背景知識(shí)
它始于2012年的Javascript在addJavascriptInterface API中的遠(yuǎn)程代碼執(zhí)行Bug,CVE-2012-6636(詳情見此處和此處)。此Bug允許Javascript代碼獲得訪問系統(tǒng)的更大權(quán)限,這并非開發(fā)者的本意。至此,如此糟糕。MWR的研究人員在幾個(gè)月后的研究結(jié)果顯示有大量App使用了廣告供應(yīng)商的框架程序,而這些框架程序通常受此Bug影響而且還在運(yùn)行時(shí)下載Javascript代碼。
這些因素結(jié)合起來意味著,大量的App采用不安全的方式從互聯(lián)網(wǎng)下載Javascript代碼,因此惡意攻擊者劫持下載并發(fā)動(dòng)遠(yuǎn)程代碼執(zhí)行的攻擊并不難。
還沒修復(fù)?
Android 4.2修復(fù)了這個(gè)潛在的javascript漏洞。不幸的是,由于向后兼容的原因,修復(fù)只意味著在特定的場景中關(guān)閉了漏洞。現(xiàn)實(shí)中的Android版本碎 片化和Android上的廣告商業(yè)模式意味著這些場景并不常見。我們檢查了Google Play上的100,000個(gè)APK文件,發(fā)現(xiàn)大約有12%即使運(yùn)行在最新的Android設(shè)備上仍然有漏洞風(fēng)險(xiǎn)。
APK分析結(jié)果:一半沒有漏洞風(fēng)險(xiǎn),因?yàn)樗鼈兊哪繕?biāo)SDK版本大于或等于17;剩下的31%沒有使用存在漏洞的API;7%由于APK混淆或分析出錯(cuò)而沒有分析。
另外,不管此漏洞是否被修復(fù),超過50%的Android設(shè)備仍舊使用著低于4.2的版本。對(duì)于這些設(shè)備,沒有修復(fù)程序,它們依舊存在漏洞風(fēng)險(xiǎn)。
技術(shù)點(diǎn)
為了修復(fù)成功,調(diào)用addJavascriptInterface的程序必須編譯為API 17及以上,也就是說你的目標(biāo)Android版本必須是4.2及以后的。為了兼容更多的設(shè)備,App和框架程序經(jīng)常用盡可能低的API版本編譯。重點(diǎn)就是 即使運(yùn)行在打了補(bǔ)丁程序的Android 4.2, 4.3或4.4的設(shè)備上,App仍存在漏洞攻擊風(fēng)險(xiǎn)。
廣告商業(yè)模式在Android中很流行:也就是App免費(fèi),開發(fā)者通過向用戶展示廣告而獲得收入。在Android中,有超過50個(gè)不同的廣告框架 程序,這使得開發(fā)者很容易實(shí)現(xiàn)廣告功能,事實(shí)上他們經(jīng)常在App中使用不只一個(gè)廣告框架程序。有的App發(fā)現(xiàn)使用了20個(gè)之多(見此處的圖4)。這些框架程序大都有這種行為——當(dāng)app第一次運(yùn)行時(shí),它們通過HTTP下載javascript庫。這也就是說App通常不安全地下載了未驗(yàn)證的javascript代碼,而這些代碼運(yùn)行在可執(zhí)行任意代碼的環(huán)境中。
代碼的執(zhí)行意味著對(duì)設(shè)備的無限制訪問
迄今為止,這個(gè)漏洞僅僅允許一個(gè)攻擊者在一個(gè)安卓應(yīng)用環(huán)境中去執(zhí)行代碼。這很糟糕,但是仍然被安卓權(quán)限系統(tǒng)限制在單獨(dú)的應(yīng)用中去訪問數(shù)據(jù)。然而,一 旦一個(gè)攻擊者有了一個(gè)在系統(tǒng)中的立足點(diǎn),這就類似于他們可能獲得額外的特權(quán)。以futex漏洞為例(CVE-2014-3153),它影響當(dāng)前使用的每個(gè) Linux內(nèi)核版本,包括安卓系統(tǒng)以及最近第一次被成功root的Galaxy S5。盡管他們不是等價(jià)的,但我們還是應(yīng)該養(yǎng)成“遠(yuǎn)程代碼執(zhí)行”與“root權(quán)限”在嚴(yán)重等級(jí)上等價(jià)的習(xí)慣,因?yàn)檫t早,一個(gè)下定決心的黑客將可能從一個(gè)地方蹦到另一個(gè)地方,獲取設(shè)備的完全控制權(quán)。
真實(shí)世界中的漏洞利用
我們談了如何利用漏洞和漏洞為什么如此嚴(yán)重?,F(xiàn)在我們撇開分析,驗(yàn)證一下漏洞到底有多容易被利用。
五月中旬,我們從Play Store隨機(jī)下載了102,189個(gè)免費(fèi)的app,并通過統(tǒng)計(jì)分析發(fā)現(xiàn)其中的12.8%存在潛在的漏洞風(fēng)險(xiǎn),正如上圖所示。這些APK同時(shí)使用了過低的 目標(biāo)API版本和addJavascriptInterface API。這些APK調(diào)用addJavascriptInterface時(shí)的漏洞事實(shí)上可以通過中間人攻擊的方式利用,當(dāng)從互聯(lián)網(wǎng)不安全地下載的javascript腳本時(shí)可以發(fā)起中間人攻擊。
我們會(huì)測試通過中間人攻擊劫持非安全的javascript下載,并注入一些javascript腳本來探查addJavascriptInterface漏洞。
#p#
測試app的漏洞
我們設(shè)置了一個(gè)充當(dāng)透明web代理中間人的wifi無線接入點(diǎn)(AP)。它被設(shè)置為對(duì)任何接入此AP的設(shè)備在通過HTTP請(qǐng)求任何腳本時(shí)都注入惡意 代碼。AP設(shè)置了密碼,以防有人誤用,但本方法可以用到公開訪問的AP。即使當(dāng)AP不受控制時(shí),DNS毒化或ARP緩存欺騙等技術(shù)也可以用來實(shí)現(xiàn)中間人代 理?;蛘呖梢园惭b一個(gè)模仿成合法AP的假AP。也就是說,有各種方法實(shí)現(xiàn)中間人代理,使用wifi的任何人都將通過我們的代理訪問網(wǎng)絡(luò)。
javascript的動(dòng)態(tài)性意味著我們不需要檢測特定的應(yīng)用程序或廣告框架程序以作為目標(biāo)。當(dāng)運(yùn)行時(shí),惡意代碼掃描整個(gè)javascript命名 空間中的對(duì)象,查找不正確地使用了addJavascriptInterface API的對(duì)象,然后對(duì)每個(gè)進(jìn)行漏洞測試。如果沒有找到漏洞,它就靜悄悄地退出,不影響app的運(yùn)行。如果成功了,它將運(yùn)行一個(gè)shell命令啟動(dòng)計(jì)算器 app(這是漏洞揭露中的一個(gè)傳統(tǒng),表明你完成了代碼運(yùn)行——如何你可以啟動(dòng)計(jì)算器,你就證明了可以執(zhí)行任何代碼)。
注入的 javascript片斷
- function findVulnerableObject() {
- for (var prop in window) {
- try {
- // If getClass() doesn’t throw, the object is vulnerable
- window[prop].getClass();
- return window[prop];
- }
- catch(err) { }
- }
- return null;
- }
我設(shè)置好AP后,從13,119個(gè)標(biāo)明有潛在漏洞的app中隨機(jī)選了一些,把它們安裝到接入了AP的一臺(tái)Nexus 5(運(yùn)行4.4.3)和一臺(tái)三星XE700t(運(yùn)行AOSP 4.2的x86平板)。我們只不過是啟動(dòng)每個(gè)App,做些簡單的交互操作,就成功地在超過半數(shù)的應(yīng)用中觸發(fā)了遠(yuǎn)程代碼執(zhí)行,它們加載了通過中間人代理注入 的惡意代碼。
為了好玩,我們把注入到一個(gè)app中javascript代碼反復(fù)修改,直到顯示Bromium的標(biāo)志替換了原有廣告。
被擾亂而顯示了Bromium標(biāo)志的app的UI截屏。
全是廣告惹得禍
通過查看TCP/IP包的軌跡,很快發(fā)現(xiàn)廣告框架程序就是聯(lián)合使用了addJavascriptInterface和非安全HTTP下載的罪魁禍 首。在我們調(diào)查的框架程序中沒有一個(gè)使用HTTPS,也就意味著任何使用這些框架程序的app在非安全地下載javascript時(shí)也易受到攻擊。以往的 研究顯示有17%的app雖然使用了HTTPS,但用法不當(dāng),但這是另一回事了。
我們認(rèn)真地檢查了一些app,看看使用用了哪些廣告框架。AdMob是用得最多的(通常也是更新最頻繁的),但我們發(fā)現(xiàn)用到的大量框架仍然在不安全 地使用addJavascriptInterface。在檢查的app中,有超過80%的非付費(fèi)app包含了至少一款廣告框架??傮w上講,在識(shí)別的 2140個(gè)app中出現(xiàn)了4190個(gè)廣告框架。
問題有多嚴(yán)重?
Google在Play Store上公布了所有app的大致下載量。僅就我們手工確認(rèn)了存在漏洞的小部分用例,就有超過1.5億的下載量。這并不是說就保證會(huì)有150,000,000部有漏洞的設(shè)備,因?yàn)橐慌_(tái)設(shè)備可能安裝多個(gè)不同的有漏洞的應(yīng)用。但考慮到我們在分析中發(fā)現(xiàn)的比例——10%的app有潛在的風(fēng)險(xiǎn),其中有50%的有風(fēng)險(xiǎn)的app被實(shí)地測試可以被攻擊——這就存在非常多有漏洞的設(shè)備。
而且,別忘了有57%的Android設(shè)備運(yùn)行在低于4.2的版本上。所以即使明天所有有漏洞的app和框架打上了基于4.2的補(bǔ)丁,仍然有超過一半的Android設(shè)備不能修復(fù)這個(gè)漏洞。
一旦你實(shí)現(xiàn)了遠(yuǎn)程代碼的執(zhí)行,結(jié)束之前在咖啡店所描述的災(zāi)難情形,不是什么大的進(jìn)步。初始化一個(gè)匹配的root權(quán)限(不幸的是,相當(dāng)一部分在安卓平 臺(tái)上),一個(gè)被損害的設(shè)備會(huì)變成某種中間人,它隨后會(huì)進(jìn)入任何網(wǎng)絡(luò)。因此,攻擊開始傳播,舉例來說,在自帶移動(dòng)設(shè)備的世界里,共同的wifi網(wǎng)絡(luò)是那樣地 受歡迎。
合并設(shè)備分析器(Device Analyser)的數(shù)據(jù)
設(shè)備分析器(Device Analyser)是另外一個(gè)用于統(tǒng)計(jì)安卓設(shè)備的(數(shù)據(jù))來源。其中的一項(xiàng)功能就是它追蹤用戶啟動(dòng)不同的應(yīng)用的頻繁程度。他們用足夠地耐心去相互參照潛在缺陷應(yīng)用的列表上的數(shù)據(jù),給出了下面的結(jié)果:
每天每用戶打開潛在缺陷應(yīng)用的平均數(shù)量
過去一年左右的時(shí)間,設(shè)備分析器(Device Analyser)的數(shù)據(jù)顯示設(shè)備的使用者們每天平均打開0.4-0.5個(gè)潛在漏洞的應(yīng)用?;蛘邠Q言之,平均一周內(nèi)就有幾次收到(漏洞)攻擊。我們不能假 設(shè)應(yīng)用的版本比我們分析過存在漏洞的版本新,因此,當(dāng)我們的示例數(shù)據(jù)已不再是最新版本,與圖形對(duì)應(yīng)也就表現(xiàn)為急劇下降。如果我們對(duì)最近的APK版本重新進(jìn) 行我們的分析,我們很有可能看到它仍在0.4分。DA( 設(shè)備分析器: Device Analyser)的數(shù)據(jù)是一個(gè)相當(dāng)小的樣本,讓它去引導(dǎo)更多地關(guān)于安卓設(shè)備的結(jié)論,在整體上是困難的。
結(jié)論
我們發(fā)現(xiàn),通過使用相對(duì)簡單的中間人代理技術(shù),無需特定的應(yīng)用程序或設(shè)備可以遠(yuǎn)程運(yùn)行有危害的應(yīng)用程序,即使 Android設(shè)備安裝了完全補(bǔ)丁。使用靜態(tài)分析我們發(fā)現(xiàn),相當(dāng)大比例的應(yīng)用很可能仍然脆弱,我們證實(shí),通過隨機(jī)測試超過一半的應(yīng)用確實(shí)缺乏抵抗力。
因此,我們建議當(dāng)連接到一個(gè)不可信的wi-fi無線網(wǎng)絡(luò)時(shí)不要使用任何Android應(yīng)用程序顯示廣告。
我們感謝Evozi提供他們的APK庫,和劍橋大學(xué)的設(shè)備分析數(shù)據(jù)。