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
属性,这个对象可以调用任意方法(也不是任意,后面会讲)。继续看到FilterExtractor
的extract
方法。
主动去调用了attributeAccessor#getAttributeValueFromObject
方法,我们看到MethodAttributeAccessor#getAttributeValueFromObject
。 该方法会通过反射执行anObject
的getMethod
方法,这两个变量都是攻击者可控的,于是就能够进行利用,不过这里的parameters
为null
,所以只能调用无参方法。
不难想到利用JdbcRowSetImpl
。 接着,我们还需要找到一个地方来调用FilterExtractor#extract
。这里利用的又是CVE-2020-14756
里使用过的com.tangosol.util.aggregator.TopNAggregator.PartialResult
,这里就不细说了,最终可以调用一个Comparator
的compare
方法。 不难想到ExtractorComparator
。 这里只需要给m_extractor
赋值为FilterExtractor
。
而他的readExternal
方法,刚好又回从输入流中读取m_extractor
值。
构造POC需要注意的点
在给MethodAttributeAccessor
对象进行赋值的时候,仅仅是赋值了getter name
和setter name
。
于是,当执行到FilterExtractor#extract
时,会先执行isInitialized
。
这里会返回false
。
于是调用initializeAttributes
,这里会根据我们设置的getMethodName
、setMethodName
通过反射获取具体的方法。
这里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_streamfactory
是DefaultObjectStreamFactory
,而第二幅图是修复之后,s_streamfactory
被设置为了WLSObjectStreamFactory
具体设置流程在CoherenceClusterManager
,这是Weblogic
初始化的流程里
这里由于新增了WLSCoherenceConfiguator
的初始化,就会给s_streamfactory
赋值WLSObjectStreamFactory
如果s_streamfactory
是WLSObjectStreamFactory
,那么就会调用他的getObject
,会实例化一个WLSObjectInputStream
后续就会去读WLSObjectInputStream
的byte
数据
这个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 ,并附上您的 公司名、姓名、手机号、地区、邮箱地址。