近日发现Apache Spark官方发布了漏洞信息`SPARK-38631`:
当文件名称被恶意用户控制时,存在通过`Utils.unpack`实现任意shell命令注入的风险,影响版本为`3.1.2, 3.2.1, 3.3.0`。由于`Utils.unpack`是通过调用Hadoop的`unTar`函数来实现解压功能,所以本质上这是Hadoop产生的漏洞。
下载`spark-3.2.1-bin-hadoop2.7.tgz`,在Ubuntu 20.04中加入远程调试配置并启动`spark-shell`:
默认开启4040端口监听:
定位`org.apache.hadoop.fs#unTar`:
这里Windows和Linux处理方式不同。漏洞出在Linux系统的处理函数`unTarUsingTar`中:
将文件名直接进行拼接然后带入shell执行,存在命令注入的风险。
定位`Utils.unpack`:
为了方便触发漏洞,首先创建如下文件:
查看官方开发文档,找到函数`addArchive`存在解压操作:
执行`scala`命令,在`org.apache.spark.SparkContext#addArchive`触发断点:
一直跟到漏洞触发点:
实现RCE:
针对`*.tar`后缀名结尾的文件,将处理函数更新为`unTarUsingJava`。
从前面分析可知,漏洞本质上是`hadoop-common`产生的,可导致Spark shell出现命令注入,并且只能在Linux系统上触发。从修复补丁来看,只对`*.tar`后缀名单独进行了处理,但是`*.tar.gz`和`*.tgz`好像并没有更新,其实在Spark处理过程中,这两种后缀名文件会在命令字符串前面加上`gzip`命令的前缀,导致最终无法实现命令执行:
有兴趣的小伙伴按照上面思路分析调试一下就会明白,这里不过多赘述。
由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,且听安全团队及文章作者不为此承担任何责任。
点关注,不迷路!
关注公众号回复“漏洞”获取研究环境
原文始发于微信公众号(且听安全):【最新漏洞预警】SPARK-38631 Hadoop unTar函数引发的命令注入漏洞