腾讯专家教你如何保证应用开发安全
APP開發(fā)者在開發(fā)過程中會(huì)遇到各種各樣的安全問題,出現(xiàn)安全問題的原因多種多樣,安卓綠色聯(lián)盟為解決這些安全問題制定了統(tǒng)一的應(yīng)用安全標(biāo)準(zhǔn)。
安全問題,可以按照不同的緯度進(jìn)行歸納,一個(gè)是APP漏洞、系統(tǒng)的漏洞以及常見的服務(wù)器通信協(xié)議項(xiàng)的漏洞等;對(duì)于攻擊手段,可以分為本地攻擊、遠(yuǎn)程攻擊或者是基于一些硬件設(shè)備的進(jìn)場(chǎng)攻擊;對(duì)于攻擊的方法,可以植入一些惡意代碼,盜取你的隱私信息,比如常見的賬號(hào)密碼。常見的還有游戲以及微信紅包的外掛等等,這些都屬于移動(dòng)安全的一些特征。
1、應(yīng)用程序的基礎(chǔ)安全
在應(yīng)用程序基礎(chǔ)安全方面有幾種問題:
第一種是Debug狀態(tài)被關(guān)閉,Debug是用來調(diào)試的一種開關(guān),谷歌對(duì)Debug也做了一些升級(jí),在發(fā)布狀態(tài)Debug要進(jìn)行關(guān)閉,在一些非root手機(jī)上,擁有Debug開關(guān)也可以進(jìn)行一些調(diào)試。調(diào)試就是黑客或者是惡意競(jìng)爭(zhēng)者,去逆向你的應(yīng)用程序,去發(fā)現(xiàn)應(yīng)用程序中的漏洞或者是一些潛在的安全問題,是安全的一個(gè)入口點(diǎn),所以我們要避免我們的應(yīng)用程序要被這樣的一個(gè)逆向或者是動(dòng)態(tài)調(diào)試。打開Debug開關(guān)我們可以通過USP進(jìn)行動(dòng)態(tài)調(diào)試,這種調(diào)試不是對(duì)抗調(diào)試的唯一方法,我們可以通過“從打包”或者是通過修改Mainfest文件進(jìn)行從打包去達(dá)到類似的效果。
第二個(gè)是基礎(chǔ)屬性的backup配置,這個(gè)跟谷歌開始的系統(tǒng)策略有關(guān)系,之前backup存在一些系統(tǒng)漏洞,導(dǎo)致一些惡意的攻擊程序可以在不授權(quán)的情況下去APP進(jìn)行一些備份,這些備份包括私有目錄下的一些文件,通過這些備份導(dǎo)致一些隱私信息泄露。
第三個(gè)是比較嚴(yán)重的問題,就是log的開關(guān)。在安卓的版本里面log的信息是普通的APP都會(huì)訪問到,后來安卓系統(tǒng)升級(jí)以后,log信息就無法被APP看到,現(xiàn)在我們分析的過程中發(fā)現(xiàn)很多APP的log信息沒有完全關(guān)掉,黑客在去進(jìn)行分析的時(shí)候,log信息會(huì)大大降低黑客分析的難度,在關(guān)鍵函數(shù)的插裝打點(diǎn),去輸入這些關(guān)鍵信息,就很容易獲得相應(yīng)的邏輯。所以我們應(yīng)盡可能在release版本把這些信息全部關(guān)掉。
第四個(gè)就是代碼混淆,初級(jí)的混淆比較常見,但是對(duì)于一些核心功能來說,簡(jiǎn)單的混淆還是遠(yuǎn)遠(yuǎn)不夠的,就像現(xiàn)在應(yīng)用的加固,就是為了保證核心的邏輯以及核心業(yè)務(wù),避免被輕易逆向,比如一些協(xié)議以及安全漏洞,我們除了要做一些簡(jiǎn)單混淆以外還要做一些調(diào)試的檢測(cè),對(duì)一些核心的代碼做一些核心的處理,來提升逆向分析的強(qiáng)度。
案例分析:
情況一:有一些APP在log里面直接把你登錄的賬號(hào)密碼或者其他一些關(guān)鍵信息直接輸出來了,這種東西給人的感覺安全性非常低。還有就是通過log信息看到很多業(yè)務(wù)邏輯。
注意事項(xiàng):
1、關(guān)閉Debug模式
2、關(guān)閉Allow Backup模式
3、刪除Log代碼
4、代碼進(jìn)行混淆
5、代碼進(jìn)行加固和反調(diào)試
2、安卓開發(fā)里面常用的四大組件安全
對(duì)于四個(gè)組件,最核心的問題就是組件的導(dǎo)出屬性未關(guān)閉以及有效的控制。導(dǎo)出屬性對(duì)于開發(fā)來講,一個(gè)組件或者activity,在沒有關(guān)閉導(dǎo)出屬性的時(shí)候,外部開發(fā)者很容易可以直接調(diào)到,尤其是遠(yuǎn)程的sevice;對(duì)于一些重要的、功能性APP,導(dǎo)出的sevice可能會(huì)導(dǎo)致一些嚴(yán)重的問題。
還有一個(gè)問題就是導(dǎo)出的組件沒有做有效的參數(shù)校驗(yàn),這經(jīng)常會(huì)導(dǎo)致應(yīng)用crash,另外一種可以通過構(gòu)造異常數(shù)據(jù)可以進(jìn)行一些代碼注入,我們除了要做一個(gè)導(dǎo)出的屬性判斷之外,我們還要對(duì)傳入的參數(shù)做一個(gè)嚴(yán)格的校驗(yàn),為了避免應(yīng)用crash,或者是導(dǎo)出的出口去的代碼做一些惡意輸入。
另外一個(gè)就是組件的隱式調(diào)用,直接通過組件的隱式調(diào)用系統(tǒng)會(huì)有相應(yīng)的提示,對(duì)于一些系統(tǒng)應(yīng)用來說,在開發(fā)的過程中盡可能避免使用隱式調(diào)用組件,通過明確設(shè)定包名的方式避免隱式調(diào)用的使用。
隱式調(diào)用會(huì)導(dǎo)致一些惡意程序的調(diào)用,通過隱式調(diào)用的方式創(chuàng)建activity或者一個(gè)service屬性,會(huì)導(dǎo)致調(diào)用惡意sevice的后果。
最后一個(gè)就是Broadcast對(duì)外廣播以及接受外部廣播的組件,安卓系統(tǒng)本身的廣播組件只是做一個(gè)簡(jiǎn)單的消息分發(fā),在手機(jī)使用的過程中,通暢會(huì)用廣播來傳遞一些關(guān)鍵數(shù)據(jù),比如說登錄的賬號(hào)密碼或者是需傳遞的隱私數(shù)據(jù),對(duì)于廣播的使用相對(duì)于activity以及sevice來說更不規(guī)則,對(duì)于系統(tǒng)使用的內(nèi)部廣播以及需要在廣播上添加的權(quán)限等行為都需要進(jìn)行規(guī)范。
通過廣播組件可能會(huì)觸發(fā)APP里面一些不正常的流程或者導(dǎo)致廣播中間傳遞的信息泄露。
注意事項(xiàng):
1、除非必要,不要對(duì)外導(dǎo)出任何組件,尤其是默認(rèn)導(dǎo)出的;
2、對(duì)外導(dǎo)出的組件,已經(jīng)要對(duì)輸入輸出的參數(shù)進(jìn)行判斷;
3、動(dòng)態(tài)注冊(cè)的廣播要注意對(duì)外還是對(duì)外(LocalBroadcastManager);
4、調(diào)用外部組件盡量不適用隱式調(diào)用;
5、不指定taskAffinity和lunchMode,可能導(dǎo)致Intent泄露;
6、對(duì)外導(dǎo)出的service,要嚴(yán)格的判斷接入者身份;
7、組件使用權(quán)限限制的時(shí)候要使用高權(quán)限;
3、文件操作安全
文件的操作一般分私有的、public以及全局可讀寫的三個(gè)屬性,在做代碼處理的時(shí)候由于對(duì)文件屬性的不注意導(dǎo)致文件出現(xiàn)權(quán)限問題,從而導(dǎo)致一些隱私泄露以及可外部修改文件造成運(yùn)行異常。
重要的文件存放在SD卡上,對(duì)于放在SD卡上的數(shù)據(jù)需要做一個(gè)嚴(yán)格的判斷,進(jìn)行相應(yīng)的分級(jí)與校驗(yàn)。如果未對(duì)SD存放的數(shù)據(jù)進(jìn)行有效區(qū)分會(huì)導(dǎo)致數(shù)據(jù)動(dòng)態(tài)加載的過程中被惡意竄改。
注意事項(xiàng):
1、私有目錄下的文件操作的權(quán)限
2、重要數(shù)據(jù)不要放到SD卡上
3、重要的數(shù)據(jù)需要加密保存
4、瀏覽器使用安全
APP常用的瀏覽器主要是webview,瀏覽器的安全問題主要是系統(tǒng)提供的webview本身的一些安全性導(dǎo)致的,這里面常見的問題有:
FILE域未做限制導(dǎo)致執(zhí)行任意代碼,如果不去做FILE域的檢測(cè),當(dāng)用Webview加載一些本地的靜態(tài)頁(yè)面,加載了一些有惡意代碼的JS文件,可能會(huì)通過FILE域加載databases下面的一些私有文件,導(dǎo)致應(yīng)用程序隱私數(shù)據(jù)泄露。
Http域跨File域未做限制,通過JS反調(diào)Java層的一些代碼,導(dǎo)致應(yīng)用程序隱私數(shù)據(jù)的泄露。
AddJavaScriptInterface 系統(tǒng)漏洞會(huì)導(dǎo)致遠(yuǎn)程任意代碼執(zhí)行
AddJavaScriptInterface 系統(tǒng)漏洞, 默認(rèn)的JS接口,導(dǎo)致遠(yuǎn)程任意代碼的執(zhí)行;
FILE域處理符號(hào)鏈接同源策略繞過漏洞、XSS 注入攻擊導(dǎo)致了隱私的泄露。
注意事項(xiàng):
1、盡量不要使用內(nèi)置瀏覽器,漏洞比較多;
2、不要開啟JavaScript屬性;
3、過濾File域操作;
4、關(guān)閉瀏覽器對(duì)本地文件的操作;
5、聯(lián)網(wǎng)安全
使用http協(xié)議傳送隱私數(shù)據(jù)會(huì)導(dǎo)致數(shù)據(jù)可以被輕易攔截修改。
使用https未做證書校驗(yàn)導(dǎo)致黑客通過中間人攻擊(MITM),替換用戶訪問的目標(biāo)地址,使得https失去校驗(yàn)功能。
中間人攻擊ARP(Address Resolution Protocol,地址解析協(xié)議)是一個(gè)位于TCP/IP協(xié)議棧中的網(wǎng)絡(luò)層,負(fù)責(zé)將某個(gè)IP地址解析成對(duì)應(yīng)的MAC地址,常見的中間人攻擊包括wifi破解,免費(fèi)wifi,公共wifi等網(wǎng)絡(luò)環(huán)境的寬松,還有就是各種工具開源代碼泛濫(dSploit)。
注意事項(xiàng):
1、盡量不要使用明文傳輸重要數(shù)據(jù);
2、TrustManager/HostnameVerifier要正確設(shè)置;
3、路由器安全監(jiān)測(cè);
6、數(shù)據(jù)庫(kù)操作安全
數(shù)據(jù)庫(kù)明文存儲(chǔ)重要數(shù)據(jù)會(huì)導(dǎo)致數(shù)據(jù)庫(kù)中重要數(shù)據(jù)的泄露。
數(shù)據(jù)庫(kù)文件讀寫權(quán)限的錯(cuò)誤也會(huì)導(dǎo)致數(shù)據(jù)庫(kù)重要數(shù)據(jù)的泄露。
數(shù)據(jù)庫(kù)接口不當(dāng)導(dǎo)致SQL注入將導(dǎo)致數(shù)據(jù)庫(kù)重要數(shù)據(jù)的泄露。
注意事項(xiàng):
1、數(shù)據(jù)庫(kù)文件的存儲(chǔ)在私有目錄下;
2、重要的數(shù)據(jù)庫(kù)內(nèi)容需要加密保存;
3、數(shù)據(jù)庫(kù)對(duì)外接口的安全;
4、數(shù)據(jù)庫(kù)防注入以及參數(shù)校驗(yàn);
7、加密安全
常用加密算法:
1、對(duì)稱加密: AES/DES/RC4/3DES
2、非對(duì)稱加密:RSA/ECC
3、基于口令加密:PBE
4、摘要/哈希/散列函數(shù): MD5/SHA1
加密算法的選擇:
特別重要的用戶數(shù)據(jù)加解密/簽名驗(yàn)證 PBE
本地加解密/簽名驗(yàn)證 對(duì)稱加密
客戶端/服務(wù)端通信加解密/簽名驗(yàn)證 非對(duì)稱加密
注意事項(xiàng):
1、當(dāng)指定的加密算法時(shí)顯式指定加密模式和填充方式;
2、使用健壯的算法;
3、當(dāng)使用基于密碼的加密算法時(shí)不能將密碼存儲(chǔ)在設(shè)備中;
4、使用密碼生成key時(shí)記得加鹽;
5、當(dāng)使用密碼生成key時(shí)指定哈希迭代次數(shù);
6、強(qiáng)制增加密碼強(qiáng)度;
8、如何提高APP安全性
1、進(jìn)行相關(guān)的安全審計(jì)或者安全開發(fā)培訓(xùn),提高開發(fā)者安全意識(shí);
2、注意eclipse中的warning;
3、使用外部審計(jì)工具進(jìn)行安全掃描,或者引入其他的安全服務(wù);
4、關(guān)注烏云等漏洞論壇中白帽子發(fā)現(xiàn)的問題;
5、業(yè)務(wù)安全以及相應(yīng)的邏輯檢測(cè);
總結(jié)
以上是生活随笔為你收集整理的腾讯专家教你如何保证应用开发安全的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 烂泥:为KVM虚拟机添加网卡
- 下一篇: 02 oracle 创建用户和授权