一、問題描述
昨天公司的項目安全測試報告顯示App存在安全漏洞,評測結果顯示“該App存在解壓zip文件時可導致目錄遍歷的漏洞”。如下圖:
Sybil052-140724@2x.png
二、出現(xiàn)原因
這里的惡意漏洞的問題就在于:因為ZipEntry在進行壓縮文件的時候,名稱沒有做任何限制,而在Android系統(tǒng)中../這種特殊符號代表的是回到上層目錄,又因為這個解壓工作在本應用中,可以借助app的自生權限,把惡意文件名改成:../../../data/data/...即可在解壓的時候把文件解壓到了應用的沙盒中。
例如:現(xiàn)在知道了一個應用的沙盒數(shù)據的詳細信息,比如一些隱私數(shù)據存放在SharedPreferences.xml中,那么這時候我們可以利用這個漏洞,把惡意文件命名成 ../../../../data/data/xxx.xxx.xxx/shared_pref/info.xml,這樣在使用ZipEntry進行解壓文件的時候,因為直接使用了ZipEntry.getName方法或者文件名,然后直接釋放解壓到本地了,所以這時候就相當于替換了本應用的沙盒數(shù)據了,這個也是利用了app本身的權限來寫入沙盒數(shù)據。
三、解決方案
當App中使用zipInputStream類對zip壓縮包進行解壓操作時,在zipEntry.getName()獲取文件名后,必須添加過濾代碼對文件名中可能包含的“../”進行過濾判斷,即:文件名稱不能包含"../"這種特殊字符。
最后附上代碼:
while(( zipEntry = zipInputStream.getNextEntry()) != null ){
String entryName = zipEntry.getName();
if(entryName.contains("../")){
continue;
// 或者
// throw new Exception("發(fā)現(xiàn)不安全的zip文件解壓路徑!")
}
...
}