Weblogic CVE-2020-14645 漏洞分析
调用链1
2
3
4
5
6
7
8
9
10
11
12getDatabaseMetaData:4004, JdbcRowSetImpl (com.sun.rowset)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)
invoke:62, NativeMethodAccessorImpl (sun.reflect)
invoke:43, DelegatingMethodAccessorImpl (sun.reflect)
invoke:498, Method (java.lang.reflect)
extractComplex:432, UniversalExtractor (com.tangosol.util.extractor)
extract:175, UniversalExtractor (com.tangosol.util.extractor)
compare:71, ExtractorComparator (com.tangosol.util.comparator)
siftDownUsingComparator:722, PriorityQueue (java.util)
siftDown:688, PriorityQueue (java.util)
heapify:737, PriorityQueue (java.util)
readObject:797, PriorityQueue (java.util)
可以看到前面部分是 CC 链,作用就是使用的 gadget
可以从 PriorityQueue.readObject()
直接到 Comparator.compare()
,这样 gadget
相对来说比较好找。
直接看到 UniversalExtractor.extract
:
在 if
中有个 targetPrev.getMethod().invoke
,但前提条件是 oTarget.getClass() == targetPrev.getTargetClass()
, oTarget
是能被控制的,但是肯定不能是特定的类型,所以只能进入 else
,进入 extractComplex
方法:
先来看到其中 this.getCanonicalName()
方法:
接着进入 CanonicalNames.computeValueExtractorCanonicalName
:
很明显,该方法就是限制反射调用的方法必须以 get
、is
开头,最后返回去除2个开头后的方法名,继续回到 extractComplex
方法:
接下来执行到 ClassHelper.findMethod(clzTarget, BEAN_ACCESSOR_PREFIXES[cchPrefix] + sBeanAttribute, clzParam, false);
, 看命名就知道了,是寻找类中的方法,其中 clzTarget
是传入的类,clzParam
是参数,BEAN_ACCESSOR_PREFIXES
就是 get
、is
,然后对之前分割的方法再次拼接:
最后调用到 method.invoke(oTarget, aoParam)
:
从上述过程中可以看出,限制条件就是反射调用的方法必须是以 get
,is
开头,至于方法参数貌似可以在构造犯法中传入的,所以并不是限制:
过程比较简单清晰,而且只影响 12.2.1.4.0
版本,影响较小。
最新版的补丁是把 com.tangosol.util.extractor.AbstractExtractor
这个父类加入黑名单了,所以继承这个类的都不能反序列化了。