溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何系統(tǒng)有效地提升Android代碼的安全性

發(fā)布時間:2021-12-22 15:30:17 來源:億速云 閱讀:115 作者:柒染 欄目:網(wǎng)絡(luò)安全

今天就跟大家聊聊有關(guān)如何系統(tǒng)有效地提升Android代碼的安全性,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

眾所周知,代碼安全是Android開發(fā)工作中的一大核心要素。

Android應(yīng)用安全存在多重隱患

尹彬彬首先提到,Android和iOS兩大操作系統(tǒng)占據(jù)了幾乎全部移動端的市場份額,但是相比后者,缺少足夠嚴(yán)格管控以及未能形成完善安全生態(tài)的Android系統(tǒng),往往會存在很多安全隱患,給企業(yè)、開發(fā)者和用戶都帶來了不好的影響。

比如說:

  • 代碼可逆向:客戶端App的邏輯能夠被輕易獲取和逆向,得到代碼和程序中的敏感數(shù)據(jù);

  • 功能泄漏:客戶端App中高權(quán)限行為和功能被其他未授權(quán)的應(yīng)用程序調(diào)用訪問;

  • 可調(diào)試:客戶端App能夠被調(diào)試,動態(tài)地提取、修改運(yùn)行時的程序數(shù)據(jù)和邏輯;

  • 日志信息泄漏:客戶端App將開發(fā)時輔助調(diào)試信息打印泄露,包含敏感參數(shù)等信息;

  • 可二次打包:客戶端App可能被修改代碼,重新打包發(fā)布在市場上供用戶下載;

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

  • 敏感信息泄漏:客戶端App代碼中泄漏敏感數(shù)據(jù),如認(rèn)證使用的共享密鑰、不應(yīng)被暴露的后臺服務(wù)器管理地址等;

  • 通信數(shù)據(jù)明文傳輸:客戶端App與服務(wù)器端交互的數(shù)據(jù)通過明文的通信信道傳輸,或者加密傳輸,但數(shù)據(jù)依然可以被解密;

  • ......

隨著技術(shù)的不斷發(fā)展升級,移動App安全防護(hù)發(fā)展到現(xiàn)在的階段,也已經(jīng)成功引入了“安全生態(tài)鏈”的概念,并出現(xiàn)了融入到整個App開發(fā)上線周期鏈中的全套安全服務(wù),這個生態(tài)鏈包含了安全開發(fā)、應(yīng)用審計、安全加固、渠道檢測等。

如何系統(tǒng)有效地提升Android代碼的安全性

  • 開發(fā)階段:開發(fā)者應(yīng)遵循移動應(yīng)用的安全開發(fā)規(guī)范,使用一些成熟的安全組件,如安全鍵盤SDK、防劫持SDK等,此外還需要定期對客戶端進(jìn)行安全評估;

  • 測試階段:采用黑盒滲透攻擊和白盒代碼審計的方式發(fā)現(xiàn)移動應(yīng)用的安全缺陷及安全漏洞,降低安全風(fēng)險;

  • 上線階段:上線前使用加固、混淆等技術(shù)加固應(yīng)用,提高攻擊門檻和逆向的時間成本;

  • 運(yùn)營階段:監(jiān)控第三方應(yīng)用市場,及時發(fā)現(xiàn)各種盜版、釣魚、山寨等惡意應(yīng)用。

安全開發(fā)能有效降低開發(fā)者維護(hù)成本

安全開發(fā)是指在開發(fā)階段減少安全風(fēng)險,從而將安全缺陷降低到最小程度,避免后期線上運(yùn)營階段出現(xiàn)安全問題,但是成本較高。

安全開發(fā)生命周期(SDL)是側(cè)重于軟件開發(fā)的安全保證過程,旨在開發(fā)出安全的軟件應(yīng)用。其核心理念就是將安全考慮集成在軟件開發(fā)的每一個階段:需求分析、設(shè)計、編碼、測試和維護(hù)。從需求、設(shè)計到發(fā)布產(chǎn)品的每一個階段每都增加了相應(yīng)的安全活動,以減少軟件中漏洞的數(shù)量并將安全缺陷降低到最小程度,盡可能地在產(chǎn)品版本回歸前清除漏洞。

尹彬彬表示,在這一階段,一方面可以開展SDL培訓(xùn),強(qiáng)化安全開發(fā)意識,制定安全編碼規(guī)范;另一方面是使用較成熟的安全組件。

