遠程執行Android設備上的代碼
英文原文:Remote code execution on Android devices
“你走進一個咖啡店坐下來。等咖啡的時候,你拿出你的智能手機開始玩一款你前些天下載的游戲。接著,你繼續工作并且在電梯里收郵件。在你不知情下,有攻擊者獲取了公司網絡的地址并且不斷地感染你所有同事的智能手機。
等下, 什么?
我們在 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 設備上仍然有漏洞風險。
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 的任何人都將通過我們的代理訪問網絡。
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 庫,和劍橋大學的設備分析數據。