CVE-2021-2394:Oralce7月补丁日二次序列化漏洞分析
2021-07-23 11:22

报告编号:B6-2021-072301

报告来源:360CERT

报告作者:360CERT

更新日期:2021-07-23

0x01   漏洞简述

2021年07月21日,360CERT监测发现Oracle官方发布了2021年7月份的安全更新,本次分析报告选取的是其中一个反序列化漏洞,CVE编号为CVE-2021-2194,漏洞等级:严重,漏洞评分:9.8

0x02   风险等级

评定方式等级
威胁等级严重
影响面广泛
攻击者价值
利用难度
360CERT评分9.8

0x03   漏洞详情

diff补丁后发现WebLogicFilterConfig的新增了两个黑名单package

"oracle.eclipselink.coherence.integrated.internal.querying", "oracle.eclipselink.coherence.integrated.internal.cache"

这次的漏洞依然是一个二次序列化漏洞,前半部分的序列化思路和CVE-2020-14756类似,后面代码执行的思路来自CVE-2020-14841(要注意的是这个漏洞不能过 `Weblogic` 新增的白名单机制,但是可以走iiop)oracle.eclipselink.coherence.integrated.internal.querying中发现了FilterExtractor这个类,他的readExternal方法如下:

跟到readAttributeAccessor方法里,当id为1的时候会返回一个MethodAttributeAccessor对象,这个对象是CVE-2020-14841之后被加入了黑名单的,不过在这里返回的话就不会走反序列化的流程。

也就是说我们依然可以利用MethodAttributeAccessor对象,并且最终会赋值到attributeAccessor属性,这个对象可以调用任意方法(也不是任意,后面会讲)。继续看到FilterExtractorextract方法。

主动去调用了attributeAccessor#getAttributeValueFromObject方法,我们看到MethodAttributeAccessor#getAttributeValueFromObject。 该方法会通过反射执行anObjectgetMethod方法,这两个变量都是攻击者可控的,于是就能够进行利用,不过这里的parametersnull,所以只能调用无参方法。

不难想到利用JdbcRowSetImpl。 接着,我们还需要找到一个地方来调用FilterExtractor#extract。这里利用的又是CVE-2020-14756里使用过的com.tangosol.util.aggregator.TopNAggregator.PartialResult,这里就不细说了,最终可以调用一个Comparatorcompare方法。 不难想到ExtractorComparator。 这里只需要给m_extractor赋值为FilterExtractor

而他的readExternal方法,刚好又回从输入流中读取m_extractor值。

构造POC需要注意的点

在给MethodAttributeAccessor对象进行赋值的时候,仅仅是赋值了getter namesetter name

于是,当执行到FilterExtractor#extract时,会先执行isInitialized

这里会返回false

于是调用initializeAttributes,这里会根据我们设置的getMethodNamesetMethodName通过反射获取具体的方法。

这里isWriteOnly默认为false,不能像之前CVE-2020-14841一样通过反射进行修改改值,因为MethodAttributeAccessor在黑名单里。

这里的逻辑是获取我们要调用的get方法,这里是一个无参方法,反射之后,获取get方法的返回值类型,然后传给set方法,所以这里set方法的参数是根据get方法来的(不一定必须是getter/setter)。

最终找到的JdbcRowSetImpl方法:

get -> connect()
set -> setConnection()

这样,刚好满足connect返回值类型是set方法的形参类型。

漏洞证明

iiop利用:

漏洞修复

第一个就是把利用中使用的两个package加入了黑名单里。

第二个就是基于iiopinputstream进行修复,这里只是简略的跟进diff了一下,在进入序列化IIOP流程之后,第一幅图是没修复之前,s_streamfactoryDefaultObjectStreamFactory,而第二幅图是修复之后,s_streamfactory被设置为了WLSObjectStreamFactory

具体设置流程在CoherenceClusterManager,这是Weblogic初始化的流程里

这里由于新增了WLSCoherenceConfiguator的初始化,就会给s_streamfactory赋值WLSObjectStreamFactory

如果s_streamfactoryWLSObjectStreamFactory,那么就会调用他的getObject,会实例化一个WLSObjectInputStream

后续就会去读WLSObjectInputStreambyte数据

这个byte数据在初始化WLSObjectInputStream的过程中是不会进行赋值的,于是是为空。

接着,后面在read的时候就会爆eof的错误。

0x04   时间线

2021-07-20 Oracle发布安全更新通告

2021-07-21 360CERT发布通告

2021-07-23 360CERT发布分析

0x05   参考链接

1、 Oracle Critical Patch Update Advisory - July 2021

0x06   特制报告下载链接

一直以来,360CERT对全球重要网络安全事件进行快速通报、应急响应。为更好地为政企用户提供最新漏洞以及信息安全事件的安全通告服务,现360CERT正式推出安全通告特制版报告,以便用户做资料留存、传阅研究与查询验证。 用户可直接通过以下链接进行特制报告的下载。

CVE-2021-2394:Oralce7月补丁日二次序列化漏洞分析

若有订阅意向与定制需求请发送邮件至 g-cert-report#360.cn ,并附上您的 公司名、姓名、手机号、地区、邮箱地址。