|
|
|
联系客服020-83701501

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

联系在线客服,可以获得免费在线咨询服务。 QQ咨询 我要预约
反序列化裂痕的末日?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将Internet通信的全数停止了笼统,这全数逻辑对于用户来说是通明的,其实是经过动静代办署理机制来实现的,经过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舆论,针对远程对象的检查条件下列: Default
123456 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的程序面对兼容性标题问题。 作者:隐形人真忙

数安新闻+更多

证书相关+更多