CVE-2021-45456 Apache Kylin 命令注入

警告
本文最后更新于 2022-01-13,文中内容可能已过时。

# 环境搭建

ubuntu docker 8g

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
docker pull apachekylin/apache-kylin-standalone:4.0.0

docker run -d \
-m 8G \
-p 7070:7070 \
-p 8088:8088 \
-p 50070:50070 \
-p 8032:8032 \
-p 8042:8042 \
-p 2181:2181 \
-p 5005:5005 \
apachekylin/apache-kylin-standalone:4.0.0

5005是远程调试端口

Kylin 页面:http://127.0.0.1:7070/kylin/login admin KYLIN HDFS NameNode 页面:http://127.0.0.1:50070 YARN ResourceManager 页面:http://127.0.0.1:8088

具体看官方的docker安装文档 https://kylin.apache.org/cn/docs/install/kylin_docker.html

远程调试配置,修改 /home/admin/apache-kylin-4.0.0-bin-spark2/bin/kylin.sh

在retrieveStartCommand函数修改

1
$JAVA ${KYLIN_EXTRA_START_OPTS} ${KYLIN_TOMCAT_OPTS} -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 -classpath ${KYLIN_TOMCAT_CLASSPATH}  org.apache.catalina.startup.Bootstrap start >> ${KYLIN_HOME}/logs/kylin.out 2>&1 & echo $! > ${KYLIN_HOME}/pid &

# 分析

org.apache.kylin.rest.controller.DiagnosisController#dumpProjectDiagnosisInfo

image.png

跟进dumpProjectDiagnosisInfo

image.png

这里getProject()通过ValidateUtil.convertStringToBeAlphanumericUnderscore(project)处理,但是runDiagnosisCLI(args)中接受的cmd参数仍然是通过project传过来的,相当于命令行可控。

而且getProject(ValidateUtil.convertStringToBeAlphanumericUnderscore(project))将传入的命令进行如下处理。将除数字字母下划线以外的东西替换为空。比如传入命令为 touch 123,将被替换为touch123

1
2
3
    public static String convertStringToBeAlphanumericUnderscore(String toBeConverted) {
        return toBeConverted.replaceAll("[^a-zA-Z0-9_]", "");
    }

刚好解决projectInstance==null抛出异常的问题。

1
2
3
4
        if (null == projectInstance) {
            throw new BadRequestException(
                    String.format(Locale.ROOT, msg.getDIAG_PROJECT_NOT_FOUND(), project));
        }

最后执行的命令如下

image.png

再来看创建项目的地方

org.apache.kylin.rest.controller.ProjectController#saveProject

image.png

项目名进行ValidateUtil.isAlphanumericUnderscore()校验,不能有数字字母下划线以外的东西。

image.png

完整的利用方式如下,以执行命令touch 123为例

先创建项目,项目名为touch123

image.png

接下来触发命令执行

image.png

执行成功

image.png

# 修复方式

git的diff

image.png

传入cmd的参数改为projectName而非http传入的project,projectName经过了convertStringToBeAlphanumericUnderscore() 处理,所以无法输入非字母数字下划线的字符来触发命令执行。

# 总结

巧妙利用两个函数对于参数处理的特性来进行命令执行,值得一学。

# 参考

  1. https://securitylab.github.com/advisories/GHSL-2021-1048_GHSL-2021-1051_Apache_Kylin/

文笔垃圾,措辞轻浮,内容浅显,操作生疏。不足之处欢迎大师傅们指点和纠正,感激不尽。