kylin源码调试_Apache Kylin 命令注入漏洞调试分析(CVE-2020-1956)

原标题: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联系我们。

参考链接:

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

https://github.com/apache/kylin/commit/9cc3793ab2f2f0053c467a9b3f38cb7791cd436a返回搜狐,查看更多

责任编辑:

你可能感兴趣的:(kylin源码调试)