Apache Kylin 命令注入漏洞调试分析(CVE-2020-1956)

1、前言

 

Apache Kylin是一个开源的、分布式的分析型数据仓库,提供Hadoop/Spark 之上的 SQL 查询接口及多维分析(OLAP)能力以支持超大规模数据。近日,百度云安全团队监测到Apache官方发出了一个漏洞通告,披露了Apache kylin多版本存在命令注入漏洞,漏洞编号为CVE-2020-1956。由于Apache Kylin依赖的组件较多,自行搭建环境较为困难,我们采用了IDEA+docker进行远程调试来分析漏洞。

 

2、远程调试环境搭建

 

本次复现使用了受影响的Kylin 3.0.1版本,直接镜像拉取并启动,对外暴露17070、19001端口。

 

docker pull apachekylin/apache-kylin-standalone:3.0.1

docker run -d -p 17070:7070 19001:19001 apachekylin/apache-kylin-standalone:3.0.1

 

远程调试需要保证运行环境代码和本地代码相同,这里我们可以去Kylin的releases页面下载3.0.1版本,解压后导入IDEA。此时docker启动的Kylin并没有开启远程调试,先进入容器bash,修改/home/admin/apache-kylin-3.0.1-bin-hbase1x/bin/kylin.sh,在启动命令添加一行。

 

 

此时Kylin是启动状态,先执行./kylin.sh stop以停止服务,再执行启动脚本/home/admin/entrypoint.sh,可连接到服务器的19001端口进行远程调试。编辑Configurations,选择Remote并填写对应的主机和端口。

 

 

当Console端出现如下提示,表明远程连接成功。

 

 

3、漏洞分析

 

漏洞入口在server-base/src/main/java/org/apache/kylin/rest/controller/CubeController.java的migrateCube方法,我们构造好对应的POST包,对该方法打断点。此时传递的project为learn_kylin,随后进入migrateCute方法。

 

 

跟进到CubeService.java的migrateCute方法,1086行会获取kylin的配置,1087行调用config对象的isAllowAutoMigrateCube进行判断,若返回False则程序会抛出异常。

 

 

我们跟进到KylinConfigBase.java的isAllowAutoMigrateCube方法,该方法主要是判断属性kylin.tool.auto-migrate-cube.enabled的值是否为true,若要继续执行则需要设置该属性为true。

 

 

接着在1098、1099行会从config对象中获取srcCfgUri、dstCfgUri,对象的属性分别为

kylin.tool.auto-migrate-cube.src-config、kylin.tool.auto-migrate-cube.dest-config,并且1101、1102行还会判断取出的两个属性的值是否为空。

 

 

接着1108行会将projectName、srcCfgUri、dstCfgUri等参数直接拼接到cmd中,并在1111行执行,在整个过程中没有对projectName进行任何的校验,导致命令注入漏洞。并且,若能够控制上述3个属性值,那么srcCfgUri以及dstCfgUri也是能够导致命令注入漏洞的。

 

 

我们看下官方的补丁https://github.com/apache/kylin/commit/9cc3793ab2f2f 0053c467a9 b3f38cb7791cd436a。对projectName、dstCfgUri、srcCfgUri都调用了checkParameter方法进行处理。

 

 

而checkParameter方法主要是将可疑的命令执行字符替换为空,包括空格、管道符、&等。

 

 

4、漏洞复现

 

根据网上文档可知,Cube级属性值是可以添加或者修改的,并且可以覆盖kylin的属性。那么我们首先在某个Cube中添加上述属性。

 

这里我们先尝试ProjectName参数的命令注入,发现可以成功执行touch命令。

 

 

由于命令注入点在路径中,注入命令中包含”/”会导致路由出错,而反弹shell、写webshell等都需要用”/”,因此有一些文章将此处认定为受限的命令注入。但是这里我们可以用其他字符来替代斜杠,联系上篇文章提到的shell参数扩展,斜杠可以用${PATH:0:1}表示。

 

 

同样的,由于可以直接修改配置文件,也可以利用srcCfgUri或者dstCfgUri注入,此时就不受路径处的一些限制了。

 

 

5、安全产品解决方案

 

百度安全智能一体化产品已支持CVE-2020-1956漏洞的检测和拦截,有需要的用户可以访问anquan.baidu.com联系我们。

 

受影响的用户请点击阅读原文下载官方发布的最新版进行漏洞的修复 

http://kylin.apache.org/cn/download/

参考链接:

https://www.t00ls.net/thread-56549-1-1.html

https://github.com/apache/kylin/commit/9cc3793ab2f2f0053c467a9b3f38cb7791cd436a

 

推荐阅读

从CVE-2020-8816聊聊shell参数扩展

Shiro rememberMe反序列化攻击检测思路

Spring Boot + H2 JNDI注入漏洞复现分析