关于SSZipArchive ZipperDown漏洞的验证和SDK防护修改

关于ZipperDown漏洞的验证和SDK防护修改

16号在网络上爆出了 iOS下的第三方开源软件 ZipArchive存在ZipperDown漏洞的文章和描述

具体参考下面资料:

iOS曝ZipperDown漏洞 热门App几乎全中招

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脚本的,暂时影响不大。

猜你喜欢

转载自www.cnblogs.com/huangzizhu/p/9057226.html