Zip文件目錄遍歷漏洞 - ZipEntry.getName方法
一、API
1. 繼承關係
【1】java.lang.Object
【2】java.util.zip.ZipEntry
2. 主要方法
【1】getName() 返回String(entry的名字)
【2】isDirectory() 返回Boolean(是否爲directory entry)
【3】參考鏈接(Android developers)
https://developer.android.com/reference/java/util/zip/ZipEntry.html
3. 使用ZipEntry類解壓zip文件
【1】代碼示例
【2】參考鏈接
http://blog.csdn.net/jiangwei0910410003/article/details/52118575
二、觸發條件
1. 定位getName方法
【1】對應到smali語句中的特徵
Ljava/util/zip/ZipEntry;->getName()Ljava/lang/String;
2. 方法內查詢getNextEntry()
Ljava/util/zip/ZipInputStream;->getNextEntry()Ljava/util/zip/ZipEntry;
參考鏈接:https://developer.android.com/reference/java/util/zip/ZipInputStream.html#getNextEntry()
3. 判斷是否過濾特殊字符 "../"
4. 漏洞代碼示例
三、漏洞原理
【1】使用ZipEntry.getName()解壓zip文件,沒有對上級目錄字符串(../)進行過濾校驗,可能會導致被解壓的文件發生目錄跳轉,解壓到其他目錄,並且覆蓋相應的文件,最終導致任意代碼執行
【2】更多內容
https://jaq.alibaba.com/community/art/show?articleid=383
http://www.droidsec.cn/android安全開發之zip文件目錄遍歷/
http://wolfeye.baidu.com/blog/traversal-zip-file/
四、修復建議
【1】解壓zip文件時,判斷文件名是否有../特殊字符
【2】對重要的Zip壓縮包文件進行數字簽名校驗,校驗通過才進行解壓