值得細讀!如何系統有效地提高 Android 代碼的安全性?


衆所周知,代碼安全是Android開發工做中的一大核心要素。html


11月3日,安卓巴士全球開發者論壇線下系列沙龍第七站在成都順利舉辦。做爲中國領先的安卓開發者社區,安卓巴士近年來一直致力於在全國各大城市舉辦線下技術大會,爲Android開發者提供最爲全面深刻的安全技術解讀。java


網易雲易盾移動安全專家尹彬彬指出,安全開發能有效下降開發者維護成本算法

網易雲易盾移動安全專家尹彬彬也受邀參加了這次會議,並作《如何提高Android代碼的安全性》主題演講。針對Android開發者,他分享了在App開發週期的各個階段中常見的安全隱患,給出了提高Android代碼安全性的建議,包括安全開發、代碼加固、渠道監測、應用審計等Android代碼安全技術剖析。sql


Android應用安全存在多重隱患數組


尹彬彬首先提到,Android和iOS兩大操做系統佔據了幾乎所有移動端的市場份額,可是相比後者,缺乏足夠嚴格管控以及未能造成完善安全生態的Android系統,每每會存在不少安全隱患,給企業、開發者和用戶都帶來了很差的影響。安全


好比說:服務器


  • 代碼可逆向:客戶端App的邏輯可以被輕易獲取和逆向,獲得代碼和程序中的敏感數據;網絡

  • 功能泄漏:客戶端App中高權限行爲和功能被其餘未受權的應用程序調用訪問;框架

  • 可調試:客戶端App可以被調試,動態地提取、修改運行時的程序數據和邏輯;dom

  • 日誌信息泄漏:客戶端App將開發時輔助調試信息打印泄露,包含敏感參數等信息;

  • 可二次打包:客戶端App可能被修改代碼,從新打包發佈在市場上供用戶下載;

  • 密碼學誤用:客戶端App代碼中使用了不安全的密碼學實現,例如固定硬編碼的對稱加密,ECB模式的對稱加密,CBC模式中IV固定等;

  • 敏感信息泄漏:客戶端App代碼中泄漏敏感數據,如認證使用的共享密鑰、不該被暴露的後臺服務器管理地址等;

  • 通訊數據明文傳輸:客戶端App與服務器端交互的數據經過明文的通訊信道傳輸,或者加密傳輸,但數據依然能夠被解密;

  • ......


隨着技術的不斷髮展升級,移動App安全防禦發展到如今的階段,也已經成功引入了「安全生態鏈」的概念,並出現了融入到整個App開發上線週期鏈中的全套安全服務,這個生態鏈包含了安全開發、應用審計、安全加固、渠道檢測等。


  • 開發階段:開發者應遵循移動應用的安全開發規範,使用一些成熟的安全組件,如安全鍵盤SDK、防劫持SDK等,此外還須要按期對客戶端進行安全評估;

  • 測試階段:採用黑盒滲透攻擊和白盒代碼審計的方式發現移動應用的安全缺陷及安全漏洞,下降安全風險;

  • 上線階段:上線前使用加固、混淆等技術加固應用,提升攻擊門檻和逆向的時間成本;

  • 運營階段:監控第三方應用市場,及時發現各類盜版、釣魚、山寨等惡意應用。


安全開發能有效下降開發者維護成本


安全開發是指在開發階段減小安全風險,從而將安全缺陷下降到最小程度,避免後期線上運營階段出現安全問題,可是成本較高。


安全開發生命週期(SDL)是側重於軟件開發的安全保證過程,旨在開發出安全的軟件應用。其核心理念就是將安全考慮集成在軟件開發的每個階段:需求分析、設計、編碼、測試和維護。從需求、設計到發佈產品的每個階段每都增長了相應的安全活動,以減小軟件中漏洞的數量並將安全缺陷下降到最小程度,儘量地在產品版本回歸前清除漏洞。


尹彬彬表示,在這一階段,一方面能夠開展SDL培訓,強化安全開發意識,制定安全編碼規範;另外一方面是使用較成熟的安全組件。


