近年來,Android應用安全問題頻發,合規性監管不斷升級,開發者對應用安全防護也越來越重視。4月20日在廣州舉行的2019安卓巴士千人開發者大會上,大家對Android應用安全進行了聚焦。
2019安卓巴士千人開發者大會是由安卓巴士技術社群舉辦。安卓巴士是中國領先的安卓開發者社群,現已聚集超過85萬開發者,數年來一直致力於IT從業者的知識分享服務。安卓巴士開發者大會則是安卓巴士技術社群主打的線下技術沙龍品牌,是由其發起並組織的近千人規模的Android開發者線下交流大會。
網易易盾移動安全資深工程師侯海飛
在本次大會,網易易盾移動安全資深工程師侯海飛受邀發表了主題為《Android應用安全提升攻略》的技術分享,就Android應用安全風險案例、常見安全隱患、安全活動週期以及安卓加固常見策略等內容進行了解讀。
一、應用安全風險案例
Android應用安全的風險案例數不勝數,侯海飛稱,就連很多大廠的App也都中過招,常見的問題點主要是以下這個:
密碼學誤用導致防禦繞過:某外賣APP的資料加密實現於native層,金鑰硬編碼,且加密邏輯未保護,導致加密資料被破,進一步致使網路訪問驗證被攻陷。可以用於偽造任意連結發起攻擊,比如撞庫獲取使用者資訊、偽造電話攻擊、業務薅羊毛等。
Webview元件使用不當導致應用被克隆:排名非常靠前的某支付工具APP中file跨域訪問的許可權設定不當,攻擊者傳送一條惡意連結給使用者即可完成攻擊,通過Url
Scheme方式開啟被攻擊APP中匯出的Webview
activity,使之載入惡意連結中的html檔案,導致本地資料洩露,並進一步實現應用克隆。
易被逆向,對核心業務邏輯保護不足:某照片恢復APP中未採取任何逆向對抗措施,導致核心付費邏輯被改寫,重打包後可免費使用付費功能。
說明:上述相關漏洞均已被修復。
侯海飛以某照片恢復App為例,分析解讀了相關安全隱患以及防護策略。
此App的業務場景,包括初始介面、掃描照片、付費流程以及付費結果校驗。
應用並沒有要求使用者註冊賬戶,說明應用核心邏輯並沒有和服務端關聯,初步反編譯後也沒有發現任何程式碼保護措施。由付費提示資訊出發,逆向客戶端,更改程式碼控制流即可突破。
因此,侯海飛認為該APP應該採取的防護策略:
- 核心業務與服務端關聯。照片恢復的步驟拆分,將部分內容傳入服務端,由服務端校驗付費結果,再下發內容給客戶端;
- 字串加解密。程式碼的明文字串,需要加密,防止破解者直接搜尋到線索;
- 防重打包。啟動校驗簽名,非原簽名則直接掛機,或者無法正常執行核心邏輯;
- 核心邏輯抽取至Native層實現。增加逆向門檻;
- 程式碼混淆。Java、資源、C/C++均可混淆,增加逆向難度。
講完真實案例後,侯海飛又分享了常見的安全隱患,包括:
- 程式碼可逆向:APP可被逆向,輕易獲取程式碼邏輯,進一步導致控制流被hook,防線被破;
- 功能洩漏:客戶端APP高許可權行為和功能被其他未授權的應用程式呼叫訪問;
- APP可除錯:客戶端APP能夠被除錯,動態的提取、修改執行時的程式資料和邏輯
- 日誌資訊洩漏:客戶端APP將開發除錯資訊列印洩露,包含敏感引數和執行流程資訊;
- 可二次打包:APP可被修改, 被套殼加入攻擊者程式碼,重新打包釋出;
- 密碼學誤用:客戶端APP程式碼中使用了不安全的密碼學實現,例如固定硬編碼的對稱加密,ECB模式的對稱加密,CBC模式中IV固定等;
- 敏感資訊洩漏:客戶端APP程式碼中洩漏敏感資料,如認證使用的共享金鑰、不應被暴露的後臺伺服器ip地址等;
- 敏感資訊洩漏:客戶端APP程式碼中洩漏敏感資料,如認證使用的共享金鑰、不應被暴露的後臺伺服器IP地址等。
二、應用安全活動週期
侯海飛表示,移動APP安全加固現如今的發展階段引入了“安全生態鏈”,因此網易易盾也早就推出了APP開發全鏈路安全服務。
網易易盾的App全鏈路安全服務包含了安全開發、應用審計、安全加固、渠道檢測四個週期。
- 開發階段:開發者應遵循移動應用的安全開發規範,使用一些成熟的安全元件,如安全鍵盤SDK、防劫持SDK等;定期對客戶端進行安全評估;
- 測試階段:採用黑盒滲透攻擊和白盒程式碼審計的方式發現移動應用的安全缺陷及安全漏洞,降低安全風險;
- 上線階段:上線前使用加固、混淆等技術加固應用,提高攻擊門檻和逆向的時間成本;
- 運營階段:監控第三方應用市場,及時發現各種盜版、釣魚、山寨等惡意應用,並做漏洞修復和逆向對抗。
侯海飛在現場對每個週期進行了詳細的分享:
1、開發階段:安全開發
開發階段需要開展SDL培訓,強化安全開發意識,使用較成熟的安全元件。密碼輸入、加密演算法、資料通訊、執行環境、應用簽名等等具體的相關技術點可以參考下表:
安全開發生命週期(SDL)是側重於軟體開發的安全保證過程,旨在開發出安全的軟體應用,儘可能地在產品版本回歸前儘早地清除漏洞。其核心理念就是將安全考慮整合在軟體開發的每一個階段:需求分析、設計、編碼、測試和維護,從需求、設計到釋出產品的每一個階段每都增加了相應的安全活動,以減少軟體中漏洞的數量並將安全缺陷降低到最小程度。
在這一階段,安全防護的主要目的是將安全缺陷降低到最小程度,避免後期線上運營階段出現安全問題,但是自然地成本較高。
2、測試階段:應用審計測試階段主要包括安全掃描和滲透測試,具體防護內容可參見下表:
侯海飛說,根據2018 年金融類應用高危漏洞 TOP10調查顯示,ContentProvider敏感資訊洩露、不安全Zip檔案解壓、服務端證照弱校驗、客戶端XML外部實體注入等漏洞均高居榜首,嚴重影響著Android應用的安全性。
但是,並非所有的漏洞都需要修復,從成本和實際防護效果上考量,開發者可根據實際情況進行選擇。
3、上線階段:安全增強
侯海飛指出,在第三階段,需要在基礎的安全防護上進行增強,這時候可以根據安全測試結果進行選擇性修復。
從開發者和第三方安全廠商的角度來看:
- 開發者可以開發逆向對抗產品(反除錯、反重打包、反xposed等),提高應用安全性;
- 第三方安全廠商可以另外提供安全元件SDK、安全加固產品等供選用。
4、運營階段:渠道監控
侯海飛認為,運營階段的主要防護手段包括爬蟲、盜版識別、資料分析。
爬蟲:監測主流渠道應用下載資料,包括第三方市場、論壇等;
盜版識別:應用圖示、名稱、包名、資原始檔、程式碼指紋等,使用相似度演算法分析;
資料分析:盜版渠道分佈、下載量、盜版溯源、篡改內容等資料分析。
綜上所述,在應用安全的開發、測試、上線、運營這四個活動週期內,可以從安全開發(資料通訊、資料安全、核心邏輯保護、除錯日誌)、應用審計(安全掃描、滲透測試)、安全增強(漏洞修復、應用加固)、渠道檢測(盜版監控、資料分析)等細分點進行著力。
三、安卓加固常見策略
在分享的後半段,侯海飛對安卓加固的策略進行了解讀,他認為,常見的Android加固策略包括應用加固和原始碼混淆。
1、應用加固
在應用加固方面,主要有DEX檔案、SDK檔案、SO檔案加固這三類。(SDK的加固策略和DEX類似,不細說)
在DEX加固上,針對加固程度的不同,可以分為:
- 混淆程式碼:最原始也是最基礎的防護措施。
- 整體DEX加固:加殼;
- 拆分DEX加固:函式抽取及動態恢復,增加記憶體Dump的難度;
- 虛擬機器加固:自定義指令虛擬機器直譯器,指令可混淆;
- Java2C加固:將DEX指令轉換為native指令執行,可增加混淆、字串加密功能。
- 整體DEX加固,拆分DEX加固,均有相應的脫殼機,當前的防護程度幾乎為零。
- 當前效能最強的加固方案是Java2c,將java指令轉成c/c++指令,並做虛假控制流、字串加密等處理,會讓逆向者頭痛。如下所示,即為Java2c加固前後的區分:
該加固方式是指根據so結構特點,在二進位制層面進行區域性函式加解密。
2、原始碼混淆
常見的原始碼混淆方式包括Java程式碼混淆、C/C++程式碼混淆以及h5 指令碼混淆等。
Java程式碼混淆
部分逆向IDE對中文的支援並不好(涉及中文字元編碼的問題),配置起來也並不困難,強烈推薦開發者使用。
如下所示,為Java程式碼中文混淆前後的效果:
此處的混淆不單是字串層面的,也包括了程式碼邏輯控制流等。
C/C++程式碼混淆前後保護效果如下:
C/C++程式碼混淆,可以在LLVM編譯器上下點功夫——LLVM不僅僅提供混淆實現,還能通過多重Optimize(優化器),實現多種效果,例如程式碼控制流扁平化、虛假控制流、字串加密、符號混淆、指令替換等。
H5指令碼混淆主要提供字串加密、混淆、去log、變數名處理、壓縮、函式名處理、平臺識別、防篡改等功能。保護前後區別如下:
四、總結
應用安全是應用不可缺少的一部分,如有不慎很可能會被不發分子利用、薅羊毛,給公司利造成極大損失。
在逆向對抗中,建議開發者將核心邏輯置於native層,且藉助LLVM對Native層程式碼進行保護;如無多餘人力物力投入安全,也可直接使用第三方安全加固產品,比如說網易易盾的加固。