具體的安全建議包括有:

  • 安全鍵盤:/dev/input/event可以讀取到按鍵和觸屏,實(shí)現(xiàn)安全鍵盤隨機(jī)布局;

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

  • 通信安全:中間人攻擊,證書弱校驗(yàn)等造成通信協(xié)議被分析破解,需要對通信數(shù)據(jù)加密校驗(yàn)和證書有效性校驗(yàn);

  • 防界面劫持: Activity、對話框或者惡意懸浮窗劫持,導(dǎo)致用戶被釣魚或者誤接觸,需要防劫持;

  • 壞境監(jiān)測:ROOT、模擬器、是否有惡意應(yīng)用等壞境檢測,Xposed插件、HOOK、調(diào)試器檢測

  • 數(shù)據(jù)校驗(yàn):簽名校驗(yàn),最好實(shí)現(xiàn)在jni層,多點(diǎn)檢查、隱蔽調(diào)用位置,或者結(jié)合網(wǎng)絡(luò)校驗(yàn),檢測APK中文件是否被篡改,數(shù)據(jù)指紋;

  • 重點(diǎn)邏輯轉(zhuǎn)移到j(luò)ni層實(shí)現(xiàn):對重要邏輯從java層轉(zhuǎn)譯到j(luò)ni層實(shí)現(xiàn),結(jié)合代碼混淆,提高分析難度;

  • 防日志泄露:防止開發(fā)日志泄露,通過開關(guān)控制,Java層通過proguard配置;

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

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

在開發(fā)階段、測試階段發(fā)現(xiàn)或者預(yù)防安全隱患成本較低,上線階段或者運(yùn)營階段出現(xiàn)安全問題的成本較高,因此,開發(fā)者應(yīng)明確安全開發(fā)的重要性。

應(yīng)用審計

“只要是人在開發(fā)代碼,就會存在安全漏洞”,尹彬彬如是說。近幾年來,安全漏洞的形式越來越多種多樣,拒絕服務(wù)、Webview明文存儲密碼等漏洞深切困擾著企業(yè)和開發(fā)者。因此,應(yīng)用審計的重要性也越來越顯著。

如何系統(tǒng)有效地提升Android代碼的安全性

一般而言,應(yīng)用審計的方式主要包括漏洞掃描和滲透測試。

1. 漏洞掃描

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

如何系統(tǒng)有效地提升Android代碼的安全性

2. 滲透測試

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

如何系統(tǒng)有效地提升Android代碼的安全性

代碼加固

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

1. DEX加固

從Java到C++語言,越往底層走,系統(tǒng)的粒度就越來越細(xì)(文件、方法、指令),殼邏輯與被加固的業(yè)務(wù)邏輯邊界也越來越模糊。所以要想獲得安全性和執(zhí)行效率的平衡點(diǎn),就可以采用DEX加固的方式。

如何系統(tǒng)有效地提升Android代碼的安全性

  • 內(nèi)存加載:防止靜態(tài)分析;

  • 指令抽?。涸龃髢?nèi)存Dump的難度;

  • VMP保護(hù):指令虛擬機(jī)保護(hù);

  • Java2C:將Java指令轉(zhuǎn)換為C執(zhí)行。

2. SDK加固

Java字節(jié)碼較容易被反編譯,拿到SDK基本等于直接獲取了源碼。目前針對SDK的保護(hù)僅限于開發(fā)階段的Proguard混淆,沒有較高強(qiáng)度的安全保護(hù)措施。

但可以借用Dex加固的思想,對Java字節(jié)碼做抽取處理:

如何系統(tǒng)有效地提升Android代碼的安全性

3. SO加固

SO加密包括自定義節(jié)加密和自定義Linker,如下的例子所示:

如何系統(tǒng)有效地提升Android代碼的安全性

  • 先確定ELF文件,即構(gòu)建被加殼SO文件soinfo,再進(jìn)行重定位修復(fù):

  • 導(dǎo)入函數(shù)地址,獲取并修復(fù)(將被加殼SO導(dǎo)出函數(shù)映射到殼SO),運(yùn)行init_proc和init_array;

  • 修復(fù)被加殼SO文件,有效導(dǎo)出函數(shù)、JNI_ONLOAD函數(shù);

  • 運(yùn)行被加殼SO Jni_Onload函數(shù)。

