MyBatis远程代码执行漏洞CVE-2020-26945
字数 1482 2025-08-15 21:32:20
MyBatis远程代码执行漏洞(CVE-2020-26945)技术分析与防护指南
一、漏洞概述
漏洞名称:MyBatis远程代码执行漏洞
CVE编号:CVE-2020-26945
威胁等级:高危
漏洞类型:远程代码执行(RCE)
影响范围:MyBatis < 3.5.6的所有版本
利用难度:困难
披露时间:2020年10月6日
二、MyBatis组件介绍
MyBatis是一款优秀的持久层框架,前身为Apache iBatis,2010年迁移至Google Code并更名为MyBatis。主要特点包括:
- 支持定制化SQL、存储过程及高级映射
- 避免了几乎所有的JDBC代码和手动设置参数
- 使用简单XML或注解配置和映射原生信息
- 将接口和Java POJOs映射成数据库记录
三、漏洞详细分析
3.1 漏洞描述
该漏洞存在于MyBatis的二级缓存机制中,当满足特定条件时,攻击者可构造恶意序列化数据实现远程代码执行。
3.2 漏洞触发条件
必须同时满足以下三个条件:
- 用户启用了内置的二级缓存功能
- 用户未设置JEP-290反序列化过滤器
- 攻击者能够修改
org.apache.ibatis.cache.impl.PerpetualCache.cache中的私有Map字段条目(即修改有效的缓存键值对)
3.3 漏洞原理
漏洞核心位于SerializedCache类的deserialize()私有方法中,调用链如下:
SerializedCache.getObject()调用deserialize()方法ScheduledCache.getObject()调用clearWhenStale()方法进行缓存过期判断- 反序列化数据来自
Cache.value,通过PerpetualCache实现的键值对关系获取
攻击者需要:
- 覆盖已有key对应的value为恶意序列化数据
- 在缓存过期时间内再次执行相同查询
- 恶意数据作为value被反序列化,导致RCE
3.4 漏洞修复补丁分析
官方修复方法:
- 添加了反序列化检查机制
- 在
SerializedCache类中增强了安全验证
四、影响范围
受影响版本:
- MyBatis 3.5.5及以下所有版本
安全版本:
- MyBatis 3.5.6及以上版本
五、解决方案
5.1 修复建议
立即升级:
- 升级至MyBatis 3.5.6或更高版本
- 补丁获取地址:https://github.com/mybatis/mybatis-3
临时缓解措施(如无法立即升级):
-
禁用二级缓存功能
<settings> <setting name="cacheEnabled" value="false"/> </settings> -
配置JEP-290反序列化过滤器
// 在应用启动时添加 System.setProperty("jdk.serialFilter", "!*"); -
自定义缓存实现时,避免使用不安全的反序列化操作
5.2 验证方法
-
检查项目依赖的MyBatis版本
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> <!-- 确保版本号 >= 3.5.6 --> </dependency> -
检查是否启用了二级缓存
<!-- 在mapper.xml中检查是否有以下配置 --> <cache/>
六、时间线
- 2020/10/06:MyBatis官方发布修复补丁
- 2020/10/12:深信服千里目安全实验室发布漏洞通告
- 2020/10/20:深信服千里目安全实验室发布漏洞二次通告
七、参考链接
八、最佳实践建议
- 定期更新:保持MyBatis框架及所有依赖库为最新版本
- 最小权限原则:MyBatis运行账户应具有最小必要权限
- 安全配置:
- 生产环境禁用调试模式
- 使用安全的序列化/反序列化机制
- 代码审计:定期审计自定义缓存实现的安全性
- 防御纵深:部署WAF等防护设备,监控异常请求
通过以上措施,可有效防范此类漏洞带来的安全风险。