如何用CodeQL数据流复现 apache kylin命令执行漏洞
字数 900 2025-08-20 18:17:47
使用CodeQL数据流分析复现Apache Kylin命令执行漏洞
漏洞背景
Apache Kylin是一个开源的分布式分析引擎,提供Hadoop/Spark之上的SQL查询接口及多维分析(OLAP)能力。该漏洞涉及CVE-2020-13925和CVE-2020-1956,是由JD蓝军发现的命令执行漏洞。
漏洞分析要点
Sink点定义
Sink点是命令执行的最终触发点,在本漏洞中是ProcessBuilder的构造函数调用:
override predicate isSink(DataFlow::Node sink) {
sink.asExpr() instanceof ArgumentToExec
}
CodeQL官方库ExternalProcess.qll中的ArgumentToExec类已经覆盖了这个sink点。
Source点定义
漏洞的输入源是带有特定注解的方法参数:
class DumpProjectDiagnosisInfoMethod extends Method {
DumpProjectDiagnosisInfoMethod() {
this.getSourceDeclaration().getAnAnnotation().toString().matches("%Mapping%") and
this.getAParameter().getAnAnnotation().toString().matches("PathVariable")
}
}
这个定义匹配了:
- 方法上有
@Mapping类注解 - 参数上有
@PathVariable注解
数据流追踪
由于漏洞涉及多个方法调用链,需要定义额外的污点传播步骤:
class CallTaintStep extends TaintTracking::AdditionalTaintStep {
override predicate step(DataFlow::Node n1, DataFlow::Node n2) {
exists(Call call |
n1.asExpr() = call.getAnArgument() and
n2.asExpr() = call
)
}
}
这个定义确保方法调用时的参数传递能够被正确追踪。
漏洞位置
通过CodeQL分析发现三个可能存在漏洞的入口:
CubeController.javaDiagnosisController.java(包含两个不同的注解方法)
其中DiagnosisController.java对应已知的CVE-2020-13925和CVE-2020-1956。
安全防护检查
分析发现有一个额外的数据流通过了checkParameterWhiteList方法,该方法使用正则表达式进行过滤:
COMMAND_WHITE_LIST = "[^\\w%,@/:=?.\"\
$$
\
$$
]"
这个过滤机制目前被认为是安全的,尚未发现绕过方法。
分析结果验证
- 确认了已知的两个CVE漏洞的数据流路径
- 发现了一个额外的潜在路径,但由于白名单过滤而无法利用
- 验证了数据流分析的准确性
总结
使用CodeQL进行数据流分析可以:
- 快速定位已知漏洞的利用路径
- 发现潜在的未知漏洞入口
- 验证安全防护措施的有效性
- 提高漏洞分析的效率和准确性
扩展思考
Apache Kylin还有另一个由国人提交的新CVE,可以使用类似的方法进行分析。通过CodeQL分析1day漏洞时,结合CVE描述进行数据流分析,可以快速理解漏洞利用方式。