Zip Slip 概念验证

时间:2024-04-08 12:29:35

 

我记得较早的时候可能在某篇文章里我简单提到过Zip Slip。今天给同事code review的时候发现代码里没有防御Zip Slip攻击,所以就把这个主题拿出来炒一下冷饭。为了方便大家理解原理,这次我会给出一个概念验证。

Zip Slip 概念验证

首先还是得介绍一下原理。

Zip Slip是一个普遍存在的允许任意文件覆盖的严重漏洞,最早由Snyk安全团队于2018年6月5日公开披露。该漏洞存在于多个生态系统中,包括JS、Ruby、.NET和Go,但在Java中尤其普遍。通过目录遍历文件名(例如../../evil.sh)的精心构建的存档文件攻击者可以通过Zip Slip 漏洞把恶意文件复制到操作系统中(超出应用本身的控制范围之外)。Zip Slip漏洞可影响多种存档格式,包括zip、tar、jar、war、cpio、apk、rar和7z。

 

再说一下DEV可能的反应。

有一些很典型的误解,首先是“右倾”的观点,“执行unzip的是管理员呀,我为什么不能信任他 ?!”,或者“难道对unzip的操作(或API)做严格的权限管理就行了吗?”NO! 典型的攻击者是提供了或者修改了ZIP文件的人,他期望经由一个privileged 用户给他把恶意文件放置到适当的位置,以备他日后使用。比如上传一个webshell。

 

还有一种“左倾”的观点,“那为什么不检查每个zip entry 看看是不是有人修改了我预期的文件?” 好吧,你说得对,任何上传的文件都不该轻易信任,在使用之前确实需要检查——除非你确信来自可信源。比如,我们可以检查MD5(最好是SHA)checksum,我们可以检查MIME type。但是这跑题了,这是任意文件上传漏洞。这些事情应该做,但不是在Zip Slip防御的考虑范围之内。

 

最后还有一种既不“左倾”又不“右倾”的观点,但明显可以算作“阶级敌人”的观点:“我承认这是个问题,但看起来要结合别的漏洞才能造成正真破坏,只要我保证没有别的漏洞就没事,所以我还是不修了吧”。

Zip Slip 概念验证

 

好吧,talk is cheap,show me the code:

Zip Slip 概念验证

用于测试的“精心构造的”(好吧,其实是我很随意构造的Zip Slip 概念验证)ZIP 文件的内容如下,

Zip Slip 概念验证

程序运行之后,

Zip Slip 概念验证

 

最后,如果你用的不是java语言,可以参看这个whitepaper,

https://res.cloudinary.com/snyk/image/upload/v1528192501/zip-slip-vulnerability/technical-whitepaper.pdf

 

识别以下二维码关注本公众号

Zip Slip 概念验证

点击作者头像可以找到部分历史文章