ZipperDown漏洞背景介绍
盘古实验室在2017年里多次承接来自不同客户的iOS App审计业务。除常规安全扫描外,实验室研究员对所审计的iOS App进行深入分析,研究各种潜在攻击面,挖掘了多种安全漏洞和潜在风险。
Zip文件解压缩过程中,由文件名和符号链接等引起的路径穿越进而导致文件覆盖是一类非常经典的安全问题,大量Unzip软件都曾被发现这类安全漏洞。鉴于此,对所审计的iOS App中存在Zip文件处理的,我们都通过人工分析确认是否存在风险。基于盘古实验室研究人员丰富的安全经验,我们在多个iOS App中发现了解压缩过程中存在路径穿越问题。
最初,我们仅以为这是一些个别案例。然而,随着被审计的iOS App数目不断增长,我们吃惊地发现,Zip文件解压缩过程中路径穿越问题普遍存在于不同客户的不同类别的App中!从个别案例到普遍存在,我们开始反思,为什么iOS应用中一个如此典型的安全漏洞如此普遍?
经过仔细分析,我们确认这些受影响的iOS应用大多重用了SSZipArchive和ZipArchive两个开源库。这两个开源库,都提供了将Zip文件中的内容解压缩到一个含有相对路径的目录中的特性。我们不由得面对接下来的一个问题,到底多少iOS应用使用了这两个开源库?
幸运地是,与此同时公司另外一个项目Janus 移动安全威胁数据平台(appscan.io)上已经收录了168,951个iOS App。因此,我们创建了SSZipArchive和ZipArchive库特征,在Janus平台上进行匹配检索,最终发现15,979个iOS App使用了这两个库!在这些iOS App中,不乏各种超级流行应用。我们对这个庞大的疑似受影响列表进行了抽检,结果更令人不安,微博、陌陌、快手、网易云音乐、QQ音乐等确实受影响。
这时候,我们意识到另外一个更加棘手问题:这个漏洞如何披露?首先,面对如此大的疑似受影响列表,我们显然无法逐一确认。其次,本着负责任披露的原则,即便我们通知给库的开发方、已确认受影响的App开发方,如何更好的保护那些在疑似列表上的App用户?
再三斟酌后,我们发布了zipperdown.org 站点,将这类问题称作ZipperDown,暂时没有公开漏洞细节,而是通过公开疑似受影响列表的方式,期望与App开发者一起来协同修复这个问题。zipperdown.org发布后,我们收到了283封询问邮件,在确认发信人身份后,我们共回复260份邮件分享了漏洞细节。
疑似列表公开后,我们承受了很大压力。疑似列表给很多未真正受影响的App带了很多困扰,我们为此表示深深歉意。但是我们仍然认为,对这两个库的使用是潜在的风险点,希望开发者能够结合自身业务场景彻底杜绝该类问题。更为重要的是,我们想传达的信息是,开发者应该重新审计自己App中对Zip文件的处理,即便没有使用这两个开源库,也要确保杜绝路径穿越等经典安全问题。
我们在Android平台上发现了类似问题。其他安全研究人员也在多个流行应用中披漏了不同形态的路径穿越漏洞(” General ways to find and exploit Path Traversal Vulnerabilities onAndroid APPs”, Xiaobo Xiang, DefCon China, 2018.)。请访问zipperdown.appscan.io,查询您的Android App是否存在类似问题。
ZipperDown漏洞详情
SSZipArchive和ZipArchive解压缩过程中没有考虑到文件名中包含”../”的情况,造成了文件释放过程中路径穿越,导致恶意Zip文件可以在App沙盒范围内,覆盖任意可写文件。具体代码如下:
ZipArchive相关代码:
SSZipArchive相关代码:
ZipperDown漏洞攻击场景
iOS平台下漏洞攻击场景
基于漏洞原理,漏洞利用条件的核心即如何使目标App解压不可信Zip文件。因为App业务差异大,我们仅列举部分常见场景。
1. App直接接收不可信Zip文件,并使用SSZipArchive/ZipArchive(或其它存在路径穿越问题的代码)解压。例如聊天应用、文件管理应用中可能存在这类业务场景。
2. App通过HTTP下载Zip文件,使用SSZipArchive/ZipArchive(或其它存在路径穿越问题的代码)解压。在这种场景下,攻击者可以通过流量劫持等途径,将正常Zip文件替换为恶意Zip文件,在App中实现文件覆盖。
此外,文件覆盖的后继攻击依赖于具体App环境。在使用热补丁的App中,可能存在补丁文件被覆盖,进而导致恶意补丁文件加载执行的情况。即使没有使用热补丁,恶意Zip文件也可能覆盖核心数据文件,触发App解析这些核心数据中的逻辑错误或编码错误等问题。由于iOS沙盒保护,ZipperDown的破坏范围仅限在App环境中。
Android平台下漏洞攻击场景
相比iOS下的ZipperDown,安卓平台下的ZipperDown漏洞更直观、更容易理解,且破坏力也更大。安卓平台下的ZipperDown漏洞在利用场景上与iOS的有一些不同,主要区别在于:
1. 系统沙盒的策略不同。iOS应用中,所有可执行代码都必须签名,且可执行代码存储在随机目录中。在这种情况下,外部很难预测可执行代码的路径,而且,即使能成功预测并覆盖,可执行代码也无法加载。而安卓平台不同,在安卓平台下,应用代码的存储路径是固定的,且可以修改的,除此之外,可以利用应用自身的各种机制来加载外部代码,这给了安卓下的ZipperDown更大的破坏力。
2. 数据传输的策略不同。苹果已经强制所有应用使用HTTPS协议传输数据,虽然本次ZipperDown事件暴露出来的问题出乎意料,但苹果至少已经在这方面做出了一些努力。而安卓下却没有这方面的明确的规定,这也导致安卓下的问题更严重。
3. 导致ZipperDown的库不同。在iOS中,ZipperDown漏洞主要是在使用SSZipArchive和ZipArchive这两个第三方库时引入的。而安卓平台下,系统的framework就提供这个功能,且同样不带不安全zip文件的检测功能。虽然安卓平台下也存在一些第三方库,如https://github.com/zeroturnaround/zt-zip,但janus上的查询显示,这类第三方库的用量并不是很大https://www.appscan.io/search-app.html#type=app&q=strings:&page=1&hidecount=true&val=strings:%22Failed%20to%20process%20zip%20entry%22。
目前,针对安卓应用的ZipperDown漏洞,Janus已经提供了线上检测功能。通过访问www.appscan.io即可对应用进行检测。与iOS应用类似,我们目前无法对ZipperDown漏洞进行全自动的检测,对疑似问题,我们建议开发者使用Janus的深度检查功能来自行确认应用逻辑。
修复方案
鉴于疑似受影响App业务场景的复杂性,我们建议以下修复方案,供各方参考。
· 修复开源库,充分考虑文件名中“../”和符号链接等情况,确保解压缩过程中不会出现路径穿越问题。参考补丁实现:
https://github.com/ZipArchive/ZipArchive/pull/454/commits/a431f782569c7dacbf58d2b72b0b80e71d2c81fe
· 重新审计Zip文件来源,避免处理不可信Zip文件。例如,严格使用https下载Zip文件,或者对下载的Zip文件进行安全校验防止篡改。
声明:本文来自盘古实验室,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。