近日,ZDI公布了一个Coherence反序列化漏洞,CVE编号为CVE-2020-2555,此漏洞是由于攻击者可以传入可控参数并调用java方法,在Java中,类中的readObject()或readExternal()方法可以被自动调用。
通过补丁对比寻找漏洞利用点,攻击者可以使用受控参数来调用java方法。在Java中,会自动调用类的readObject()或者 readExternal()方法。这两种方法以及从它们内部可获得的任何其他方法都可以视为反序列化gadget的有效来源。
CVE-2020-2555的补丁中更改了LimitFilter类中的toString()方法:
extract()已从toString()中删除了对该方法的所有调用,toString()可以通过readObject()各种标准JRE类的方法来实现,例如
BadAttributeValueExpException:
如上面的代码所示,BadAttributeValueExpException该类的序列化实例可用于调用toString()任意类的方法。可以使用此技术访问受此补丁影响的LimitFilter类的toString()方法。
然后寻找Sink点,Sink点指的是具有各种副作用的Java方法调用,这类副作用包括:
· 通过调用FileOutputStream.write()任意创建文件。
· 通过调用Runtime.exec()任意执行命令。
· 通过调用Method.invoke()的任意方法调用。
对于此漏洞,我们的重点就是调用,Method.invoke()该调用具有通过反射调用任意Java方法的副作用。有了这些信息,我们可以查找所有实例,在这些实例中,extract()方法调用(我们在补丁分析中将其标识为入口点)导致对Method.invoke()的调用。
查看ReflectionExtractor类后,我们可以确认前面的猜测:
ReflectionExtractor 通过允许调用任意方法来提供危险原语,其中方法和参数都可以由攻击者控制。
通常,需要多个方法调用才能实现远程代码执行。例如,在流行的Apache Commons Collections gadget中,是通过使用链接任意方法调用来实现的ChainedTransformer。以类似的方式,Coherence库中有一个类允许我们链接extract()调用,该类为ChainedExtractor:
将所有这些放在一起使用以下利用链来实现远程代码执行:
因此,使用Coherence可以在恶意序列化对象库的任何项目都可以实现远程代码执行,针对WebLogic T3协议的漏洞验证:
· Oracle Coherence 3.7.1.17
· Oracle Coherence 12.1.3.0.0
· Oracle Coherence 12.2.1.3.0
· Oracle Coherence 12.2.1.4.0
参考Oracle官网发布的补丁进行升级:
https://www.oracle.com/security-alerts/cpujan2020.html