关于ZipperDown漏洞的验证和SDK防护修改
16号在网络上爆出了 iOS下的第三方开源软件 ZipArchive存在ZipperDown漏洞的文章和描述
具体参考下面资料:
简单来说,就是在iOS用第三方开源库 SSZipArchive库 对一个zip文件进行解压,可能存在目录层级穿越的问题的
举例,比如 zip文件是放置在
App沙盒/Library/Caches/01.zip
目录下,然后解压01.zip 压缩文件,如果这个zip文件是个恶意的文件,是可以存在解压出来的文件替换掉
App沙盒/Documents/patchhost
这个文件的,或者替换了Documents、Library目录下的其他文件的
1问题是否正的存在?
经过确认,这个问题存在。
使用iOS SSZipArchive开源代码,对zip文件解压能够做到目录层级跳转问题,并且替换掉一些重要的资源文件
2复现步骤
首先要生成一个能否目录层级跳转的zip文件,用下面的python脚本可以生成一个
先建立一个文本文件patchhost,然后在同级目录下新建一个python文件,内容如下:
import zipfile
import sys
if __name__ == "__main__":
try:
with open("patchhost", "r") as f:
binary = f.read()
zipFile = zipfile.ZipFile("01.zip", "a", zipfile.ZIP_DEFLATED)
info = zipfile.ZipInfo("01.zip")
zipFile.writestr("../../Documents/patchhost", binary)
zipFile.close()
except IOError as e:
raise e
运行脚本文件后,就可以生成一个01.zip文件
App如果下载了这个01.zip文件,一般下载文件会下载App沙盒/Library/Caches/目录,然后调用App用SSZipArchive进行解压,并且设置了overwrite,那么解压后的patchhost就能从Library/Caches/调转到
Documents目录下(Documents目录通常存放一些用户的数据),如果Documents目录本身带有patchhost,那么就会替换掉原先的patchhost文件,完成资源的非法替换
3作者是否会修复
github上一些工程师认为是feature,不是bug,另外github上面的SSZipArchive项目已经有人提交了这个issue,目前作者没看到要修复的样子
4能否修改
MIT协议,可以修改
5是否应该修复
在Mac上用一些工具,Keka等,解压文件并不会出现层级跳转的问题,所以在iOS下出现这个状态还是应该修复下。
且存在层级跳转,App的patchhost等重要配置文件可能存在被替换的安全问题。
6修改方案
对文件路径存在 ../ 的情况进行了检查,并过滤掉这些字符串
在 SSZipArchive.m文件下的
+ (BOOL)unzipFileAtPath:(NSString *)path
toDestination:(NSString *)destination
preserveAttributes:(BOOL)preserveAttributes
overwrite:(BOOL)overwrite
nestedZipLevel:(NSInteger)nestedZipLevel
password:(nullable NSString *)password
error:(NSError **)error
delegate:(nullable id<SSZipArchiveDelegate>)delegate
progressHandler:(void (^_Nullable)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler
completionHandler:(void (^_Nullable)(NSString *path, BOOL succeeded, NSError * _Nullable error))completionHandler
{
...
// Contains a path
if ([strPath rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@"/\\"]].location != NSNotFound) {
strPath = [strPath stringByReplacingOccurrencesOfString:@"\\" withString:@"/"];
}
//Fix ZipperDown 解压时目录层级穿越问题
strPath = [strPath stringByReplacingOccurrencesOfString:@"../" withString:@""];
NSString *fullPath = [destination stringByAppendingPathComponent:strPath];
...
}
修改后可以解决这个问题。
7其他
如果调用unzipFileAtPath接口时,设置了overwrite为NO,那也不会有问题,非法文件无法替换原文件
开发时要注意这个问题,最好每个zip文件下载完有一个验证签名的过程,避免下载到一些非法的zip文件
目前这个影响应该不是特别大,首先必须连了一些非法的wifi,然后下到被改过的zip文件,且App中没有验证zip,而且替换掉的文件能否方便下一步攻击。
影响比较大的是那些用了JSPatch的小App,且没有修改过公私钥对,这样才会导致一写恶意的代码在App上运行。那样后果比较验证。没有用JSPatch或其他hotfix脚本的,暂时影响不大。