ZipperDown 漏洞浅析
By dwj1210 at
写在前面
在本文公开的时候,微博陌陌等应用已经修复了该漏洞,本文仅供学习使用。
什么是ZipperDown
盘古实验室在针对不同客户的iOS应用安全审计过程中,发现了一类通用的安全漏洞。创建漏洞指纹后,盘古实验室在Janus平台上进行溯源分析和相似漏洞检索,结果发现约10%的iOS应用可能受此漏洞的影响。经过手工分析,确认微博、陌陌、网易云音乐、QQ音乐、快手等流行应用受影响。
早在5月12号,turing.huang就在GitHub提了Issues。但是截止到目前为止(5月16号),这个第三方框架的漏洞还没有被修复。
结合这段话和盘古团队公开的文章,我们可以看出来,应该就是常见的路径穿越漏洞导致的任意代码执行。
不了解路径穿越漏洞的同学请点击这里。
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代码中加一个弹框,接着拷贝回沙盒目录中替换原来的文件。
之后我们登录微博,再杀死微博的进程,重新打开就看到了一个弹框 Your Weibo is Pwned
。
到此为止我们可以确定这个js文件确实可以被执行。接下来要做的是通过抓包来劫持zip的下载,来替换成我们精心构造的js文件。
通过使用Clarles抓包发现微博在安装完成第一次打开时会下载多个压缩文件。我便随便挑选了一个劫持并使用 Map Local
映射到本地已经构造好的zip文件。
在完成以上这些准备工作之后,删除微博重新安装。安装完成后打开微博,完成登录操作,杀死微博的进程,重新打开,这时候出现了弹框。说明我们劫持了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包除了传输过程中要加密外,在本地也需要加密保存,并且运行前做完整性校验。虽然漏洞覆盖某些重要的文件可能会造成拒绝服务攻击,但至少不会造成代码执行。
总结
路径穿越漏洞并不是一个新出现的漏洞,但是这次却有上万应用可能受此漏洞影响,不得不让我们提高在开发中对安全的重视程度。