ZipperDown 漏洞浅析

By dwj1210 at

写在前面

在本文公开的时候,微博陌陌等应用已经修复了该漏洞,本文仅供学习使用。

什么是ZipperDown

盘古实验室在针对不同客户的iOS应用安全审计过程中,发现了一类通用的安全漏洞。创建漏洞指纹后,盘古实验室在Janus平台上进行溯源分析和相似漏洞检索,结果发现约10%的iOS应用可能受此漏洞的影响。经过手工分析,确认微博、陌陌、网易云音乐、QQ音乐、快手等流行应用受影响。

ZipperDown漏洞

早在5月12号,turing.huang就在GitHub提了Issues。但是截止到目前为止(5月16号),这个第三方框架的漏洞还没有被修复。

img

结合这段话和盘古团队公开的文章,我们可以看出来,应该就是常见的路径穿越漏洞导致的任意代码执行。

不了解路径穿越漏洞的同学请点击这里

ZipperDown如何重现

通过对本地存储的分析,在 /private/var/mobile/Containers/Data/Application/XXX/Documents/WBPkgFixFile/27222/843_msg_newscard/hotfix_test.js 发现了一个可疑文件 hotfix_test.js ,仔细看一下这个js文件,应该是使用了 JSPatch 来热修复的。所以我们可以先通过直接替换js文件的方式来看看会不会有效果。

我的做法是把 hotfix_test.js 文件拷贝到电脑,然后在js代码中加一个弹框,接着拷贝回沙盒目录中替换原来的文件。 img

之后我们登录微博,再杀死微博的进程,重新打开就看到了一个弹框 Your Weibo is Pwned

到此为止我们可以确定这个js文件确实可以被执行。接下来要做的是通过抓包来劫持zip的下载,来替换成我们精心构造的js文件。

通过使用Clarles抓包发现微博在安装完成第一次打开时会下载多个压缩文件。我便随便挑选了一个劫持并使用 Map Local 映射到本地已经构造好的zip文件。

img

在完成以上这些准备工作之后,删除微博重新安装。安装完成后打开微博,完成登录操作,杀死微博的进程,重新打开,这时候出现了弹框。说明我们劫持了zip包的下载,通过路径穿越成功覆盖了原本的 hotfix_test.js

文件,且成功执行了js文件中的“恶意”代码。

如何修复漏洞

想要知道如何修漏洞,肯定需要知道问题为什么会出现。而路径穿漏洞就是因为 ../ 代表了上层目录,而多个 ../ 则可以去到根目录下,这样就可访问任意文件。我们要做的就是在解压文件时,过滤掉这些带 ../ 的“恶意”文件。

如果用到了 SSZipArchive 库,需要修改一下源码。在下面这个方法中对最终解压的strPath进行检测,如果出现可能造成目录穿越的 ../ 字符串时进行拦截过滤。

+ (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;

另外,Hotpatch包除了传输过程中要加密外,在本地也需要加密保存,并且运行前做完整性校验。虽然漏洞覆盖某些重要的文件可能会造成拒绝服务攻击,但至少不会造成代码执行。

总结

路径穿越漏洞并不是一个新出现的漏洞,但是这次却有上万应用可能受此漏洞影响,不得不让我们提高在开发中对安全的重视程度。

参考资料

https://zipperdown.org/

https://github.com/ZipArchive/ZipArchive/issues/453