今天就跟大家聊聊有關(guān)如何系統(tǒng)有效地提升Android代碼的安全性,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
在天壇街道等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需求定制網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),成都全網(wǎng)營(yíng)銷,外貿(mào)網(wǎng)站制作,天壇街道網(wǎng)站建設(shè)費(fèi)用合理。
眾所周知,代碼安全是Android開(kāi)發(fā)工作中的一大核心要素。
Android應(yīng)用安全存在多重隱患
尹彬彬首先提到,Android和iOS兩大操作系統(tǒng)占據(jù)了幾乎全部移動(dòng)端的市場(chǎng)份額,但是相比后者,缺少足夠嚴(yán)格管控以及未能形成完善安全生態(tài)的Android系統(tǒng),往往會(huì)存在很多安全隱患,給企業(yè)、開(kāi)發(fā)者和用戶都帶來(lái)了不好的影響。
比如說(shuō):
代碼可逆向:客戶端App的邏輯能夠被輕易獲取和逆向,得到代碼和程序中的敏感數(shù)據(jù);
功能泄漏:客戶端App中高權(quán)限行為和功能被其他未授權(quán)的應(yīng)用程序調(diào)用訪問(wèn);
可調(diào)試:客戶端App能夠被調(diào)試,動(dòng)態(tài)地提取、修改運(yùn)行時(shí)的程序數(shù)據(jù)和邏輯;
日志信息泄漏:客戶端App將開(kāi)發(fā)時(shí)輔助調(diào)試信息打印泄露,包含敏感參數(shù)等信息;
可二次打包:客戶端App可能被修改代碼,重新打包發(fā)布在市場(chǎng)上供用戶下載;
密碼學(xué)誤用:客戶端App代碼中使用了不安全的密碼學(xué)實(shí)現(xiàn),例如固定硬編碼的對(duì)稱加密,ECB模式的對(duì)稱加密,CBC模式中IV固定等;
敏感信息泄漏:客戶端App代碼中泄漏敏感數(shù)據(jù),如認(rèn)證使用的共享密鑰、不應(yīng)被暴露的后臺(tái)服務(wù)器管理地址等;
通信數(shù)據(jù)明文傳輸:客戶端App與服務(wù)器端交互的數(shù)據(jù)通過(guò)明文的通信信道傳輸,或者加密傳輸,但數(shù)據(jù)依然可以被解密;
......
隨著技術(shù)的不斷發(fā)展升級(jí),移動(dòng)App安全防護(hù)發(fā)展到現(xiàn)在的階段,也已經(jīng)成功引入了“安全生態(tài)鏈”的概念,并出現(xiàn)了融入到整個(gè)App開(kāi)發(fā)上線周期鏈中的全套安全服務(wù),這個(gè)生態(tài)鏈包含了安全開(kāi)發(fā)、應(yīng)用審計(jì)、安全加固、渠道檢測(cè)等。
開(kāi)發(fā)階段:開(kāi)發(fā)者應(yīng)遵循移動(dòng)應(yīng)用的安全開(kāi)發(fā)規(guī)范,使用一些成熟的安全組件,如安全鍵盤(pán)SDK、防劫持SDK等,此外還需要定期對(duì)客戶端進(jìn)行安全評(píng)估;
測(cè)試階段:采用黑盒滲透攻擊和白盒代碼審計(jì)的方式發(fā)現(xiàn)移動(dòng)應(yīng)用的安全缺陷及安全漏洞,降低安全風(fēng)險(xiǎn);
上線階段:上線前使用加固、混淆等技術(shù)加固應(yīng)用,提高攻擊門(mén)檻和逆向的時(shí)間成本;
運(yùn)營(yíng)階段:監(jiān)控第三方應(yīng)用市場(chǎng),及時(shí)發(fā)現(xiàn)各種盜版、釣魚(yú)、山寨等惡意應(yīng)用。
安全開(kāi)發(fā)能有效降低開(kāi)發(fā)者維護(hù)成本
安全開(kāi)發(fā)是指在開(kāi)發(fā)階段減少安全風(fēng)險(xiǎn),從而將安全缺陷降低到最小程度,避免后期線上運(yùn)營(yíng)階段出現(xiàn)安全問(wèn)題,但是成本較高。
安全開(kāi)發(fā)生命周期(SDL)是側(cè)重于軟件開(kāi)發(fā)的安全保證過(guò)程,旨在開(kāi)發(fā)出安全的軟件應(yīng)用。其核心理念就是將安全考慮集成在軟件開(kāi)發(fā)的每一個(gè)階段:需求分析、設(shè)計(jì)、編碼、測(cè)試和維護(hù)。從需求、設(shè)計(jì)到發(fā)布產(chǎn)品的每一個(gè)階段每都增加了相應(yīng)的安全活動(dòng),以減少軟件中漏洞的數(shù)量并將安全缺陷降低到最小程度,盡可能地在產(chǎn)品版本回歸前清除漏洞。
尹彬彬表示,在這一階段,一方面可以開(kāi)展SDL培訓(xùn),強(qiáng)化安全開(kāi)發(fā)意識(shí),制定安全編碼規(guī)范;另一方面是使用較成熟的安全組件。
具體的安全建議包括有:
安全鍵盤(pán):/dev/input/event可以讀取到按鍵和觸屏,實(shí)現(xiàn)安全鍵盤(pán)隨機(jī)布局;
密鑰安全:避免硬編碼密鑰在代碼中,可以本地分段加密存儲(chǔ),也考慮使用白盒密鑰;
通信安全:中間人攻擊,證書(shū)弱校驗(yàn)等造成通信協(xié)議被分析破解,需要對(duì)通信數(shù)據(jù)加密校驗(yàn)和證書(shū)有效性校驗(yàn);
防界面劫持: Activity、對(duì)話框或者惡意懸浮窗劫持,導(dǎo)致用戶被釣魚(yú)或者誤接觸,需要防劫持;
壞境監(jiān)測(cè):ROOT、模擬器、是否有惡意應(yīng)用等壞境檢測(cè),Xposed插件、HOOK、調(diào)試器檢測(cè)
數(shù)據(jù)校驗(yàn):簽名校驗(yàn),最好實(shí)現(xiàn)在jni層,多點(diǎn)檢查、隱蔽調(diào)用位置,或者結(jié)合網(wǎng)絡(luò)校驗(yàn),檢測(cè)APK中文件是否被篡改,數(shù)據(jù)指紋;
重點(diǎn)邏輯轉(zhuǎn)移到j(luò)ni層實(shí)現(xiàn):對(duì)重要邏輯從java層轉(zhuǎn)譯到j(luò)ni層實(shí)現(xiàn),結(jié)合代碼混淆,提高分析難度;
防日志泄露:防止開(kāi)發(fā)日志泄露,通過(guò)開(kāi)關(guān)控制,Java層通過(guò)proguard配置;
防敏感數(shù)據(jù)泄露: 避免敏感數(shù)據(jù)明文保存,考慮本地存儲(chǔ)加密(sharepreference、sqlite等);
正確使用密碼學(xué)算法:Hash算法使用SHA-256代替MD5,AES不要使用ECB模式,初始化向量IV不要使用固定的常量,使用/dev/urandom或者/dev/random來(lái)初始化偽隨機(jī)數(shù)生成器,從而代替SecureRandom。
在開(kāi)發(fā)階段、測(cè)試階段發(fā)現(xiàn)或者預(yù)防安全隱患成本較低,上線階段或者運(yùn)營(yíng)階段出現(xiàn)安全問(wèn)題的成本較高,因此,開(kāi)發(fā)者應(yīng)明確安全開(kāi)發(fā)的重要性。
應(yīng)用審計(jì)
“只要是人在開(kāi)發(fā)代碼,就會(huì)存在安全漏洞”,尹彬彬如是說(shuō)。近幾年來(lái),安全漏洞的形式越來(lái)越多種多樣,拒絕服務(wù)、Webview明文存儲(chǔ)密碼等漏洞深切困擾著企業(yè)和開(kāi)發(fā)者。因此,應(yīng)用審計(jì)的重要性也越來(lái)越顯著。
一般而言,應(yīng)用審計(jì)的方式主要包括漏洞掃描和滲透測(cè)試。
1. 漏洞掃描
在漏洞掃描中,黑盒測(cè)試是比較常見(jiàn)的手段之一,也方便集成到現(xiàn)有的開(kāi)發(fā)流程中。它能夠很方便地提供漏洞詳情、漏洞代碼行數(shù)、風(fēng)險(xiǎn)等級(jí)、修復(fù)建議等。自動(dòng)化移動(dòng)應(yīng)用安全測(cè)試框架Mobile Security Framework就是個(gè)很好的工具。
2. 滲透測(cè)試
滲透測(cè)試可以有效檢測(cè)客戶端程序安全、敏感信息安全、密碼軟鍵盤(pán)安全性、安全策略設(shè)置、手勢(shì)密碼安全性、通信安全、配置文件、拒絕服務(wù)、本地SQL注入等威脅類型。
代碼加固
代碼加固主要包括應(yīng)用加固(DEX文件、SDK文件、SO文件)和源碼混淆(Java、C/C++、JavaScript/HTML)兩種常見(jiàn)手段。
1. DEX加固
從Java到C++語(yǔ)言,越往底層走,系統(tǒng)的粒度就越來(lái)越細(xì)(文件、方法、指令),殼邏輯與被加固的業(yè)務(wù)邏輯邊界也越來(lái)越模糊。所以要想獲得安全性和執(zhí)行效率的平衡點(diǎn),就可以采用DEX加固的方式。
內(nèi)存加載:防止靜態(tài)分析;
指令抽?。涸龃髢?nèi)存Dump的難度;
VMP保護(hù):指令虛擬機(jī)保護(hù);
Java2C:將Java指令轉(zhuǎn)換為C執(zhí)行。
2. SDK加固
Java字節(jié)碼較容易被反編譯,拿到SDK基本等于直接獲取了源碼。目前針對(duì)SDK的保護(hù)僅限于開(kāi)發(fā)階段的Proguard混淆,沒(méi)有較高強(qiáng)度的安全保護(hù)措施。
但可以借用Dex加固的思想,對(duì)Java字節(jié)碼做抽取處理:
3. SO加固
SO加密包括自定義節(jié)加密和自定義Linker,如下的例子所示:
先確定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ù)手段之一。
5. C/C++混淆
C/C++混淆可利用Obfuscator-LLVM工具高效實(shí)現(xiàn),主要包括以下方法:
控制流平坦化:在不改變?cè)创a功能的前提下,將C、C++等語(yǔ)言中的if、while、for、do等控制語(yǔ)句轉(zhuǎn)化為switch分支選擇語(yǔ)句??刂屏髌教够悬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。
控制流偽造。
其他常見(jiàn)的C/C++混淆手段還有:
多重分支;
基本塊分割:把基本塊分成多個(gè)基本塊。有兩種方法:一種是根據(jù)概率對(duì)基本塊的當(dāng)前指令進(jìn)行分割;另一種是計(jì)算基本塊的總指令數(shù),標(biāo)記為a,隨機(jī)生成小于a的數(shù),標(biāo)記為b,基本塊b條指令后進(jìn)行分割,a減掉b,進(jìn)行多次迭代直至a等于1。
字符串加密;
常量隱藏;
常量展開(kāi);
常量數(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á)式變換:對(duì)邏輯操作not、and、or、xor,可以先把操作數(shù)抽取分成多個(gè)更小的數(shù)進(jìn)行操作,最后用or連接起來(lái),當(dāng)然這四個(gè)操作可以用與非門(mén)或是或非門(mén)來(lái)完成。還有其它常見(jiàn)的運(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的語(yǔ)法和邏輯上進(jìn)行混淆。
這種是從抽象語(yǔ)法樹(shù)角度對(duì)JS的源碼進(jìn)行語(yǔ)法分析,將源碼字符串轉(zhuǎn)換為樹(shù)形結(jié)構(gòu),然后對(duì)相應(yīng)的屬性(如字符串、變量名、函數(shù)名等)進(jìn)行混淆或加密。
渠道監(jiān)測(cè)能夠隨時(shí)感知安全態(tài)勢(shì)
渠道監(jiān)測(cè)也是Android安全開(kāi)發(fā)中的一個(gè)重要課題,其工作內(nèi)容主要是App是否被調(diào)試、HOOK、脫殼等運(yùn)行時(shí)信息的上報(bào),以便隨時(shí)感知安全態(tài)勢(shì)。
爬蟲(chóng):監(jiān)測(cè)主流渠道應(yīng)用下載數(shù)據(jù),包括第三方市場(chǎng)、論壇等;
盜版識(shí)別:應(yīng)用圖標(biāo)、名稱、包名、資源文件、代碼指紋等,使用相似度算法分析;
數(shù)據(jù)分析:盜版渠道分布、下載量、盜版溯源、篡改內(nèi)容等數(shù)據(jù)分析。
看完上述內(nèi)容,你們對(duì)如何系統(tǒng)有效地提升Android代碼的安全性有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。