如何用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")
    }
}

这个定义匹配了:

  1. 方法上有@Mapping类注解
  2. 参数上有@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分析发现三个可能存在漏洞的入口:

  1. CubeController.java
  2. DiagnosisController.java(包含两个不同的注解方法)

其中DiagnosisController.java对应已知的CVE-2020-13925和CVE-2020-1956。

安全防护检查

分析发现有一个额外的数据流通过了checkParameterWhiteList方法,该方法使用正则表达式进行过滤:

COMMAND_WHITE_LIST = "[^\\w%,@/:=?.\"\
$$
\
$$
]"

这个过滤机制目前被认为是安全的,尚未发现绕过方法。

分析结果验证

  1. 确认了已知的两个CVE漏洞的数据流路径
  2. 发现了一个额外的潜在路径,但由于白名单过滤而无法利用
  3. 验证了数据流分析的准确性

总结

使用CodeQL进行数据流分析可以:

  1. 快速定位已知漏洞的利用路径
  2. 发现潜在的未知漏洞入口
  3. 验证安全防护措施的有效性
  4. 提高漏洞分析的效率和准确性

扩展思考

Apache Kylin还有另一个由国人提交的新CVE,可以使用类似的方法进行分析。通过CodeQL分析1day漏洞时,结合CVE描述进行数据流分析,可以快速理解漏洞利用方式。

使用CodeQL数据流分析复现Apache Kylin命令执行漏洞 漏洞背景 Apache Kylin是一个开源的分布式分析引擎,提供Hadoop/Spark之上的SQL查询接口及多维分析(OLAP)能力。该漏洞涉及CVE-2020-13925和CVE-2020-1956,是由JD蓝军发现的命令执行漏洞。 漏洞分析要点 Sink点定义 Sink点是命令执行的最终触发点,在本漏洞中是 ProcessBuilder 的构造函数调用: CodeQL官方库 ExternalProcess.qll 中的 ArgumentToExec 类已经覆盖了这个sink点。 Source点定义 漏洞的输入源是带有特定注解的方法参数: 这个定义匹配了: 方法上有 @Mapping 类注解 参数上有 @PathVariable 注解 数据流追踪 由于漏洞涉及多个方法调用链,需要定义额外的污点传播步骤: 这个定义确保方法调用时的参数传递能够被正确追踪。 漏洞位置 通过CodeQL分析发现三个可能存在漏洞的入口: CubeController.java DiagnosisController.java (包含两个不同的注解方法) 其中 DiagnosisController.java 对应已知的CVE-2020-13925和CVE-2020-1956。 安全防护检查 分析发现有一个额外的数据流通过了 checkParameterWhiteList 方法,该方法使用正则表达式进行过滤: 这个过滤机制目前被认为是安全的,尚未发现绕过方法。 分析结果验证 确认了已知的两个CVE漏洞的数据流路径 发现了一个额外的潜在路径,但由于白名单过滤而无法利用 验证了数据流分析的准确性 总结 使用CodeQL进行数据流分析可以: 快速定位已知漏洞的利用路径 发现潜在的未知漏洞入口 验证安全防护措施的有效性 提高漏洞分析的效率和准确性 扩展思考 Apache Kylin还有另一个由国人提交的新CVE,可以使用类似的方法进行分析。通过CodeQL分析1day漏洞时,结合CVE描述进行数据流分析,可以快速理解漏洞利用方式。