kylin CVE-2022-24697 & CVE-2022-43396
字数 1391 2025-08-25 22:58:40
Apache Kylin 命令注入漏洞分析 (CVE-2022-24697 & CVE-2022-43396)
漏洞概述
这两个漏洞均存在于Apache Kylin的cube build功能中:
- CVE-2022-24697: 参数可控导致的命令注入
- CVE-2022-43396: 命令可控导致的命令注入(是CVE-2022-24697的绕过)
影响版本
- Kylin 2.x
- Kylin 3.x
- Kylin 4.x (应升级至4.0.2修复CVE-2022-24697,升级至4.0.3修复CVE-2022-43396)
环境搭建
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
调试配置
修改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
CVE-2022-24697 漏洞分析
攻击步骤
- 登录Kylin (默认账号:admin/密码:KYLIN)
- 选择"learn_kylin"项目
- 查看cube列表,选择Action -> Edit编辑cube
- 在Configuration Overwrites中添加:
kylin.engine.spark-conf.spark.driver.memory 512M' `touch /tmp/hacked` ' - 点击Next并Save
- 点击Build,选择日期后Submit
- 验证:容器内
/tmp/hacked文件被创建
漏洞原理
- 通过
getPropertiesByPrefix("kylin.engine.spark-conf.")获取配置 - 配置项
spark.driver.memory的值未经过滤直接拼接进命令 - 最终在
CliCommandExecutor.execute()执行恶意命令
关键代码路径
org.apache.kylin.engine.spark.job.NSparkExecutable#doWork
-> runSparkSubmit
-> getSparkConfigOverride
-> config.getSparkConfigOverride()
-> getPropertiesByPrefix("kylin.engine.spark-conf.")
修复方案
补丁PR #1811:
- 添加
ParameterFilter.checkSparkConf方法检查所有配置属性键值对
CVE-2022-43396 漏洞分析
攻击步骤
- 登录Kylin (默认账号:admin/密码:KYLIN)
- 选择"learn_kylin"项目
- 查看cube列表,选择Action -> Edit编辑cube
- 在Configuration Overwrites中添加:
kylin.engine.spark-cmd touch /tmp/hacked123; echo - 点击Next并Save
- 点击Build,选择日期后Submit
- 验证:容器内
/tmp/hacked123文件被创建
漏洞原理
- 通过
getOptional("kylin.engine.spark-cmd", null)获取命令 - 获取的spark-cmd参数未经过滤直接执行
- 在
NSparkExecutable.generateSparkCmd中拼接命令
关键代码路径
org.apache.kylin.engine.spark.job.NSparkExecutable#doWork
-> runSparkSubmit
-> generateSparkCmd
-> getSparkSubmitCmd
-> getOptional("kylin.engine.spark-cmd", null)
修复方案
补丁PR #2011:
- 直接指定sparkSubmitCmd参数为默认值,不允许用户配置
调试方法
- 下载源码:https://github.com/apache/kylin/archive/refs/tags/kylin-4.0.0.zip
- 关键断点:
org.apache.kylin.engine.spark.job.NSparkExecutable#doWork - 调用栈分析:
execute:90, CliCommandExecutor runSparkSubmit:282, NSparkExecutable doWork:168, NSparkExecutable execute:206, AbstractExecutable doWork:94, DefaultChainedExecutable execute:206, AbstractExecutable run:113, DefaultScheduler$JobRunner runWorker:1149, ThreadPoolExecutor run:624, ThreadPoolExecutor$Worker run:748, Thread
总结
这两个漏洞展示了Apache Kylin在配置处理上的安全问题:
- CVE-2022-24697通过spark配置参数注入命令
- CVE-2022-43396通过直接控制spark-cmd执行命令
- 修复方案均是通过限制用户可控的配置项来解决问题
建议所有Kylin用户尽快升级到安全版本,避免潜在的命令注入风险。