4. Java源碼混淆

此方式下可以設(shè)置自己的字典,這也是最常用的安全防護(hù)手段之一。

如何系統(tǒng)有效地提升Android代碼的安全性

5. C/C++混淆

C/C++混淆可利用Obfuscator-LLVM工具高效實(shí)現(xiàn),主要包括以下方法:

  • 控制流平坦化:在不改變源代碼功能的前提下,將C、C++等語言中的if、while、for、do等控制語句轉(zhuǎn)化為switch分支選擇語句??刂屏髌教够悬c(diǎn)像虛擬機(jī)保護(hù),case塊相當(dāng)于vm的handle,case值相當(dāng)于vm的opcode。

  • 指令替換:生成條件跳轉(zhuǎn)指令有兩種方法,一種稱為opaque  predicate,另一種稱為bogus control flow。假設(shè)基本塊block0,opaque  predicate后變?yōu)椋篿f(恒等式){block0;}else{垃圾代碼}或if(恒不等式){垃圾代碼}else{block0;};bogus  control flow后變?yōu)閕f(隨機(jī)條件){block0;}else{block1;},else的基本塊block1復(fù)制于block0。

  • 控制流偽造。

如何系統(tǒng)有效地提升Android代碼的安全性

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

  • 多重分支;

  • 基本塊分割:把基本塊分成多個基本塊。有兩種方法:一種是根據(jù)概率對基本塊的當(dāng)前指令進(jìn)行分割;另一種是計算基本塊的總指令數(shù),標(biāo)記為a,隨機(jī)生成小于a的數(shù),標(biāo)記為b,基本塊b條指令后進(jìn)行分割,a減掉b,進(jìn)行多次迭代直至a等于1。

  • 字符串加密;

  • 常量隱藏;

  • 常量展開;

  • 常量數(shù)組隨機(jī)化:讓常量在數(shù)組中的索引隨機(jī)化。假設(shè)常量數(shù)組a[],索引值i,隨機(jī)生成索引數(shù)組b[]、c[]、d[](可生成更多),循環(huán)用z[b[c[d[i]]]]=a[i]生成隨機(jī)后的常量數(shù)組z[],然后用z[b[c[d[i]]]]替換a[i]。

  • 表達(dá)式變換:對邏輯操作not、and、or、xor,可以先把操作數(shù)抽取分成多個更小的數(shù)進(jìn)行操作,最后用or連接起來,當(dāng)然這四個操作可以用與非門或是或非門來完成。還有其它常見的運(yùn)算可以把操作數(shù)看成大數(shù)然后進(jìn)行大數(shù)運(yùn)算,還有一些運(yùn)算可以轉(zhuǎn)變?yōu)镾IMD指令進(jìn)行運(yùn)算。至于浮點(diǎn)數(shù),有很多浮點(diǎn)數(shù)的軟件實(shí)現(xiàn)可供參考。

6. H5混淆

H5混淆是指從JS的語法和邏輯上進(jìn)行混淆。

這種是從抽象語法樹角度對JS的源碼進(jìn)行語法分析,將源碼字符串轉(zhuǎn)換為樹形結(jié)構(gòu),然后對相應(yīng)的屬性(如字符串、變量名、函數(shù)名等)進(jìn)行混淆或加密。

如何系統(tǒng)有效地提升Android代碼的安全性如何系統(tǒng)有效地提升Android代碼的安全性

渠道監(jiān)測能夠隨時感知安全態(tài)勢

渠道監(jiān)測也是Android安全開發(fā)中的一個重要課題,其工作內(nèi)容主要是App是否被調(diào)試、HOOK、脫殼等運(yùn)行時信息的上報,以便隨時感知安全態(tài)勢。

  • 爬蟲:監(jiān)測主流渠道應(yīng)用下載數(shù)據(jù),包括第三方市場、論壇等;

  • 盜版識別:應(yīng)用圖標(biāo)、名稱、包名、資源文件、代碼指紋等,使用相似度算法分析;

  • 數(shù)據(jù)分析:盜版渠道分布、下載量、盜版溯源、篡改內(nèi)容等數(shù)據(jù)分析。

如何系統(tǒng)有效地提升Android代碼的安全性

看完上述內(nèi)容,你們對如何系統(tǒng)有效地提升Android代碼的安全性有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI