从Weblogic原理上探究CVE-2015-4852、CVE-2016-0638、CVE-2016-3510究竟怎么一回事
字数 2067 2025-08-20 18:18:23
WebLogic反序列化漏洞深度分析:CVE-2015-4852、CVE-2016-0638、CVE-2016-3510
一、WebLogic反序列化机制原理
1.1 反序列化攻击时序
WebLogic通过7001端口接收T3协议的Java反序列化数据,处理流程如下:
- 从
readObject开始处理序列化数据 - 经过一系列处理流程
- 最终在
resolveProxyClass或resolveClass处将字节流转换为对应的Class对象
1.2 从流量数据到Class对象
关键处理流程:
-
readClassDesc方法:读取并返回类描述符,根据不同的类型码(TC)进入不同分支:
TC_PROXYCLASSDESC:处理动态代理类,调用readProxyDescTC_CLASSDESC:处理普通类,调用readNonProxyDesc
-
readNonProxyDesc方法:
- 从流量中获取类的序列化描述符
ObjectStreamClass - 通过
resolveClass获取对应的Class对象 - 初始化并构建新的
ObjectStreamClass返回
- 从流量中获取类的序列化描述符
-
resolveClass方法:
- 从
ObjectStreamClass描述符中获取Class对象 - 检查序列化版本UID是否匹配
- 返回Class对象
- 从
1.3 从Class对象到代码执行
获取Class对象后,WebLogic会尝试调用以下方法:
readObjectreadResolvereadExternal
这些方法的调用为漏洞利用提供了入口点。
二、CVE-2015-4852漏洞分析
2.1 漏洞原理
- WebLogic对流量中的序列化数据没有任何校验
- 恶意数据被还原为Class对象
- WebLogic调用恶意类中的
readObject方法
2.2 利用链细节
- 构造
ChainedTransformer恶意链 - 将恶意数据包裹在
AnnotationInvocationHandler类的memberValues变量中 - 传入构造好的
AnnotationInvocationHandler序列化数据 - WebLogic获取并调用
AnnotationInvocationHandler的readObject方法 readObject中对memberValues的每一项调用setValue方法setValue触发恶意数据的checkSetValue,导致命令执行
2.3 WebLogic防护机制
Oracle修复方案:
- 在
resolveClass方法中添加黑名单检查 - 检查类名是否在黑名单中
- 如果在黑名单中,直接抛出错误,阻止获取Class对象
三、CVE-2016-0638漏洞分析
3.1 绕过原理
- 利用黑名单之外的类
weblogic.jms.common.StreamMessageImpl StreamMessageImpl的readExternal方法可以接收并反序列化参数- 将CVE-2015-4852利用链序列化后作为参数传入
readExternal执行时反序列化参数并调用其readObject方法- 间接执行
AnnotationInvocationHandler的readObject方法
3.2 关键点
StreamMessageImpl不在黑名单中- 其
readExternal方法会被WebLogic自动调用 - 通过该方法间接触发原始利用链
四、CVE-2016-3510漏洞分析
4.1 绕过原理
- 利用黑名单之外的类
weblogic.corba.utils.MarshalledObject - 构造方法接收Object参数并序列化后存储在
objBytes中 readResolve方法会反序列化objBytes并调用其readObject方法- 将CVE-2015-4852利用链作为构造参数传入
- WebLogic调用
readResolve时触发利用链
4.2 关键代码
// 构造方法
public MarshalledObject(Object var1) throws IOException {
// 将var1序列化后存储在this.objBytes
this.objBytes = var2.toByteArray();
}
// readResolve方法
public Object readResolve() throws IOException, ClassNotFoundException {
// 反序列化objBytes并调用readObject
Object var3 = var2.readObject();
return var3;
}
五、总结
- 漏洞本质:三个漏洞都利用了WebLogic反序列化机制,区别在于入口点和绕过方式
- 防护机制:Oracle通过黑名单机制修复CVE-2015-4852,但未从根本上改变反序列化机制
- 绕过方式:
- CVE-2016-0638:利用
StreamMessageImpl的readExternal方法间接触发 - CVE-2016-3510:利用
MarshalledObject的readResolve方法间接触发
- CVE-2016-0638:利用
- 根本问题:反序列化机制本身存在设计缺陷,黑名单机制容易被绕过
六、防御建议
- 及时安装官方安全补丁
- 限制T3协议访问
- 使用最新版WebLogic
- 考虑使用白名单机制替代黑名单
- 监控反序列化操作日志
七、参考资源
- Oracle官方安全公告
- WebLogic反序列化时序图
- Java序列化流协议文档
- 漏洞利用PoC示例代码