开篇:

       日前,Spring的一个zip组件被爆了一个严重的漏洞,漏洞编号和标题为CVE-2018-1261 Unsafe Unzip with spring-integration-zip。根据描述在spring-integration-zip的1.0.1版本之前在对bzip2, tar, xz, war, cpio, 7z类型的压缩文件进行在解压的时候,如果压缩文件是恶意构造的不可信文件,可导致向任意目录写入文件。现在我们来复现和分析一下该漏洞的发生细节。


复现漏洞:

       为了复现漏洞,我们可以到Spring的GitHub下载存在漏洞版本的源码文件,地址:https://github.com/spring-projects/spring-integration-extensions/releases 下载1.0.1之前的版本,然后在本地解压。

        然后到spring-integration-zip目录下,使用命令:

./gradlew idea

        生成idea的项目文件,执行完成后,即可用IDEA打开spring-integration-zip.ipr文件如下:

image.png

        根据描述,提到了

This specifically applies to the unzip transformer.

        我们可以通过修改src/test/java/org.springframework.integration.zip/transformer文件下面的测试文件进行漏洞的复现和分析,

        这个目录下面有这些文件:

image.png

    

        这里自带了2个测试类,分别是测试压缩和解压相关的。从漏洞描述里,我们大概可以猜到是在解压的压缩包文件里有文件名为:../../../../hack.txt这样的文件,在解压释放时将文件名直接和文件路径进行拼接,然后创建文件,因 ../../ 跳跃到了其他目录,文件被释放到了预期意外的目录下面从而导致了漏洞发生。

        于是我们需要制作一个这样的“特殊”文件,这里可以通过ZipTransformerTests文件里的函数,加以修改来实现,修改测试代码如下:

        image.png

        

        我们通过unzip命令看看压缩包文件的结构如下图:

image.png

            

            做好了压缩包后,下面是参考给出的测试方法,修改的解压代码截图如下:

image.png

        

        现在我们可以使用Junit运行这个测试函数,观察tmp目录,会生成txt文件,

image.png

        

        我们来调试看看,下断点跟进处理doZipTransform的实现代码里,如下图:

image.png

        

        这里的payload是MessageBuilder类的withPayload函数的参数,是一个输入流,读取加载的是我们给的zip文件,                

image.png

    

    下面是实现的是使用ZipUtil类遍历输入流里每一个Entry利用回调函数ZipEntryCallback处理它,

重点看处理的逻辑:

image.png

    继续跟进:


image.png

        文件成功释放到指定目录,如下截图:

image.png

            

        到此漏洞已经被成功利用,产生漏洞的原因是对压缩文件里的文件名没有任何过滤,直接进行文件路径+文件名的拼接,创建了新文件。

        我们看看官方给的修复是怎样的,补丁地址,部分截图如下:

image.png        

        首先删掉了直接拼接的代码,加入了一个checkPath函数,该函数代码如下:

image.png

        我们更新一下这块修复代码然后再次进行测试如下图:

image.png

        这里已经测试失败了,因为checkPath函数对destinationFile进行了判断,即判断了要写入的文件绝对路径值(destinationFile.getCanonicalPath()函数)是否包含了指定的释放目录,在这个下面,

image.png

  这里很明显不满足,抛出异常程序终止了。

image.png

        

        想法很皮,实践测试中,发现似乎也不会出现想的那样,绕过了进行文件写入操作,报错如下:

        

image.png

        测试中发现更新了最新的补丁的现在(CVE-2018-1263补丁后),虽然不能任意目录跳了,但是可以在设置的workDirectory下面跳,最上层跳不出这个限制。

比如,制作压缩包:

image.png

解压代码:


image.png

解压后:

image.png


        这里举例说这个情况,是告诉大家配置不当会存在一定风险的,在配置workDirectory时尽量最小化配置,别配置成/var/ home/这一类的路径了,因为这些下面有一些地方被任意写入了文件是很可怕的。需要注意!!!


参考来源:

    1、https://www.cnblogs.com/yangxiaodi/p/9036916.html

    2、https://www.anquanke.com/post/id/144775

    3、https://pivotal.io/security/cve-2018-1261