如何排查并修复Cordova iOS应用的Zipperdown漏洞?
排查与解决Cordova iOS应用的Zipperdown漏洞
一、漏洞排查步骤
- 确认解压库版本:检查项目中使用的
ZipArchive或SSZipArchive版本,旧版本(如SSZipArchive 2.2.2之前、ZipArchive v1.5.1之前)普遍存在路径遍历漏洞,允许解压包含../的恶意文件路径。 - 审计解压逻辑:定位代码中所有调用解压库的位置,查看是否未对解压文件的路径做校验——如果直接将zip内的文件路径拼接至目标目录,未过滤
../等父目录跳转符,就存在风险。 - 检查网络传输安全性:确认zip文件的下载链路是否使用非加密HTTP协议,这类链路极易被MiTM攻击替换文件;即便用HTTPS,也要检查是否存在绕过证书校验的代码(比如
Info.plist中NSAllowsArbitraryLoads设为YES且无合理例外)。 - 核查动态代码加载路径:查看应用是否通过Cordova JavaScript桥加载本地可写目录(如Documents、Library)中的JS文件——这类目录若被恶意zip覆盖,会直接导致远程代码执行。
二、漏洞修复方案
- 升级解压库至安全版本:
将SSZipArchive升级到2.2.2及以上,ZipArchive升级到v1.5.2及以上。这些版本已内置路径校验,会自动拦截试图跳转到父目录的恶意文件。 - 手动添加路径校验(若无法升级库):
在解压前或解压后,强制校验所有文件的绝对路径,确保其落在目标解压目录范围内。示例代码(SSZipArchive):NSString *safeDestPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; [SSZipArchive unzipFileAtPath:zipFilePath toDestination:safeDestPath completionHandler:^(NSString *path, BOOL succeeded, NSError *error) { if (succeeded) { NSFileManager *fm = [NSFileManager defaultManager]; NSDirectoryEnumerator *enumerator = [fm enumeratorAtPath:safeDestPath]; NSString *fileName; while ((fileName = [enumerator nextObject])) { NSString *fullFilePath = [safeDestPath stringByAppendingPathComponent:fileName]; // 校验路径是否为目标目录的子路径 if (![fullFilePath hasPrefix:safeDestPath]) { [fm removeItemAtPath:fullFilePath error:nil]; succeeded = NO; error = [NSError errorWithDomain:@"ZipperdownFix" code:-1 userInfo:@{NSLocalizedDescriptionKey:@"检测到恶意路径文件"}]; break; } } } // 后续处理逻辑 }]; - 强制加密zip传输链路:
所有zip文件的下载请求必须使用HTTPS,且严格校验服务器证书。禁止在Info.plist中全局开启NSAllowsArbitraryLoads,仅对必要的非HTTPS域名添加例外。 - 限制动态代码加载的安全范围:
- 优先从应用Bundle目录(只读,无法被篡改)加载动态JS代码;
- 若必须从可写目录加载,需在下载zip时附带文件哈希值,解压后逐个验证文件哈希,确保未被篡改;
- 在Cordova的
config.xml中配置严格的Content-Security-Policy,限制脚本加载来源:<content-security-policy> default-src 'self' https:; script-src 'self' 'unsafe-inline' 'unsafe-eval' https:; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; </content-security-policy>
- 验证修复效果:
构造包含../路径的恶意zip文件,测试应用是否会拦截解压;同时模拟MiTM场景,确认zip文件无法被篡改;最后检查动态加载的JS文件是否仅来自安全路径。
内容的提问来源于stack exchange,提问作者R sukumar
相关产品推荐
相关产品推荐

