Android安全開(kāi)發(fā)之淺談密鑰硬編碼
0x00 簡(jiǎn)介
在阿里聚安全的漏洞掃描器中和人工APP安全審計(jì)中,經(jīng)常發(fā)現(xiàn)有開(kāi)發(fā)者將密鑰硬編碼在Java代碼、文件中,這樣做會(huì)引起很大風(fēng)險(xiǎn)。信息安全的基礎(chǔ)在于密碼學(xué),而常用的密碼學(xué)算法都是公開(kāi)的,加密內(nèi)容的保密依靠的是密鑰的保密,密鑰如果泄露,對(duì)于對(duì)稱(chēng)密碼算法,根據(jù)用到的密鑰算法和加密后的密文,很容易得到加密前的明文;對(duì)于非對(duì)稱(chēng)密碼算法或者簽名算法,根據(jù)密鑰和要加密的明文,很容易獲得計(jì)算出簽名值,從而偽造簽名。
0x01 風(fēng)險(xiǎn)案例
密鑰硬編碼在代碼中,而根據(jù)密鑰的用途不同,這導(dǎo)致了不同的安全風(fēng)險(xiǎn),有的導(dǎo)致加密數(shù)據(jù)被破解,數(shù)據(jù)不再保密,有的導(dǎo)致和服務(wù)器通信的加簽被破解,引發(fā)各種血案,以下借用烏云上已公布的幾個(gè)APP漏洞來(lái)講講。
1.1 某互聯(lián)網(wǎng)金融APP加密算法被破解導(dǎo)致敏感信息泄露
某P2P應(yīng)用客戶(hù)端,用來(lái)加密數(shù)據(jù)的DES算法的密鑰硬編碼在Java代碼中,而DES算法是對(duì)稱(chēng)密碼算法,既加密密鑰和解密密鑰相同。
反編譯APP,發(fā)現(xiàn)DES算法:

發(fā)現(xiàn)DES算法的密鑰,硬編碼為“yrdAppKe”,用來(lái)加密手勢(shì)密碼:

將手勢(shì)密碼用DES加密后存放在本地LocusPassWordView.xml文件中:

知道了密文和加密算法以及密鑰,通過(guò)解密操作,可以從文件中恢復(fù)出原始的手勢(shì)密碼。或者使用新的生成新的手勢(shì)密碼
而與服務(wù)器通信時(shí)接口中的Jason字段也用了DES算法和密鑰硬編碼為“yRdappKY”:


和服務(wù)器通信采用http傳輸,沒(méi)有使用https來(lái)加密通信,如果采用中間人攻擊或者路由器鏡像,獲得流量數(shù)據(jù),可以破解出用戶(hù)的通信內(nèi)容。
1.2 某租車(chē)APP加密算法被破解導(dǎo)致一些列風(fēng)險(xiǎn)
某租車(chē)APP與服務(wù)器通信的接口采用http傳輸數(shù)據(jù),并且有對(duì)傳輸?shù)牟糠謪?shù)進(jìn)行了加密,加密算法采用AES,但是密鑰硬編碼在java代碼中為“shenzhoucar123123”,可被逆向分析出來(lái),導(dǎo)致偽造請(qǐng)求,結(jié)合服務(wù)器端的漏洞,引起越權(quán)訪問(wèn)的風(fēng)險(xiǎn),如越權(quán)查看其它用戶(hù)的訂單等。
和服務(wù)器通信時(shí)的數(shù)據(jù)為:

q字段是加密后的內(nèi)容。逆向APP,從登錄Activity入手:

分析登錄流程:v1是用戶(hù)名,v2是密碼,v3是PushId,在用戶(hù)名和密碼不為空并且長(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ù)用來(lái)加密數(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)訪問(wèn)到其他用戶(hù)的訂單。
構(gòu)造{“id”:”11468061”}的請(qǐng)求:

其中uid設(shè)置為你自己的uid即可,可以成功看到其他人的訂單:

攻擊者完全可以做到使用其他腳本重新實(shí)現(xiàn)相同的加密功能并拼接出各個(gè)接口請(qǐng)求,批量的刷取訂單信息和用戶(hù)其他信息。
1.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++寫(xiě)的,放入了so庫(kù),其他重要算法都是用java寫(xiě)的。
可以使用IDA逆向分析so庫(kù),找到sendSign()方法

而烏云漏洞提交者采用的是分析sign和getSign(sign)的數(shù)據(jù),做一個(gè)算法破解字典。其實(shí)還有種方法直接調(diào)用此so庫(kù),來(lái)生成字典。
簽名破解以后,就可以構(gòu)造發(fā)送給服務(wù)器的數(shù)據(jù)包進(jìn)行其他方面的安全測(cè)試,比如越權(quán)、重置密碼等。
0x02 阿里聚安全開(kāi)發(fā)建議
通過(guò)以上案例,并總結(jié)下自己平時(shí)發(fā)現(xiàn)密鑰硬編碼的主要形式有:
1、密鑰直接明文存在sharedprefs文件中,這是最不安全的。
2、密鑰直接硬編碼在Java代碼中,這很不安全,dex文件很容易被逆向成java代碼。
3、將密鑰分成不同的幾段,有的存儲(chǔ)在文件中、有的存儲(chǔ)在代碼中,最后將他們拼接起來(lái),可以將整個(gè)操作寫(xiě)的很復(fù)雜,這因?yàn)檫€是在java層,逆向者只要花點(diǎn)時(shí)間,也很容易被逆向。
4、用ndk開(kāi)發(fā),將密鑰放在so文件,加密解密操作都在so文件里,這從一定程度上提高了的安全性,擋住了一些逆向者,但是有經(jīng)驗(yàn)的逆向者還是會(huì)使用IDA破解的。
5、在so文件中不存儲(chǔ)密鑰,so文件中對(duì)密鑰進(jìn)行加解密操作,將密鑰加密后的密鑰命名為其他普通文件,存放在assets目錄下或者其他目錄下,接著在so文件里面添加無(wú)關(guān)代碼(花指令),雖然可以增加靜態(tài)分析難度,但是可以使用動(dòng)態(tài)調(diào)式的方法,追蹤加密解密函數(shù),也可以查找到密鑰內(nèi)容。
保證密鑰的安全確是件難事,涉及到密鑰分發(fā),存儲(chǔ),失效回收,APP防反編譯和防調(diào)試,還有風(fēng)險(xiǎn)評(píng)估??梢哉f(shuō)在設(shè)備上安全存儲(chǔ)密鑰這個(gè)基本無(wú)解,只能選擇增大攻擊者的逆向成本,讓攻擊者知難而退。而要是普通開(kāi)發(fā)者的話,做妥善保護(hù)密鑰這些事情這需要耗費(fèi)很大的心血。
產(chǎn)品設(shè)計(jì)者或者開(kāi)發(fā)者要明白自己的密鑰是做什么用的,重要程度怎么樣,密鑰被逆向出來(lái)會(huì)造成什么風(fēng)險(xiǎn),通過(guò)評(píng)估APP應(yīng)用的重要程度來(lái)選擇相應(yīng)的技術(shù)方案。
參考
神州租車(chē)APP客戶(hù)端設(shè)計(jì)缺陷導(dǎo)致的一系列安全問(wèn)題(算法破解/權(quán)限遍歷等)
講解一步步逆向破解華住酒店集團(tuán)官網(wǎng)APP的http包加密算法以及一系列漏洞打包
http://jaq.alibaba.com/safety?spm=a313e.7837752.1000001.1.zwCPfa
https://www.zhihu.com/question/35136485/answer/84491440