黑客是如何遠端攻破你的Android手機的

techug發表於2014-11-08

“你走進一個咖啡店坐下來。等咖啡的時候,你拿出你的智慧手機開始玩一款你前些天下載的遊戲。接著,你繼續工作並且在電梯裡收郵件。在你不知情下,有攻擊者獲取了公司網路的地址並且不斷地感染你所有同事的智慧手機。

等下, 什麼?

我們在Bromium實驗室部落格上不會談論Android太多。但是不時地我們喜歡修修補補。近來,我的同事Thomas Coudray 和我探索了下Android遠端程式碼執行的易損性,想弄明白易損性在現實應用中是多大的問題。

儘管許可權提升技術在Android上很普遍(並形成了“root”裝置的慣例),但遠端程式碼執行是一種罕見且危險得多的漏洞。它允許攻擊者不經授權就在使用者裝置上執行特定程式碼。這個Bug特別另人關注,因為,即使在它被修復後過了18個月,在安裝了所有補丁的最新型的Android裝置上仍可被利 用。我們想看看,如果這是真的,利用此漏洞需要付出多少努力。我們發現上述場景完全可能發生。

我們用了兩種不同的方法研究此Bug。首先,我們嘗試在類似公共WIFI的環境中利用它,也就是你可能在咖啡店中遇到到環境。我們啟動了一些 Android裝置和廉價的網路裝置,開始攻擊。第二步是估計普通使用者有多大的可能遇到這種最壞的情形。為此,我們使用了統計分析技術,看看有多少有漏洞 的App和裝置。

在開始細節之前,先了解一下此Bug的背景知識:

背景知識

它始於2012年的Javascript在addJavascriptInterface API中的遠端程式碼執行Bug,CVE-2012-6636(詳情見此處此處)。此Bug允許Javascript程式碼獲得訪問系統的更大許可權,這並非開發者的本意。至此,如此糟糕。MWR的研究人員在幾個月後的研究結果顯示有大量App使用了廣告供應商的框架程式,而這些框架程式通常受此Bug影響而且還在執行時下載Javascript程式碼。

這些因素結合起來意味著,大量的App採用不安全的方式從網際網路下載Javascript程式碼,因此惡意攻擊者劫持下載並發動遠端程式碼執行的攻擊並不難。

還沒修復?

Android 4.2修復了這個潛在的javascript漏洞。不幸的是,由於向後相容的原因,修復只意味著在特定的場景中關閉了漏洞。現實中的Android版本碎 片化和Android上的廣告商業模式意味著這些場景並不常見。我們檢查了Google Play上的100,000個APK檔案,發現大約有12%即使執行在最新的Android裝置上仍然有漏洞風險。

Breakdown of APKs using addJavascriptInterface()

APK分析結果:一半沒有漏洞風險,因為它們的目標SDK版本大於或等於17;剩下的31%沒有使用存在漏洞的API;7%由於APK混淆或分析出錯而沒有分析。

另外,不管此漏洞是否被修復,超過50%的Android裝置仍舊使用著低於4.2的版本。對於這些裝置,沒有修復程式,它們依舊存在漏洞風險。

技術點

為了修復成功,呼叫addJavascriptInterface的程式必須編譯為API 17及以上,也就是說你的目標Android版本必須是4.2及以後的。為了相容更多的裝置,App和框架程式經常用盡可能低的API版本編譯。重點就是 即使執行在打了補丁程式的Android 4.2, 4.3或4.4的裝置上,App仍存在漏洞攻擊風險。

廣告商業模式在Android中很流行:也就是App免費,開發者通過向使用者展示廣告而獲得收入。在Android中,有超過50個不同的廣告框架 程式,這使得開發者很容易實現廣告功能,事實上他們經常在App中使用不只一個廣告框架程式。有的App發現使用了20個之多(見此處的圖4)。這些框架程式大都有這種行為——當app第一次執行時,它們通過HTTP下載javascript庫。這也就是說App通常不安全地下載了未驗證的javascript程式碼,而這些程式碼執行在可執行任意程式碼的環境中。

程式碼的執行意味著對裝置的無限制訪問

迄今為止,這個漏洞僅僅允許一個攻擊者在一個安卓應用環境中去執行程式碼。這很糟糕,但是仍然被安卓許可權系統限制在單獨的應用中去訪問資料。然而,一 旦一個攻擊者有了一個在系統中的立足點,這就類似於他們可能獲得額外的特權。以futex漏洞為例(CVE-2014-3153),它影響當前使用的每個 Linux核心版本,包括安卓系統以及最近第一次被成功root的Galaxy S5。儘管他們不是等價的,但我們還是應該養成“遠端程式碼執行”與“root許可權”在嚴重等級上等價的習慣,因為遲早,一個下定決心的黑客將可能從一個地方蹦到另一個地方,獲取裝置的完全控制權。

真實世界中的漏洞利用

我們談了如何利用漏洞和漏洞為什麼如此嚴重。現在我們撇開分析,驗證一下漏洞到底有多容易被利用。

五月中旬,我們從Play Store隨機下載了102,189個免費的app,並通過統計分析發現其中的12.8%存在潛在的漏洞風險,正如上圖所示。這些APK同時使用了過低的 目標API版本和addJavascriptInterface API。這些APK呼叫addJavascriptInterface時的漏洞事實上可以通過中間人攻擊的方式利用,當從網際網路不安全地下載的javascript指令碼時可以發起中間人攻擊。

