漏洞概要
漏洞分析
2.1 MyBatis组件介绍
MyBatis 本是Apache的一个开源项目iBatis, 2010年这个项目由Apache Software Foundation 迁移到了Google Code,并且改名为MyBatis 。MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
2.2 漏洞描述
2020年10月6日,MyBatis官方发布了MyBatis 3.5.6版本,修复了一个远程代码执行漏洞,该漏洞编号为CVE-2020-26945。在满足以下三个条件的时候,攻击者可以触发远程代码执行:
1. 用户启用了内置的二级缓存
2. 用户未设置JEP-290过滤器
3.攻击者找到了一种修改私有Map字段条目的方法,即修改org.apache.ibatis.cache.impl.PerpetualCache.cache有效的缓存密钥
2.3 漏洞分析
官方发布修复此漏洞的方法是添加了反序列化检查,通过补丁比较发现漏洞点:
漏洞点出现在SerializedCache类的私有方法deserialize()中,全局搜索此类,发现该类公有的getObject()方法调用了该私有方法:
在该方法设置断点,跟进发现进入了ScheduledCache类的getObject()方法:
这里可以看到getObject()方法调用了clearWhenStale()方法,是对cache是否过期进行判断,并不是任意序列化数据均可以进行反序列化:
getObject()这里的限制主要有两处,一是需要在cache的过期时间内,二是覆盖的value要和key相对应,也就是前面漏洞描述提到的漏洞利用须满足的第三个条件。继续跟进发现序列化数据就是Cache.value,取出value值是通过<key-value>的对应关系,这是在MyBatis默认二级缓存类PerpetualCache实现的(用户可以自定义二级缓存,在mapper中启用即可,前提是实现规定的接口):
作为攻击者,需要将已有key对应的value覆盖为自己的恶意序列化数据,在cache过期时间内,如果再次执行相同的查询访问操作,恶意数据就会被作为已有key的对应value被反序列化,从而形成MyBatis所在服务器上的RCE。
2.4 漏洞复现
攻击者可以造成远程代码执行:
影响范围
解决方案
4.1修复建议
时间轴
2020/10/06
MyBatis 官方发布修复补丁
2020/10/12
深信服千里目安全实验室发布漏洞通告
2020/10/20
深信服千里目安全实验室发布漏洞二次通告
参考链接
点击阅读原文,及时关注并登录深信服智安全平台,可轻松查询漏洞相关解决方案。
本文始发于微信公众号(深信服千里目安全实验室):MyBatis 远程代码执行漏洞CVE-2020-26945漏洞分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论