您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關如何系統有效地提升Android代碼的安全性,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
眾所周知,代碼安全是Android開發工作中的一大核心要素。
Android應用安全存在多重隱患
尹彬彬首先提到,Android和iOS兩大操作系統占據了幾乎全部移動端的市場份額,但是相比后者,缺少足夠嚴格管控以及未能形成完善安全生態的Android系統,往往會存在很多安全隱患,給企業、開發者和用戶都帶來了不好的影響。
比如說:
代碼可逆向:客戶端App的邏輯能夠被輕易獲取和逆向,得到代碼和程序中的敏感數據;
功能泄漏:客戶端App中高權限行為和功能被其他未授權的應用程序調用訪問;
可調試:客戶端App能夠被調試,動態地提取、修改運行時的程序數據和邏輯;
日志信息泄漏:客戶端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、脫殼等運行時信息的上報,以便隨時感知安全態勢。
爬蟲:監測主流渠道應用下載數據,包括第三方市場、論壇等;
盜版識別:應用圖標、名稱、包名、資源文件、代碼指紋等,使用相似度算法分析;
數據分析:盜版渠道分布、下載量、盜版溯源、篡改內容等數據分析。
看完上述內容,你們對如何系統有效地提升Android代碼的安全性有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。