IT技術互(hu)動交流平台

Android安全(quan)開發之淺cheng)該茉坑脖嗦/h1>
作者︰伊樵、呆狐@阿里聚安全(quan)  發布ji)掌qi)︰2020-02-20 02:55:15

 0x00 簡(jian)介

在阿里聚安全(quan)的漏(lou)洞掃描器中和人(ren)工APP安全(quan)審(shen)計(ji)中,經常發現有(you)開發者將密鑰硬編碼在Java代碼、文件中,這樣做會(hui)引起很大風險。信(xin)息安全(quan)的基礎在于密碼學,而常用(yong)的密碼學算(suan)法(fa)都是公開的,加yong)苣諶蕕謀C芤攬康氖敲茉康謀C埽 茉咳綣xie)露,對za)詼猿潑藶 suan)法(fa),根據用(yong)到的密鑰算(suan)法(fa)和加yong)芎蟺拿 模 莧菀椎de)到加yong)芮qian)的明文;對za)詵fei)對稱密碼算(suan)法(fa)或者簽名算(suan)法(fa),根據密鑰和要加yong)艿拿魑模 莧菀諄竦de)計(ji)算(suan)出簽名值,從(cong)而偽(wei)造簽名。

0x01 風險案(an)例

密鑰硬編碼在代碼中,而根據密鑰的用(yong)途不同(tong),這導(dao)致了(liao)不同(tong)的安全(quan)風險,有(you)的導(dao)致加yong)蓯shu)據被破解,數(shu)據不再保密,有(you)的導(dao)致和服務器通信(xin)nuo)募憂┌黃平猓  髦盅 an),以下借用(yong)烏(wu)雲上(shang)已(yi)公布的幾個APP漏(lou)洞來講bu)病/p>

1.1 某(mou)互(hu)聯網金融(rong)APP加yong)芩suan)法(fa)被破解導(dao)致敏感xing)畔 xie)露

某(mou)P2P應(ying)用(yong)客戶端,用(yong)來加yong)蓯shu)據的DES算(suan)法(fa)的密鑰硬編碼在Java代碼中,而DES算(suan)法(fa)是對稱密碼算(suan)法(fa),既(ji)加yong) 茉亢徒餉 茉肯嗤tong)。

反編譯APP,發現DES算(suan)法(fa)︰

發現DES算(suan)法(fa)的密鑰,硬編碼為(wei)“yrdAppKe”,用(yong)來加yong)蓯shou)勢密碼︰

將手(shou)勢密碼用(yong)DES加yong)芎蟠娣fang)在本jing)ocusPassWordView.xml文件中︰

知道了(liao)密文和加yong)芩suan)法(fa)以及密鑰,通過解密操作,可(ke)以從(cong)文件中恢復(fu)出原始的手(shou)勢密碼。或者使用(yong)新的生成新的手(shou)勢密碼

而與服務器通信(xin)時接口中的Jason字段也用(yong)了(liao)DES算(suan)法(fa)和密鑰硬編碼為(wei)“yRdappKY”︰

和服務器通信(xin)采用(yong)http傳輸,沒有(you)使用(yong)https來加yong)芡ㄐxin),如果采用(yong)中間人(ren)攻擊或者路由器鏡(jing)像,獲得(de)流量數(shu)據,可(ke)以破解出用(yong)戶的通信(xin)內容。

1.2 某(mou)租車(che)APP加yong)芩suan)法(fa)被破解導(dao)致一些列(lie)風險

某(mou)租車(che)APP與服務器通信(xin)nuo)慕涌誆捎yong)http傳輸數(shu)據,並(bing)且有(you)對傳輸的部分參數(shu)進行(xing)了(liao)加yong)埽 用(yong)芩suan)法(fa)采用(yong)AES,但(dan)是密鑰硬編碼在java代碼中為(wei)“shenzhoucar123123”,可(ke)被逆(ni)向分析(xi)出來,導(dao)致偽(wei)造請求,結合xi)衿鞫說穆lou)洞,引起越權訪(fang)問的風險,如越權查看其它用(yong)戶的訂(ding)單等(deng)。

和服務器通信(xin)時的數(shu)據為(wei)︰

