Android安全开发之浅谈密钥硬编码
Android安全開發(fā)之淺談密鑰硬編碼
作者:伊樵、呆狐@阿里聚安全
?
1 簡(jiǎn)介
在阿里聚安全的漏洞掃描器中和人工APP安全審計(jì)中,經(jīng)常發(fā)現(xiàn)有開發(fā)者將密鑰硬編碼在Java代碼、文件中,這樣做會(huì)引起很大風(fēng)險(xiǎn)。信息安全的基礎(chǔ)在于密碼學(xué),而常用的密碼學(xué)算法都是公開的,加密內(nèi)容的保密依靠的是密鑰的保密,密鑰如果泄露,對(duì)于對(duì)稱密碼算法,根據(jù)用到的密鑰算法和加密后的密文,很容易得到加密前的明文;對(duì)于非對(duì)稱密碼算法或者簽名算法,根據(jù)密鑰和要加密的明文,很容易獲得計(jì)算出簽名值,從而偽造簽名。
?
2 風(fēng)險(xiǎn)案例
密鑰硬編碼在代碼中,而根據(jù)密鑰的用途不同,這導(dǎo)致了不同的安全風(fēng)險(xiǎn),有的導(dǎo)致加密數(shù)據(jù)被破解,數(shù)據(jù)不再保密,有的導(dǎo)致和服務(wù)器通信的加簽被破解,引發(fā)各種血案,以下借用烏云上已公布的幾個(gè)APP漏洞來講講。
?
2.1 某互聯(lián)網(wǎng)金融APP加密算法被破解導(dǎo)致敏感信息泄露
某P2P應(yīng)用客戶端,用來加密數(shù)據(jù)的DES算法的密鑰硬編碼在Java代碼中,而DES算法是對(duì)稱密碼算法,既加密密鑰和解密密鑰相同。?
反編譯APP,發(fā)現(xiàn)DES算法:
?
發(fā)現(xiàn)DES算法的密鑰,硬編碼為“yrdAppKe”,用來加密手勢(shì)密碼:
?
將手勢(shì)密碼用DES加密后存放在本地LocusPassWordView.xml文件中:
?
知道了密文和加密算法以及密鑰,通過解密操作,可以從文件中恢復(fù)出原始的手勢(shì)密碼。或者使用新的生成新的手勢(shì)密碼
而與服務(wù)器通信時(shí)接口中的Jason字段也用了DES算法和密鑰硬編碼為“yRdappKY”:
?
和服務(wù)器通信采用http傳輸,沒有使用https來加密通信,如果采用中間人攻擊或者路由器鏡像,獲得流量數(shù)據(jù),可以破解出用戶的通信內(nèi)容。
?
2.2 某租車APP加密算法被破解導(dǎo)致一些列風(fēng)險(xiǎn)
某租車APP與服務(wù)器通信的接口采用http傳輸數(shù)據(jù),并且有對(duì)傳輸?shù)牟糠謪?shù)進(jìn)行了加密,加密算法采用AES,但是密鑰硬編碼在java代碼中為“shenzhoucar123123”,可被逆向分析出來,導(dǎo)致偽造請(qǐng)求,結(jié)合服務(wù)器端的漏洞,引起越權(quán)訪問的風(fēng)險(xiǎn),如越權(quán)查看其它用戶的訂單等。?
和服務(wù)器通信時(shí)的數(shù)據(jù)為:
?
q字段是加密后的內(nèi)容。逆向APP,從登錄Activity入手:
?
分析登錄流程:v1是用戶名,v2是密碼,v3是PushId,在用戶名和密碼不為空并且長(zhǎng)度不小于11情況下,執(zhí)行LoginOperate相關(guān)操作,追蹤LoginOperate的實(shí)現(xiàn),發(fā)現(xiàn)繼承自BaseOperate,繼續(xù)追蹤BaseOperate的實(shí)現(xiàn):
?
在BaseOperate的initUrl()方法中,找到了APP是怎么生成請(qǐng)求數(shù)據(jù)的:
?
繼續(xù)追蹤上圖中的initJsonUrl()方法,發(fā)現(xiàn)其調(diào)用了AES加密:
?
繼續(xù)追蹤aes.onEncrypt()函數(shù):
?
在onEncrypt()函數(shù)中調(diào)用了encrypt()函數(shù)用來加密數(shù)據(jù),追蹤encrypt()函數(shù)的實(shí)現(xiàn),發(fā)現(xiàn)其使用AES算法,并且密鑰硬編碼在java代碼中為“shenzhoucar123123”
?
到現(xiàn)在請(qǐng)求中的數(shù)據(jù)加密如何實(shí)現(xiàn)的就清晰了,另外由于服務(wù)器權(quán)限控制不嚴(yán),就可以構(gòu)造訂單id的請(qǐng)求,達(dá)到越權(quán)訪問到其他用戶的訂單。?
構(gòu)造{“id”:”11468061”}的請(qǐng)求:
?
其中uid設(shè)置為你自己的uid即可,可以成功看到其他人的訂單:
?
攻擊者完全可以做到使用其他腳本重新實(shí)現(xiàn)相同的加密功能并拼接出各個(gè)接口請(qǐng)求,批量的刷取訂單信息和用戶其他信息。
?
2.3 某酒店APP加簽算法被破解導(dǎo)致一系列風(fēng)險(xiǎn)
某酒店APP和服務(wù)器通信時(shí)接口采用http通信,數(shù)據(jù)進(jìn)行了加密,并且對(duì)傳輸參數(shù)進(jìn)行簽名,在服務(wù)器端校驗(yàn)簽名,以檢查傳輸?shù)臄?shù)據(jù)是否被篡改,但是加簽算法和密鑰被逆向分析,可導(dǎo)致加簽機(jī)制失效,攻擊者可任意偽造請(qǐng)求包,若結(jié)合服務(wù)器端的權(quán)限控制有漏洞,則可引發(fā)越權(quán)風(fēng)險(xiǎn)等。
APP和服務(wù)器通信的原始包如下圖,可以看到有加簽字段sign:
?
逆向APP定位到加密算法的邏輯代碼,com.htinns.biz.HttpUtils.class,其實(shí)現(xiàn)邏輯為:
?
原始數(shù)據(jù)是unSignData,使用RC4算法加密,密鑰為KEY變量所代表的值,加密后的數(shù)據(jù)為signData,傳輸?shù)臄?shù)據(jù)時(shí)的data字段為signData。?
加簽字段signd的生成方法是用unsignData拼接時(shí)間戳time和resultkey,然后做md5,再進(jìn)行base64編碼。時(shí)間戳保證了每次請(qǐng)求包都不一樣。?
sendSign()算法是用c或c++寫的,放入了so庫(kù),其他重要算法都是用java寫的。?
可以使用IDA逆向分析so庫(kù),找到sendSign()方法
?
而烏云漏洞提交者采用的是分析sign和getSign(sign)的數(shù)據(jù),做一個(gè)算法破解字典。其實(shí)還有種方法直接調(diào)用此so庫(kù),來生成字典。
簽名破解以后,就可以構(gòu)造發(fā)送給服務(wù)器的數(shù)據(jù)包進(jìn)行其他方面的安全測(cè)試,比如越權(quán)、重置密碼等。
?
3 阿里聚安全開發(fā)建議
通過以上案例,并總結(jié)下自己平時(shí)發(fā)現(xiàn)密鑰硬編碼的主要形式有:?
1、密鑰直接明文存在sharedprefs文件中,這是最不安全的。?
2、密鑰直接硬編碼在Java代碼中,這很不安全,dex文件很容易被逆向成java代碼。?
3、將密鑰分成不同的幾段,有的存儲(chǔ)在文件中、有的存儲(chǔ)在代碼中,最后將他們拼接起來,可以將整個(gè)操作寫的很復(fù)雜,這因?yàn)檫€是在java層,逆向者只要花點(diǎn)時(shí)間,也很容易被逆向。?
4、用ndk開發(fā),將密鑰放在so文件,加密解密操作都在so文件里,這從一定程度上提高了的安全性,擋住了一些逆向者,但是有經(jīng)驗(yàn)的逆向者還是會(huì)使用IDA破解的。?
5、在so文件中不存儲(chǔ)密鑰,so文件中對(duì)密鑰進(jìn)行加解密操作,將密鑰加密后的密鑰命名為其他普通文件,存放在assets目錄下或者其他目錄下,接著在so文件里面添加無關(guān)代碼(花指令),雖然可以增加靜態(tài)分析難度,但是可以使用動(dòng)態(tài)調(diào)式的方法,追蹤加密解密函數(shù),也可以查找到密鑰內(nèi)容。
?
保證密鑰的安全確是件難事,涉及到密鑰分發(fā),存儲(chǔ),失效回收,APP防反編譯和防調(diào)試,還有風(fēng)險(xiǎn)評(píng)估。可以說在設(shè)備上安全存儲(chǔ)密鑰這個(gè)基本無解,只能選擇增大攻擊者的逆向成本,讓攻擊者知難而退。而要是普通開發(fā)者的話,做妥善保護(hù)密鑰這些事情這需要耗費(fèi)很大的心血。
?
產(chǎn)品設(shè)計(jì)者或者開發(fā)者要明白自己的密鑰是做什么用的,重要程度怎么樣,密鑰被逆向出來會(huì)造成什么風(fēng)險(xiǎn),通過評(píng)估APP應(yīng)用的重要程度來選擇相應(yīng)的技術(shù)方案。
?
所以建議不妨試試阿里聚安全的安全加固和安全組件,其中安全組件中的安全加密功能提供了開發(fā)者密鑰的安全管理與加密算法實(shí)現(xiàn),保證密鑰的安全性,實(shí)現(xiàn)安全的加解密操作;安全簽名功能實(shí)現(xiàn)客戶端請(qǐng)求的簽名處理,保證客戶端與服務(wù)端通信請(qǐng)求不被偽造。安全加固提升安全等級(jí),防止應(yīng)用被逆向破解。這樣同時(shí)從應(yīng)用層、運(yùn)行層、native層提供多層次全方位立體防護(hù),另外還有安全沙箱、白盒加密、底層加固共同保證客戶端數(shù)據(jù)安全。攻防是不斷變化演進(jìn)的,阿里聚安全提供的服務(wù)能實(shí)時(shí)更新客戶端模塊,通過阿里聚安全的漏洞掃描來檢測(cè)應(yīng)用是否具有密鑰硬編碼風(fēng)險(xiǎn),保證在攻防對(duì)抗中永遠(yuǎn)處于上風(fēng)。
?
專業(yè)的事情交給專業(yè)的人來做,自己的主要精力用來做功能開發(fā)或者業(yè)務(wù)邏輯,快速打造能贏得市場(chǎng)的可靠產(chǎn)品才是王道。
?
參考
[1]?http://www.wooyun.org/bugs/wooyun-2010-0187287?
[2]?http://www.wooyun.org/bugs/wooyun-2010-0105766?
[3]?http://www.wooyun.org/bugs/wooyun-2015-0162907?
[4]?http://jaq.alibaba.com/safety?spm=a313e.7837752.1000001.1.zwCPfa?
[5]?https://www.zhihu.com/question/35136485/answer/84491440
?
作者:伊樵、呆狐@阿里聚安全,更多安全技術(shù)文章,請(qǐng)?jiān)L問阿里聚安全博客
?
總結(jié)
以上是生活随笔為你收集整理的Android安全开发之浅谈密钥硬编码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaSE学习总结第08天_面向对象3
- 下一篇: Android 应用 之路 天气预报(五