我們會測試通過中間人攻擊劫持非安全的javascript下載,並注入一些javascript指令碼來探查addJavascriptInterface漏洞。

測試app的漏洞

我們設定了一個充當透明web代理中間人的wifi無線接入點(AP)。它被設定為對任何接入此AP的裝置在通過HTTP請求任何指令碼時都注入惡意 程式碼。AP設定了密碼,以防有人誤用,但本方法可以用到公開訪問的AP。即使當AP不受控制時,DNS毒化或ARP快取欺騙等技術也可以用來實現中間人代 理。或者可以安裝一個模仿成合法AP的假AP。也就是說,有各種方法實現中間人代理,使用wifi的任何人都將通過我們的代理訪問網路。

Man in the middle setup

javascript的動態性意味著我們不需要檢測特定的應用程式或廣告框架程式以作為目標。當執行時,惡意程式碼掃描整個javascript命名 空間中的物件,查詢不正確地使用了addJavascriptInterface API的物件,然後對每個進行漏洞測試。如果沒有找到漏洞,它就靜悄悄地退出,不影響app的執行。如果成功了,它將執行一個shell命令啟動計算器 app(這是漏洞揭露中的一個傳統,表明你完成了程式碼執行——如何你可以啟動計算器,你就證明了可以執行任何程式碼)。

注入的 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; 
}

我設定好AP後,從13,119個標明有潛在漏洞的app中隨機選了一些,把它們安裝到接入了AP的一臺Nexus 5(執行4.4.3)和一臺三星XE700t(執行AOSP 4.2的x86平板)。我們只不過是啟動每個App,做些簡單的互動操作,就成功地在超過半數的應用中觸發了遠端程式碼執行,它們載入了通過中間人代理注入 的惡意程式碼。

為了好玩,我們把注入到一個app中javascript程式碼反覆修改,直到顯示Bromium的標誌替換了原有廣告。

被擾亂而顯示了Bromium標誌的app的UI截圖。

全是廣告惹得禍

通過檢視TCP/IP包的軌跡,很快發現廣告框架程式就是聯合使用了addJavascriptInterface和非安全HTTP下載的罪魁禍 首。在我們調查的框架程式中沒有一個使用HTTPS,也就意味著任何使用這些框架程式的app在非安全地下載javascript時也易受到攻擊。以往的 研究顯示有17%的app雖然使用了HTTPS,但用法不當,但這是另一回事了。

我們認真地檢查了一些app,看看使用用了哪些廣告框架。AdMob是用得最多的(通常也是更新最頻繁的),但我們發現用到的大量框架仍然在不安全 地使用addJavascriptInterface。在檢查的app中,有超過80%的非付費app包含了至少一款廣告框架。總體上講,在識別的 2140個app中出現了4190個廣告框架。

問題有多嚴重?

Google在Play Store上公佈了所有app的大致下載量。僅就我們手工確認了存在漏洞的小部分用例,就有超過1.5億的下載量。這並不是說就保證會有150,000,000部有漏洞的裝置,因為一臺裝置可能安裝多個不同的有漏洞的應用。但考慮到我們在分析中發現的比例——10%的app有潛在的風險,其中有50%的有風險的app被實地測試可以被攻擊——這就存在非常多有漏洞的裝置。

而且,別忘了有57%的Android裝置執行在低於4.2的版本上。所以即使明天所有有漏洞的app和框架打上了基於4.2的補丁,仍然有超過一半的Android裝置不能修復這個漏洞。

一旦你實現了遠端程式碼的執行,結束之前在咖啡店所描述的災難情形,不是什麼大的進步。初始化一個匹配的root許可權(不幸的是,相當一部分在安卓平 臺上),一個被損害的裝置會變成某種中間人,它隨後會進入任何網路。因此,攻擊開始傳播,舉例來說,在自帶移動裝置的世界裡,共同的wifi網路是那樣地 受歡迎。

合併裝置分析器(Device Analyser)的資料

裝置分析器(Device Analyser)是另外一個用於統計安卓裝置的(資料)來源。其中的一項功能就是它追蹤使用者啟動不同的應用的頻繁程度。他們用足夠地耐心去相互參照潛在缺陷應用的列表上的資料,給出了下面的結果:

每天每使用者開啟潛在缺陷應用的平均數量

過去一年左右的時間,裝置分析器(Device Analyser)的資料顯示裝置的使用者們每天平均開啟0.4-0.5個潛在漏洞的應用。或者換言之,平均一週內就有幾次收到(漏洞)攻擊。我們不能假 設應用的版本比我們分析過存在漏洞的版本新,因此,當我們的示例資料已不再是最新版本,與圖形對應也就表現為急劇下降。如果我們對最近的APK版本重新進 行我們的分析,我們很有可能看到它仍在0.4分。DA( 裝置分析器: Device Analyser)的資料是一個相當小的樣本,讓它去引導更多地關於安卓裝置的結論,在整體上是困難的。

結論

我們發現,通過使用相對簡單的中間人代理技術,無需特定的應用程式或裝置可以遠端執行有危害的應用程式,即使 Android裝置安裝了完全補丁。使用靜態分析我們發現,相當大比例的應用很可能仍然脆弱,我們證實,通過隨機測試超過一半的應用確實缺乏抵抗力。

因此,我們建議當連線到一個不可信的wi-fi無線網路時不要使用任何Android應用程式顯示廣告。

我們感謝Evozi提供他們的APK庫,和劍橋大學的裝置分析資料。

相關文章