q字段是加yong)芎蟺哪諶蕁Dni)向APP,從(cong)登錄Activity入手(shou)︰

分析(xi)登錄流程(cheng)︰v1是用(yong)戶名,v2是密碼,v3是PushId,在用(yong)戶名和密碼不為(wei)空並(bing)且長度不小于11情況下,執行(xing)LoginOperate相關操作,追蹤LoginOperate的實現,發現繼承自(zi)BaseOperate,繼續追蹤BaseOperate的實現︰

在BaseOperate的initUrl()方法(fa)中,找ye)攪liao)APP是怎(zen)麼生成請求數(shu)據的︰

繼續追蹤上(shang)圖中的initJsonUrl()方法(fa),發現其調用(yong)了(liao)AES加yong)埽/p>

繼續追蹤aes.onEncrypt()函數(shu)︰

在onEncrypt()函數(shu)中調用(yong)了(liao)encrypt()函數(shu)用(yong)來加yong)蓯shu)據,追蹤encrypt()函數(shu)的實現,發現其使用(yong)AES算(suan)法(fa),並(bing)且密鑰硬編碼在java代碼中為(wei)“shenzhoucar123123”

到現在請求中的數(shu)據加yong)莧綰問迪值木頹邐liao),另外由于服務器權限控制不嚴,就可(ke)以構造訂(ding)單id的請求,達到越權訪(fang)問到其他用(yong)戶的訂(ding)單。

構造{“id”:”11468061”}的請求:

其中uid設(she)置(zhi)為(wei)你自(zi)己的uid即可(ke),可(ke)以成功看到其他人(ren)的訂(ding)單:

 

攻擊者完全(quan)可(ke)以做到使用(yong)其他腳(jiao)本重新實現相同(tong)的加yong)芄δ懿bing)拼(pin)接出各個接口請求,批量的刷取訂(ding)單信(xin)息和用(yong)戶其他信(xin)息。

1.3 某(mou)酒pin)PP加簽算(suan)法(fa)被破解導(dao)致一系(xi)列(lie)風險

某(mou)酒pin)PP和服務器通信(xin)時接口采用(yong)http通信(xin),數(shu)據進行(xing)了(liao)加yong)埽 bing)且對傳輸參數(shu)進行(xing)簽名,在服務器端校驗(yan)簽名,以檢查傳輸的數(shu)據是否(fu)被篡(cuan)改,但(dan)是加簽算(suan)法(fa)和密鑰被逆(ni)向分析(xi),可(ke)導(dao)致加簽機制失效(xiao),攻擊者可(ke)任意偽(wei)造請求包(bao),若結合xi)衿鞫說娜ㄏ蘅?樸you)漏(lou)洞,則可(ke)引發越權風險等(deng)。

APP和服務器通信(xin)nuo)腦 及bao)如下圖,可(ke)以看到有(you)加簽字段sign︰

逆(ni)向APP定位到加yong)芩suan)法(fa)的邏輯(ji)代碼,com.htinns.biz.HttpUtils.class,其實現邏輯(ji)為(wei)︰

原始數(shu)據是unSignData,使用(yong)RC4算(suan)法(fa)加yong)埽 茉課wei)KEY變(bian)量所代表的值,加yong)芎蟺氖shu)據為(wei)signData,傳輸的數(shu)據時的data字段為(wei)signData。

加簽字段signd的生成方法(fa)是用(yong)unsignData拼(pin)接時間戳time和resultkey,然(ran)後做md5,再進行(xing)base64編碼。時間戳保證了(liao)每次請求包(bao)都不一樣。

sendSign()算(suan)法(fa)是用(yong)c或c++寫的,放(fang)入了(liao)so庫,其他重要算(suan)法(fa)都是用(yong)java寫的。

可(ke)以使用(yong)IDA逆(ni)向分析(xi)so庫,找ye)endSign()方法(fa)

而烏(wu)雲漏(lou)洞提交者采用(yong)的是分析(xi)sign和getSign(sign)的數(shu)據,做一個算(suan)法(fa)破解字典。其實還有(you)種方法(fa)直(zhi)接調用(yong)此so庫,來生成字典。

