首页 网络安全 正文
  • 本文约2059字,阅读需10分钟
  • 14
  • 0

H2O-3 JDBC反序列化漏洞CVE-2025-6544

H2O-3 是一个内存中、分布式、可扩展的机器学习和预测分析平台,提供了广泛的算法,包括分类、回归、聚类、异常检测和深度学习等。

一、基本情况

H2O-3 能够在大数据环境下高效运行,平台支持多种编程接口,如 Python、R、Scala 和 Java,同时与 Spark、Hadoop 等生态系统兼容。

H2O-3 JDBC反序列化漏洞CVE-2025-6544

H2O-3是H2O.ai开发的开源分布式机器学习平台,支持大规模数据处理与建模,具有自动调整超参数、直观 Web 界面(Flow UI)等特点。

栋科技漏洞库关注到H2O-3受影响版本中存在一个反序列化漏洞,该漏洞现在已经被追踪为CVE-2025-6544,漏洞的CVSS 3.X评分为9.8。

二、漏洞分析

CVE-2025-6544漏洞是存在于H2O-3版本低于3.46.0.8中的一个严重的安全漏洞,攻击者可利用该漏洞读取任意系统文件并执行任意代码。

该漏洞源于JDBC连接参数处理不当,可以通过绕过正则表达式检查并使用双重URL编码进行利用,且该漏洞影响所有受影响版本的用户。

攻击者可构造特殊的JDBC connection_url绕过参数匹配与补丁校验注入可控JDBC参数,与伪造的MySQL服务交互实现任意系统文件读取。

因此,攻击者利用该漏洞读取任意系统文件,甚至通过反序列化执行任意代码,进一步结合可触发的反序列化链,则可导致远程代码执行。

相关漏洞代码包括但不限于此:

H2O-3 JDBC反序列化漏洞CVE-2025-6544

c final Pattern JDBC_PARAMETERS_REGEX_PATTERN = Pattern.compile("(?i)[?;&]([a-z]+)=");
  + private static final Pattern JDBC_PARAMETERS_REGEX_PATTERN = Pattern.compile("(?i)([a-z0-9_]+)\\s*=\\s*");

刚才,通过在参数前添加空格绕过了常规匹配。新补丁在此处添加了\\s*,它可以匹配任何空格字符,从而修复了漏洞。

但根据mysql驱动程序的特点

在com.mysql.cj.conf.ConnectionUrlParser#processKeyValuePattern中

private Map<String, String> processKeyValuePattern(Pattern pattern, String input) {
    Matcher matcher = pattern.matcher(input);
    int p = 0;

    HashMap kvMap;
    for(kvMap = new HashMap(); matcher.find(); p = matcher.end()) {
        if (matcher.start() != p) {
            throw (WrongArgumentException)ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("ConnectionString.4", new Object[]{input.substring(p)}));
        }

        String key = decode(StringUtils.safeTrim(matcher.group("key")));
        String value = decode(StringUtils.safeTrim(matcher.group("value")));
        if (!StringUtils.isNullOrEmpty(key)) {
            kvMap.put(key, value);
        } else if (!StringUtils.isNullOrEmpty(value)) {
            throw (WrongArgumentException)ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("ConnectionString.4", new Object[]{input.substring(p)}));
        }
    }

    if (p != input.length()) {
        throw (WrongArgumentException)ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("ConnectionString.4", new Object[]{input.substring(p)}));
    } else {
        return kvMap;
    }
}

在这里获取JDBC密钥和值后,将执行urldecode,因此我们只需要对密钥进行双URL编码即可绕过它。

三、POC概念验证

1、使用如下概念验证代码

管理员已设置登录后刷新可查看

管理员已设置登录后刷新可查看

2、使用伪造的MysqlServer成功读取文件

 

H2O-3 JDBC反序列化漏洞CVE-2025-6544

3、使用以下PoC来利用反序列化

管理员已设置登录后刷新可查看

四、影响范围

h2oai/h2o-3 <= 3.46.0.8

五、修复建议

H2O-3 >= 3.46.0.8

六、参考链接

管理员已设置登录后刷新可查看



扫描二维码,在手机上阅读
评论
更换验证码
友情链接