反序列化漏洞的末日?JEP290机制研究

2024-06-16 03:32

本文主要是介绍反序列化漏洞的末日?JEP290机制研究,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

0x00 前言
先说一下JEP290这个增强建议本身其实在2016年就提出来了,本身是针对JAVA 9的一个新特性,但是随后官方突然决定向下引进该增强机制,分别对JDK 6,7,8进行了支持:
https://blogs.oracle.com/java-platform-group/filter-incoming-serialization-data-a-little-of-jdk-9-goodness-available-now-in-current-release-families
当时pwntester大神还专门发了个推标庆祝了一下:

所以官方从8u121,7u13,6u141分别支持了这个JEP。
我为什么现在才来说这个case,因为最近测一个RMI的漏洞过程中,发现居然默认情况下把反序列化给拦截掉了,看了异常信息,发现是JDK本身造成的。后来才知道,原来这个java 9 的特性早就移植到6,7,8了。因此打算着重讨论下这个新的机制对RMI序列化的影响。

0x01 JEP290介绍
JEP290主要描述了这么几个机制:
(1)提供一个限制反序列化类的机制,白名单或者黑名单
(2)限制反序列化的深度和复杂度
(3)为RMI远程调用对象提供了一个验证类的机制
(4)定义一个可配置的过滤机制,比如可以通过配置properties文件的形式来定义过滤器
实际上就是为了给用户提供一个更加简单有效并且可配置的过滤机制,以及对RMI导出对象执行检查。
其核心实际上就是提供了一个名为ObjectInputFilter的接口,用户在进行反序列化操作的时候,将filter设置给ObjectInputStream对象。这里就是用的setInternalObjectInputFilter方法:

每当进行一次反序列化操作时,底层就会根据filter中的内容来进行判断,从而防止恶意的类进行反序列化操作。此外,还可以限制反序列化数据的信息,比如数组的长度、字节流长度、字节流深度以及使用引用的个数等。filter返回accept,reject或者undecided几个状态,然后用户根据状态进行决策。
而对于RMI来说,主要是导出远程对象前,先要执行过滤器逻辑,然后才进行接下来的动作,即对反序列化过程执行检查。
此外,还提供了两种可配置过滤器的方式:
(1)通过设置jdk.serialFilter这个System.property
(2)直接通过conf/security/java.properties文件进行配置

具体规则方面的内容可以直接参考原始链接:
http://openjdk.java.net/jeps/290


0x02 RMI的过滤机制
RMI这个就不多介绍了,给出一张原理图:

RMI将网络通信的部分进行了抽象,这部分逻辑对于用户来说是透明的,其实是通过动态代理机制来实现的,通过Stub和Skel这两个代理对象,完成了对远程对象的调用。
扯远了,我们还是看看RMI中新加入的过滤机制。
首先先要复现该问题,自己写一个RMI Server,然后启动起来。之后,写一个RMI Client,调用bind方法将恶意的类发送给Server。结果直接抛出异常:

同时Server的控制台打印出来错误日志:

可以看到,是在处理远程对象代理的时候,没有通过filter的校验从而报错。
我使用的是8u131进行调试,直接来到RegistryImpl_Skel类中的46行代码,这里就是导出远程对象:

readObject正是在执行反序列化操作,单步跟进,就来到了ObjectInputStream的readObject方法中,调用的是readObject0方法:

接下来是readOrdinaryObject-> radClassDesc->readProxyDesc,然后获取里面的接口并调用filterCheck方法一个个检查,最后再对对象本身进行一次检查:

来到filterCheck方法中:

可以看到这里调用了ObjectInputStream中的serialFilter属性的checkInput方法,最后真正检查的是RegistryImpl.registryFilter方法,针对远程对象的检查条件如下:
return String.class != var2 && 
!Number.class.isAssignableFrom(var2) && 
!Remote.class.isAssignableFrom(var2) && 
!Proxy.class.isAssignableFrom(var2) && 
!UnicastRef.class.isAssignableFrom(var2) && !RMIClientSocketFactory.class.isAssignableFrom(var2) && !RMIServerSocketFactory.class.isAssignableFrom(var2) && !ActivationID.class.isAssignableFrom(var2) && 
!UID.class.isAssignableFrom(var2) ? Status.REJECTED : Status.ALLOWED;
可以看到直接把AnnotationInvocationHandler给禁用掉了,所以这个方法肯定是要返回REJECTED状态了,因此直接就抛了异常出来。

0x03 思考
ObjectInputFilter的引入是给了用户一个非常方便并且很官方的反序列化过滤机制,因此用好它可以很方便的写出过滤代码,思考一下反序列化刚出现的那会儿,还得自己去编码实现过滤机制,稍有不慎就会出问题。但是有了Filter机制,并不代表一定不会出问题,原因是开发者使用黑名单机制还是有可能漏掉一些lib或者有新的gadgets出现。所以以后反序列化漏洞还是可以玩一段时间,毕竟底层开发者技术跟进需要时间。
最后说一句,RMI这种粗暴的过滤我实在保留意见,因为可能会让很多基于RMI的程序面临兼容性问题。

这篇关于反序列化漏洞的末日?JEP290机制研究的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1065367

相关文章

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

一文详解Java Condition的await和signal等待通知机制

《一文详解JavaCondition的await和signal等待通知机制》这篇文章主要为大家详细介绍了JavaCondition的await和signal等待通知机制的相关知识,文中的示例代码讲... 目录1. Condition的核心方法2. 使用场景与优势3. 使用流程与规范基本模板生产者-消费者示例

SQL注入漏洞扫描之sqlmap详解

《SQL注入漏洞扫描之sqlmap详解》SQLMap是一款自动执行SQL注入的审计工具,支持多种SQL注入技术,包括布尔型盲注、时间型盲注、报错型注入、联合查询注入和堆叠查询注入... 目录what支持类型how---less-1为例1.检测网站是否存在sql注入漏洞的注入点2.列举可用数据库3.列举数据库

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

MySQL中的锁和MVCC机制解读

《MySQL中的锁和MVCC机制解读》MySQL事务、锁和MVCC机制是确保数据库操作原子性、一致性和隔离性的关键,事务必须遵循ACID原则,锁的类型包括表级锁、行级锁和意向锁,MVCC通过非锁定读和... 目录mysql的锁和MVCC机制事务的概念与ACID特性锁的类型及其工作机制锁的粒度与性能影响多版本