具體的安全建議包括有:


  • 安全鍵盤:/dev/input/event能夠讀取到按鍵和觸屏,實現安全鍵盤隨機佈局;

  • 密鑰安全:避免硬編碼密鑰在代碼中,能夠本地分段加密存儲,也考慮使用白盒密鑰;

  • 通訊安全:中間人攻擊,證書弱校驗等形成通訊協議被分析破解,須要對通訊數據加密校驗和證書有效性校驗;

  • 防界面劫持: Activity、對話框或者惡意懸浮窗劫持,致使用戶被釣魚或者誤接觸,須要防劫持;

  • 壞境監測:ROOT、模擬器、是否有惡意應用等壞境檢測,Xposed插件、HOOK、調試器檢測

  • 數據校驗:簽名校驗,最好實如今jni層,多點檢查、隱蔽調用位置,或者結合網絡校驗,檢測APK中文件是否被篡改,數據指紋;

  • 重點邏輯轉移到jni層實現:對重要邏輯從java層轉譯到jni層實現,結合代碼混淆,提升分析難度;

  • 防日誌泄露:防止開發日誌泄露,經過開關控制,Java層經過proguard配置;

  • 防敏感數據泄露: 避免敏感數據明文保存,考慮本地存儲加密(sharepreference、sqlite等);

  • 正確使用密碼學算法:Hash算法使用SHA-256代替MD5,AES不要使用ECB模式,初始化向量IV不要使用固定的常量,使用/dev/urandom或者/dev/random來初始化僞隨機數生成器,從而代替SecureRandom。


在開發階段、測試階段發現或者預防安全隱患成本較低,上線階段或者運營階段出現安全問題的成本較高,所以,開發者應明確安全開發的重要性。


應用審計


「只要是人在開發代碼,就會存在安全漏洞」,尹彬彬如是說。近幾年來,安全漏洞的形式愈來愈多種多樣,拒絕服務、Webview明文存儲密碼等漏洞深切困擾着企業和開發者。所以,應用審計的重要性也愈來愈顯著。


通常而言,應用審計的方式主要包括漏洞掃描和滲透測試。


1. 漏洞掃描


在漏洞掃描中,黑盒測試是比較常見的手段之一,也方便集成到現有的開發流程中。它可以很方便地提供漏洞詳情、漏洞代碼行數、風險等級、修復建議等。自動化移動應用安全測試框架Mobile Security Framework就是個很好的工具。


2. 滲透測試


滲透測試能夠有效檢測客戶端程序安全、敏感信息安全、密碼軟鍵盤安全性、安全策略設置、手勢密碼安全性、通訊安全、配置文件、拒絕服務、本地SQL注入等威脅類型。


代碼加固


代碼加固主要包括應用加固(DEX文件、SDK文件、SO文件)和源碼混淆(Java、C/C++、JavaScript/HTML)兩種常見手段。


1. DEX加固


從Java到C++語言,越往底層走,系統的粒度就愈來愈細(文件、方法、指令),殼邏輯與被加固的業務邏輯邊界也愈來愈模糊。因此要想得到安全性和執行效率的平衡點,就能夠採用DEX加固的方式。


  • 內存加載:防止靜態分析;

  • 指令抽取:增大內存Dump的難度;

  • VMP保護:指令虛擬機保護;

  • Java2C:將Java指令轉換爲C執行。


2. SDK加固


Java字節碼較容易被反編譯,拿到SDK基本等於直接獲取了源碼。目前針對SDK的保護僅限於開發階段的Proguard混淆,沒有較高強度的安全保護措施。


但能夠借用Dex加固的思想,對Java字節碼作抽取處理:


3. SO加固


SO加密包括自定義節加密和自定義Linker,以下的例子所示:


  • 先肯定ELF文件,即構建被加殼SO文件soinfo,再進行重定位修復:

  • 導入函數地址,獲取並修復(將被加殼SO導出函數映射到殼SO),運行init_proc和init_array;

  • 修復被加殼SO文件,有效導出函數、JNI_ONLOAD函數;

  • 運行被加殼SO Jni_Onload函數。