簽名破解以後,就可(ke)以構造發送(song)給(gei)服務器的數(shu)據包(bao)進行(xing)其他方面(mian)的安全(quan)測試,比如越權、重置(zhi)密碼等(deng)。

0x02 阿里聚安全(quan)開發建(jian)議

通過以上(shang)案(an)例,並(bing)總(zong)結下自(zi)己平時發現zhi)茉坑脖嗦氳鬧饕 問接you)︰

1、密鑰直(zhi)接yong)魑拇嬖haredprefs文件中,這是最不安全(quan)的。

2、密鑰直(zhi)接硬編碼在Java代碼中,這很不安全(quan),dex文件很容易被逆(ni)向成java代碼。

3、將密鑰分成不同(tong)的幾段,有(you)的存儲(chu)在文件中、有(you)的存儲(chu)在代碼中,最後將他們拼(pin)接起來,可(ke)以將整個操作寫的很復(fu)雜(za),這因為(wei)還是在java層(ceng),逆(ni)向者只要花點時間,也很容易被逆(ni)向。

4、用(yong)ndk開發,將密鑰放(fang)在so文件,加yong)芙餉懿僮鞫莢o文件里,這從(cong)一定程(cheng)度上(shang)提高了(liao)的安全(quan)性,擋住了(liao)一些逆(ni)向者,但(dan)是有(you)經驗(yan)的逆(ni)向者還是會(hui)使用(yong)IDA破解的。

5、在so文件中不存儲(chu)密鑰,so文件中對密鑰進行(xing)加解密操作,將密鑰加yong)芎蟺拿茉棵wei)其他普通文件,存放(fang)在assets目錄下或者其他目錄下,接著在so文件里面(mian)添加無關代碼(花指令(ling)),雖然(ran)可(ke)以增加靜態分析(xi)難(nan)度,但(dan)是可(ke)以使用(yong)動態調式的方法(fa),追蹤加yong)芙餉芎 shu),也可(ke)以查找ye)矯茉磕諶蕁/p>

保證密鑰的安全(quan)確是件難(nan)事(shi),涉及到密鑰分發,存儲(chu),失效(xiao)回收,APP防反編譯和防調試,還有(you)風險評估。可(ke)以說在設(she)備上(shang)安全(quan)存儲(chu)密鑰這個基本無解,只能選擇增大攻擊者的逆(ni)向成本,讓攻擊者知難(nan)而退。而要是普通開發者的話,做妥(tuo)善保護密鑰這些事(shi)情這需要耗費(fei)很大的心nan) /p>

產(chan)品設(she)計(ji)者或者開發者要明白自(zi)己的密鑰是做什麼cong)yong)的,重要程(cheng)度怎(zen)麼樣,密鑰被逆(ni)向出來會(hui)造成什麼風險,通過評估APP應(ying)用(yong)的重要程(cheng)度來選擇相應(ying)的技術方案(an)。

參考

p2p宜人(ren)貸app幾種安全(quan)問題

神州租車(che)APP客戶端設(she)計(ji)缺陷導(dao)致的一系(xi)列(lie)安全(quan)問題(算(suan)法(fa)破解/權限遍歷等(deng))

講bu)庖徊bu)步(bu)逆(ni)向破解華住酒pin)曇ji)團官(guan)網APP的http包(bao)加yong)芩suan)法(fa)以及一系(xi)列(lie)漏(lou)洞打包(bao)

http://jaq.alibaba.com/safety?spm=a313e.7837752.1000001.1.zwCPfa

https://www.zhihu.com/question/35136485/answer/84491440

 

万福彩票官网

    Tag標簽︰密鑰  編碼  

    • 万福彩票官网

    About IT165 - 廣告服務 - 隱(yin)私聲明 - 版權申明 - 免責條款 - 網站jing)贗/a> - 易购平台官网網友(you)投稿(gao) - 聯系(xi)方式
    本站內容來自(zi)za)諢hu)聯網,僅供用(yong)于網絡(luo)技術學習,學習中請遵循相關法(fa)律(lv)法(fa)規(gui)
    万福彩票官网 | 下一页