开源项目hutool之zip_slip漏洞

Posted jinqi520

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开源项目hutool之zip_slip漏洞相关的知识,希望对你有一定的参考价值。

今天突然看到了去年写的一篇漏洞分析文章,搬到博客上

----------------

HutoolGithub上的一个开源项目,是一个java的工具包,对文件、流、加密解密、转码、正则、线程、XMLJDK方法进行封装,组成各种Util工具类,同时还提供一些其他的组件。目前在Github上已经有了2k+Star

Github地址:https://github.com/looly/hutool

 技术图片

 

 

本人通过代码卫士对4.1.12之前的版本做了自动化代码审计,发现在对zip文件进行操作的工具类ZipUtil.java中,由于没有对zip文件的条目做过滤导致zip条目覆盖漏洞(zip_slip)。当使用该工具类对恶意攻击者构造的zip文件进行解压时,可以覆盖项目中的任意文件。由于该问题在新版本中已修复,现公布详情如下:
将该项目放入代码卫士审计结果如下,发现在ZipUtil.java文件中存在路径遍历(zip_slip的原理还是利用到了路径遍历)的问题,且严重等级为高。点击进入可以看到缺陷出现的爆发点以及完整的路径等详细信息:

 技术图片

 

 

可以看到该方法分别传入三个参数:outFile表示解压到的目录、charset 表示编码格式、zipFile则表示需要解压的zip文件。在第389行处,程序并没有对zipEntry.getName做任何校验就直接用于创建文件,进而导致了zip_slip漏洞。

以下是我的漏洞复现流程:

如下图所示,假设core文件夹里面的password.txt是我们想要覆盖的文件,fileupload文件夹下是恶意zip文件所在地方(可能是通过上传功能或其他方式),而我们想要达到的效果是通过hutoolZipUtil提供的api对恶意zip文件进行解压时覆盖core中的password.txt文件。

首先需要构造一个恶意的zip文件,由于无法直接在windows中创建这样的非法文件,需要用代码创建,zip文件创建代码如下:

技术图片

 

可以看到22行处,将条目设置为“../core/”进行路径穿透。

使用 hutoolZipUtil提供的api对恶意zip文件进行解压,只需一行代码即可,指定想要解压的zip文件以及解压目录这两个参数即可,这也是hutool的方便之处。

 技术图片

 

可以看到成功覆盖了core文件夹下的password.txt文件

 技术图片

 

设置断点进行调试调试,进行解压的核心代码在unzip(File zipFile, File outFile, Charset charset)中,直接进入到该函数中:

 技术图片

 

 

可以看到在创建新的文件时文件名是直接使用的zipEntry.getName(),而此时的zipEntry.getName()为“../core/password.txt”,继续F8

 技术图片

 

 

此时的outItemFile已经通过路径穿透到达了core文件夹下。

Hutool已经在4.1.12的版本中修复了该漏洞,具体修复细节如下:

 技术图片

 

 

添加了一个checkSlip的安全检测方法,方法中检查父完整路径是否为自路径的前半部分,如果不是则说明不是子路径,可能存在slip注入。使用4.1.12版本的Hutool进行测试回报出异常!

 技术图片

 

 

 

 

912号:发现漏洞

913号:提交漏洞

913号:确认漏洞

921号:CVE-2018-17297

 

以上是关于开源项目hutool之zip_slip漏洞的主要内容,如果未能解决你的问题,请参考以下文章

MySQLJenkins是漏洞最多的两个开源项目

开源软件安全性研究:流行的开源项目中漏洞数量在2019年翻了一倍

安全研究:2019年流行的开源项目漏洞数量翻了一倍

Github开源项目单

欧盟即将在免费开源软件项目中推行“漏洞赏金”

社区公愤!Travis CI 漏洞致数千个开源项目机密泄露