4. Java源碼混淆


此方式下能夠設置本身的字典,這也是最經常使用的安全防禦手段之一。


5. C/C++混淆


C/C++混淆可利用Obfuscator-LLVM工具高效實現,主要包括如下方法:


  • 控制流平坦化:在不改變源代碼功能的前提下,將C、C++等語言中的if、while、for、do等控制語句轉化爲switch分支選擇語句。控制流平坦化有點像虛擬機保護,case塊至關於vm的handle,case值至關於vm的opcode。

  • 指令替換:生成條件跳轉指令有兩種方法,一種稱爲opaque predicate,另外一種稱爲bogus control flow。假設基本塊block0,opaque predicate後變爲:if(恆等式){block0;}else{垃圾代碼}或if(恆不等式){垃圾代碼}else{block0;};bogus control flow後變爲if(隨機條件){block0;}else{block1;},else的基本塊block1複製於block0。

  • 控制流僞造。



其餘常見的C/C++混淆手段還有:


  • 多重分支;

  • 基本塊分割:把基本塊分紅多個基本塊。有兩種方法:一種是根據機率對基本塊的當前指令進行分割;另外一種是計算基本塊的總指令數,標記爲a,隨機生成小於a的數,標記爲b,基本塊b條指令後進行分割,a減掉b,進行屢次迭代直至a等於1。

  • 字符串加密;

  • 常量隱藏;

  • 常量展開;

  • 常量數組隨機化:讓常量在數組中的索引隨機化。假設常量數組a[],索引值i,隨機生成索引數組b[]、c[]、d[](可生成更多),循環用z[b[c[d[i]]]]=a[i]生成隨機後的常量數組z[],而後用z[b[c[d[i]]]]替換a[i]。

  • 表達式變換:對邏輯操做not、and、or、xor,能夠先把操做數抽取分紅多個更小的數進行操做,最後用or鏈接起來,固然這四個操做能夠用與非門或是或非門來完成。還有其它常見的運算能夠把操做數當作大數而後進行大數運算,還有一些運算能夠轉變爲SIMD指令進行運算。至於浮點數,有不少浮點數的軟件實現可供參考。


6. H5混淆


H5混淆是指從JS的語法和邏輯上進行混淆。


這種是從抽象語法樹角度對JS的源碼進行語法分析,將源碼字符串轉換爲樹形結構,而後對相應的屬性(如字符串、變量名、函數名等)進行混淆或加密。


渠道監測可以隨時感知安全態勢


渠道監測也是Android安全開發中的一個重要課題,其工做內容主要是App是否被調試、HOOK、脫殼等運行時信息的上報,以便隨時感知安全態勢。


  • 爬蟲:監測主流渠道應用下載數據,包括第三方市場、論壇等;

  • 盜版識別:應用圖標、名稱、包名、資源文件、代碼指紋等,使用類似度算法分析;

  • 數據分析:盜版渠道分佈、下載量、盜版溯源、篡改內容等數據分析。


總結


「攻防沒有止境」,尹彬彬表示,經過安全編碼規範要求、上線前的安全檢測、代碼加固、業務運行中基於網絡通訊層的完整性校驗、標準化的SDL檢測等全方面的安全防禦,可以抵禦8-9成的攻擊,可是仍是有可能會有新的安全問題出現。


所以,他指出:「移動安全的方案須要更加貼合業務層面,與時俱進」。


網易雲易盾依託網易20年的技術積累及對數十條業務線的保障經驗,擁有海量特徵庫和成熟的安全機制,並結合超強雲計算及人工智能技術,造成對遊戲、金融、電商、娛樂等場景化解決方案,服務集團內外上千家客戶。「若是須要得到更加可靠的移動安全保障,能夠來和咱們聊聊。」尹彬彬最後表示。


點擊免費體驗網易雲易盾移動安全解決方案



相關文章:
【推薦】 「網易有錢」sketch使用分享

相關文章
相關標籤/搜索