0%

Weblogic CVE-2020-14645 分析

Weblogic CVE-2020-14645 漏洞分析

调用链

1
2
3
4
5
6
7
8
9
10
11
12
getDatabaseMetaData: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
image

if 中有个 targetPrev.getMethod().invoke,但前提条件是 oTarget.getClass() == targetPrev.getTargetClass(), oTarget 是能被控制的,但是肯定不能是特定的类型,所以只能进入 else ,进入 extractComplex 方法:
image

先来看到其中 this.getCanonicalName() 方法:
image

接着进入 CanonicalNames.computeValueExtractorCanonicalName
image

很明显,该方法就是限制反射调用的方法必须以 getis 开头,最后返回去除2个开头后的方法名,继续回到 extractComplex 方法:
image

接下来执行到 ClassHelper.findMethod(clzTarget, BEAN_ACCESSOR_PREFIXES[cchPrefix] + sBeanAttribute, clzParam, false);, 看命名就知道了,是寻找类中的方法,其中 clzTarget 是传入的类,clzParam 是参数,BEAN_ACCESSOR_PREFIXES 就是 getis,然后对之前分割的方法再次拼接:
image

最后调用到 method.invoke(oTarget, aoParam):
image
image
image

从上述过程中可以看出,限制条件就是反射调用的方法必须是以 getis 开头,至于方法参数貌似可以在构造犯法中传入的,所以并不是限制:
image

过程比较简单清晰,而且只影响 12.2.1.4.0 版本,影响较小。

最新版的补丁是把 com.tangosol.util.extractor.AbstractExtractor 这个父类加入黑名单了,所以继承这个类的都不能反序列化了。