从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反序列化数据,处理流程如下:

  1. readObject开始处理序列化数据
  2. 经过一系列处理流程
  3. 最终在resolveProxyClassresolveClass处将字节流转换为对应的Class对象

1.2 从流量数据到Class对象

关键处理流程:

  1. readClassDesc方法:读取并返回类描述符,根据不同的类型码(TC)进入不同分支:

    • TC_PROXYCLASSDESC:处理动态代理类,调用readProxyDesc
    • TC_CLASSDESC:处理普通类,调用readNonProxyDesc
  2. readNonProxyDesc方法

    • 从流量中获取类的序列化描述符ObjectStreamClass
    • 通过resolveClass获取对应的Class对象
    • 初始化并构建新的ObjectStreamClass返回
  3. resolveClass方法

    • ObjectStreamClass描述符中获取Class对象
    • 检查序列化版本UID是否匹配
    • 返回Class对象

1.3 从Class对象到代码执行

获取Class对象后,WebLogic会尝试调用以下方法:

  1. readObject
  2. readResolve
  3. readExternal

这些方法的调用为漏洞利用提供了入口点。

二、CVE-2015-4852漏洞分析

2.1 漏洞原理

  1. WebLogic对流量中的序列化数据没有任何校验
  2. 恶意数据被还原为Class对象
  3. WebLogic调用恶意类中的readObject方法

2.2 利用链细节

  1. 构造ChainedTransformer恶意链
  2. 将恶意数据包裹在AnnotationInvocationHandler类的memberValues变量中
  3. 传入构造好的AnnotationInvocationHandler序列化数据
  4. WebLogic获取并调用AnnotationInvocationHandlerreadObject方法
  5. readObject中对memberValues的每一项调用setValue方法
  6. setValue触发恶意数据的checkSetValue,导致命令执行

2.3 WebLogic防护机制

Oracle修复方案:

  1. resolveClass方法中添加黑名单检查
  2. 检查类名是否在黑名单中
  3. 如果在黑名单中,直接抛出错误,阻止获取Class对象

三、CVE-2016-0638漏洞分析

3.1 绕过原理

  1. 利用黑名单之外的类weblogic.jms.common.StreamMessageImpl
  2. StreamMessageImplreadExternal方法可以接收并反序列化参数
  3. 将CVE-2015-4852利用链序列化后作为参数传入
  4. readExternal执行时反序列化参数并调用其readObject方法
  5. 间接执行AnnotationInvocationHandlerreadObject方法

3.2 关键点

  1. StreamMessageImpl不在黑名单中
  2. readExternal方法会被WebLogic自动调用
  3. 通过该方法间接触发原始利用链

四、CVE-2016-3510漏洞分析

4.1 绕过原理

  1. 利用黑名单之外的类weblogic.corba.utils.MarshalledObject
  2. 构造方法接收Object参数并序列化后存储在objBytes
  3. readResolve方法会反序列化objBytes并调用其readObject方法
  4. 将CVE-2015-4852利用链作为构造参数传入
  5. 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;
}

五、总结

  1. 漏洞本质:三个漏洞都利用了WebLogic反序列化机制,区别在于入口点和绕过方式
  2. 防护机制:Oracle通过黑名单机制修复CVE-2015-4852,但未从根本上改变反序列化机制
  3. 绕过方式
    • CVE-2016-0638:利用StreamMessageImplreadExternal方法间接触发
    • CVE-2016-3510:利用MarshalledObjectreadResolve方法间接触发
  4. 根本问题:反序列化机制本身存在设计缺陷,黑名单机制容易被绕过

六、防御建议

  1. 及时安装官方安全补丁
  2. 限制T3协议访问
  3. 使用最新版WebLogic
  4. 考虑使用白名单机制替代黑名单
  5. 监控反序列化操作日志

七、参考资源

  1. Oracle官方安全公告
  2. WebLogic反序列化时序图
  3. Java序列化流协议文档
  4. 漏洞利用PoC示例代码
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 :处理动态代理类,调用 readProxyDesc TC_CLASSDESC :处理普通类,调用 readNonProxyDesc readNonProxyDesc方法 : 从流量中获取类的序列化描述符 ObjectStreamClass 通过 resolveClass 获取对应的Class对象 初始化并构建新的 ObjectStreamClass 返回 resolveClass方法 : 从 ObjectStreamClass 描述符中获取Class对象 检查序列化版本UID是否匹配 返回Class对象 1.3 从Class对象到代码执行 获取Class对象后,WebLogic会尝试调用以下方法: readObject readResolve readExternal 这些方法的调用为漏洞利用提供了入口点。 二、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 关键代码 五、总结 漏洞本质 :三个漏洞都利用了WebLogic反序列化机制,区别在于入口点和绕过方式 防护机制 :Oracle通过黑名单机制修复CVE-2015-4852,但未从根本上改变反序列化机制 绕过方式 : CVE-2016-0638:利用 StreamMessageImpl 的 readExternal 方法间接触发 CVE-2016-3510:利用 MarshalledObject 的 readResolve 方法间接触发 根本问题 :反序列化机制本身存在设计缺陷,黑名单机制容易被绕过 六、防御建议 及时安装官方安全补丁 限制T3协议访问 使用最新版WebLogic 考虑使用白名单机制替代黑名单 监控反序列化操作日志 七、参考资源 Oracle官方安全公告 WebLogic反序列化时序图 Java序列化流协议文档 漏洞利用PoC示例代码