Apache Kylin 命令注入漏洞 CVE-2020-13925
漏洞描述
6月,京东安全的蓝军团队发现了一个 apache kylin 远程命令执行严重漏洞( CVE-2020-13925)。黑客可以利用这个漏洞,登录任何管理员账号和密码默认未修改的账号,获得管理员权限。由于Apache Kylin被广泛应用于企业的大数据分析平台,因此该漏洞将对企业核心数据具有较大的危害,存在数据泄露风险,建议用户尽快升级软件至安全版本。
影响版本
Apache Kylin 2.3.0 ~ 2.3.2
Apache Kylin 2.4.0 ~ 2.4.1
Apache Kylin 2.5.0 ~ 2.5.2
Apache Kylin 2.6.0 ~ 2.6.5
Apache Kylin 3.0.0-alpha, Apache Kylin 3.0.0-alpha2, Apache Kylin 3.0.0-beta, Apache Kylin 3.0.0, Kylin 3.0.1,Kylin 3.0.2
环境搭建
这里使用 docker 来搭建需要的环境
docker pull apachekylin/apache-kylin-standalone:3.0.1
如果服务器内存较小,可不选择 -m 8G 参数
docker run -d \
-m 8G \
-p 7070:7070 \
-p 8088:8088 \
-p 50070:50070 \
-p 8032:8032 \
-p 8042:8042 \
-p 16010:16010 \
apachekylin/apache-kylin-standalone:3.0.1打开后使用默认账号密码admin/KYLIN登录,出现初始界面即为成功
漏洞复现
出现漏洞的代码文件在server-base/src/main/java/org/apache/kylin/rest/controller/DiagnosisController.java

这里可以看到 {project}参数是用户可控的变量,向下跟进dumpProjectDiagnosisInfo函数

首先通过checkProjectOperationPermission函数来检查该project是否许可,然后构建一个args的字符串数组,看一下checkProjectOperationPermission函数
这里传入projectName,然后通过getProjectInstance来获取项目实例,跟进getProjectInstance
因为 projectName 会被我们替换掉,所以不会获得一个正确的projectName,则会返回一个Null,查看下hasProjectOperationPermission函数
这里并没有对projectName进行检验,只对用户身份进行了检验,当为ADMIN、ADMINISTRATION、MANAGEMENT、OPERATION等权限,该值默认返回为true,回到 dumpProjectDiagnosisInfo函数,向下继续跟进runDiagnosisCLI函数
注意看这几行代码
与 Apache Kylin 命令注入漏洞 CVE-2020-1956 类似,同样也是经过execute函数,而digCmd同样也是经过了命令拼接
这样我们就可以通过控制 {project} 请求就可以造成命令注入
拼接后则出现
这里通过报错语句可以回显命令验证漏洞存在

在修复中,过滤了||,&&等符号,造成无法命令注入

漏洞通报中共两个利用点
查看函数发现利用方式相同,直接利用job会失败,因为 {project}默认有一个learn_kylin,而job没有

漏洞利用POC
Last updated
Was this helpful?