一损肛、問(wèn)題描述
昨天公司的項(xiàng)目安全測(cè)試報(bào)告顯示App存在安全漏洞太闺,評(píng)測(cè)結(jié)果顯示“該App存在解壓zip文件時(shí)可導(dǎo)致目錄遍歷的漏洞”宠页。如下圖:
二葵孤、出現(xiàn)原因
這里的惡意漏洞的問(wèn)題就在于:因?yàn)閆ipEntry在進(jìn)行壓縮文件的時(shí)候,名稱(chēng)沒(méi)有做任何限制暇榴,而在Android系統(tǒng)中../這種特殊符號(hào)代表的是回到上層目錄厚棵,又因?yàn)檫@個(gè)解壓工作在本應(yīng)用中,可以借助app的自生權(quán)限蔼紧,把惡意文件名改成:../../../data/data/...即可在解壓的時(shí)候把文件解壓到了應(yīng)用的沙盒中婆硬。
例如:現(xiàn)在知道了一個(gè)應(yīng)用的沙盒數(shù)據(jù)的詳細(xì)信息,比如一些隱私數(shù)據(jù)存放在SharedPreferences.xml中奸例,那么這時(shí)候我們可以利用這個(gè)漏洞彬犯,把惡意文件命名成 ../../../../data/data/xxx.xxx.xxx/shared_pref/info.xml,這樣在使用ZipEntry進(jìn)行解壓文件的時(shí)候,因?yàn)橹苯邮褂昧薢ipEntry.getName方法或者文件名谐区,然后直接釋放解壓到本地了湖蜕,所以這時(shí)候就相當(dāng)于替換了本應(yīng)用的沙盒數(shù)據(jù)了,這個(gè)也是利用了app本身的權(quán)限來(lái)寫(xiě)入沙盒數(shù)據(jù)卢佣。
三重荠、解決方案
當(dāng)App中使用zipInputStream類(lèi)對(duì)zip壓縮包進(jìn)行解壓操作時(shí),在zipEntry.getName()獲取文件名后虚茶,必須添加過(guò)濾代碼對(duì)文件名中可能包含的“../”進(jìn)行過(guò)濾判斷,即:文件名稱(chēng)不能包含"../"這種特殊字符仇参。
最后附上代碼:
while(( zipEntry = zipInputStream.getNextEntry()) != null ){
String entryName = zipEntry.getName();
if(entryName.contains("../")){
continue;
// 或者
// throw new Exception("發(fā)現(xiàn)不安全的zip文件解壓路徑嘹叫!")
}
...
}