1. 极安网首页
  2. 网络安全技术

CVE-2020-26945:Mybatis二级缓存反序列化的分析与复现

漏洞简介

MyBatis本是Apache的一个开源项目iBatis, 2010年这个项目由Apache Software Foundation 迁移到了Google Code,并且改名为MyBatis。MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

2020年10月6日,MyBatis官方发布了MyBatis 3.5.6版本,修复了一个远程代码执行漏洞,该漏洞编号为CVE-2020-26945

利用条件

用户启用了二级缓存功能
攻击者可以修改缓存的内容,替换为恶意反序列化数据
用户未设置JEP-290过滤,且没有任何防御反序列化攻击的措施

漏洞分析

二级缓存其实就是将查询的结果,放入缓存中,下次查询相同的条件时,直接从缓存中获取结果,降低sql服务器的压力。如上图所示,二级缓存可以缓存在redis等kv数据库,也可以我们自己实现相关缓存。

如果我们需要自定义缓存,只需要集成如下接口即可

  1. public interface Cache {
  2. String getId();
  3. int getSize();
  4. void putObject(Object key, Object value);
  5. Object getObject(Object key);
  6. boolean hasKey(Object key);
  7. Object removeObject(Object key);
  8. void clear();
  9. }

二级缓存默认是不开启的,需要手动开启二级缓存,实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化的。开启二级缓存的条件也是比较简单,通过直接在 MyBatis 配置文件中通过

  1. <settings>
  2.         <setting name = "cacheEnabled" value = "true" />
  3. </settings>

来开启二级缓存,还需要在 Mapper 的xml 配置文件中加入 标签

二级缓存中,被缓存的对象必须是继承自Serializable接口,缓存的过程其实就是将POJO反序列化后,存入缓存中。

本文转载:宽字节安全,不代表 极安网 立场,转载请注明出处:https://secvery.com/2565.html