Java RMI反序列化/JEP290相关

article/2025/10/3 18:42:34

RMI

远程过程调用 (Remote Procedure Call)是一种服务器-客户端模式,
Java的RMI(Remote Method Invocation)是一种RPC实现。
其基本思想是程序员可以像本地那样,与远程对象进行交互。

步骤:

1、创建一个接口IRemoteService,继承自java.rmi.Remote;
2、S端创建一个类IRemoteServiceImpl,实现该接口,并且继承自java.rmi.server.UnicastRemoteObject;
3、S端在某端口(1099)注册该Naming服务,并将新建的对象(Skeleton)与该服务绑定;
4、C端通过网络连接(lookup)到该服务,得到C端的对象(Stub)通过网络调用服务端对象(Skeleton)的方法。

RMI安全问题

RMI基于Java的序列化/反序列化实现,使其成为反序列漏洞利用的一个攻击面。

原理

攻击者输入恶意序列化对象,使得RMI服务端反序列化攻击者指定的对象;
如果攻击者指定的对象实现了自定义的readObject()方法,则在反序列化过程中可以借此实现一些副作用(比如执行任意代码)。

利用条件

RMI服务端classloader可以找到(存在于classpath中)一个或多个类,能在反序列化过程中实现攻击者的意图。通常把能实现这个的类叫做gadget,或者当通过多个类组合起来实现的叫做gadget chain

Ysoserial

是一个预装了多个gadgets的反序列化漏洞利用工具。

JEP 290

这篇文章A First Look Into Java’s New Serialization Filtering
对JEP 290做了解读。
认为

在Java反序列化漏洞广受诟病的背景下,Oracle拿出了出了它自己的起码之力:JEP 290,提供了一种反序列化过滤的机制。这个机制确实是在朝正确的方向上走。但它不能完全解决问题,也不适合企业生产环境。

因为这种黑名单/白名单的过滤机制只有配置得当,才能有效过滤掉恶意的反序列化攻击。

JEP 290引入了三种过滤机制:

一、进程级过滤器(Process-wide Filter),也叫全局过滤器(Global Filter)

这种过滤方式的工作方式是:
启动Java应用时添加命令行参数(后面有例子)

-Djdk.serialFilter=<白名单类1>;<白名单类2>;!<黑名单类>

或者设置Java系统属性(Java 6,7,8)
$JAVA_HOME/jre/lib/security/java.security(官方的是错的)
或者启动Java应用时设置

-Djava.security.properties=<黑白名单配置文件名>

基于白名单的进程级过滤器虽然是有效的,但是由于是白名单,程序员得找出某应用所有需要被反序列化调用的类,所以一般较难实现。不需要程序员手动修改应用程序级别的代码,因为这个机制已经内置在加入JEP 290的JDK代码(java.io.ObjectInputStream)中。
PS:对于RMI反序列化,如果加入了全局过滤器,当然没有办法绕过这个全局过滤器。

二、自定义过滤器(Custom filters)

可以覆盖进程级过滤器!
当程序员很明确知道他想要反序列化的类是在哪个具体的包下,或者具体的类。需要程序员手动修改应用程序级别的代码。
通过代码:

ObjectInputFilter filesOnlyFilter = ObjectInputFilter.Config.createFilter("de.mogwailabs.Example;!*");

表示只接受
de.mogwailabs.Example
这个包下的类,其他的类都会被拒绝。
PS: 对于RMI反序列化,我们不关心这个,因为我们无法修改服务端代码。

三、内置过滤器(Built-in Filters)

//TODO

关于java.security文件

这个文件在jre目录下,
Java 6、7、8的是在这个目录下:

$JAVA_HOME/jre/lib/security/java.security

看一下不同的JDK有没有JEP 290有什么区别:
在这里插入图片描述
具体看一下这个有JEP 290的jdk1.8.0_112的java.security文件有什么东西。
首先有全局过滤器,即

jdk.serialFilter

这个值,不过需要程序员自行配置。
在这里插入图片描述

另外有RMI相关的,有一个内置的黑名单:
在这里插入图片描述
Github有人写了一个常用的黑名单,配置JEP 290机制使用:
以下有一些黑名单类集合(过滤掉ysoserial中的gadgets):
https://github.com/mogwailabs/deserialization-filter-blacklists/blob/master/blacklist-filter.properties
在这里插入图片描述
在以下JDK版本之上

  • Java 8 - 8u121
  • Java 7 - 7u131
  • Java 6 - 6u141

可以使用以下方式来进行进程级(Process-wide)的黑名单过滤,操作方法:

java -Djava.security.properties=blacklist-filter.properties -jar application.jar

后JEP 290时代

ATTACKING JAVA RMI SERVICES AFTER JEP 290
这篇文章其实人家也没说绕过JEP 290的机制。人家标题说的就是XXX after jep 290,即"后JEP 290时代的Java RMI漏洞利用方式",从头到尾没说绕过的事,也在开篇承认了如果在JEP 290机制下使用了全局过滤,那还是没问题的。
在这里插入图片描述
翻译过来是:如果没有配置全局过滤器,我们还是可以在应用程序级别下功夫利用反序列化漏洞的。

以最近的Dubbo反序列漏洞为例,比如我们用CommonsCollections4这个gadget生成了payload,不管是使用JDK 112还是JDK 131启动dubbo-samples-http,都可以被反序列化成功。原因在于JEP 290只是引入了一种机制,要么使用进程级的过滤器,要么各个应用自己加上自己应用级的过滤器。
而且对于JDK 112,即便加上了这个参数

-Djava.security.properties=/Users/caiqiqi/GitProjects/JavaSer/JEP290/blacklist-filter.properties

在这里插入图片描述
启动后,依然可以被反序列化成功。
反序列化成功HTTP响应结果是:
在这里插入图片描述
而当使用带JEP290的JDK 131启动时,
在这里插入图片描述
未能命令执行。HTTP返回响应:
在这里插入图片描述
报错信息是:

java.io.InvalidClassException: filter status: REJECTED

对比一下:
在这里插入图片描述
从打印出的调试信息也可以看出JEP 290修改了java.io.ObjectInputStream类,增加了过滤对待反序列化对象的类检查的逻辑(推测的,待看具体代码)。

RMI反序列化漏洞环境

环境来源:
https://github.com/mogwailabs/rmi-deserialization
环境包括服务端和客户端。且两端持有相同的接口:
IBSidesService.java

package de.mogwailabs.BSidesRMIService;import java.rmi.Remote;
import java.rmi.RemoteException;public interface IBSidesService extends Remote {boolean register(String ticketID) throws RemoteException;void visitTalk(String talkname) throws RemoteException;void poke(Object attende) throws RemoteException;
}

在这里插入图片描述
为了环境更加真实,这里没有将服务端和客户端放到同一个节点上。服务端代码BSidesMucRmiService放到ubuntu-server虚拟机里:
使用maven编译依赖并打包:

mvn clean compile assembly:single

成功打包成jar之后,会在默认端口1099启动RMI服务:

java -jar ./target/BSidesRMIService-0.1-jar-with-dependencies.jar

在这里插入图片描述
使用nmap扫描1099端口,可以得到34725这个新的端口,然后第二次使用nmap扫描,可以获取到远程RMI服务的一些信息。
在这里插入图片描述
然后编译客户端。由于客户端有ysoserial的payload,需要带上ysoserial作为classpath:

javac -cp /Users/caiqiqi/Downloads/ysoserial-0.0.6-SNAPSHOT-BETA-all.jar *.java

在这里插入图片描述

漏洞利用:

java -cp .:/Users/caiqiqi/Downloads/ysoserial-0.0.6-SNAPSHOT-BETA-all.jar de.mogwailabs.BSidesRMIService.AttackClient 127.0.0.1  1099 "touch /tmp/test_rmi"

JDK 1.8.0_112
在这里插入图片描述
可以成功
在这里插入图片描述
在这里插入图片描述

参考

  • 2019年3月BSides会议上的Exploiting Java RMI services in 2019议题PPT
  • ATTACKING JAVA RMI SERVICES AFTER JEP 290
  • RMI漏洞的另一种利用方式
  • A First Look Into Java’s New Serialization Filtering
  • JDK approach to address deserialization Vulnerability
  • Oracle官方关于Serialization Filtering的详细说明
  • 反序列化漏洞的末日?JEP290机制研究

http://chatgpt.dhexx.cn/article/lFWAgQmZ.shtml

相关文章

Java第三方库——Jep数学公式计算

Java第三方库——Jep数学公式计算 官网简介&#xff1a;JEP JAVA仅用几行代码解析和计算数学表达式。这个包允许用户以字符串的形式输入公式&#xff0c;并立即对其求值。JEP支持用户定义的变量、常量和函数。包括一些常用的数学函数和常量。 1.下载3.x版本依赖并引入 官方网站…

你知道Java中的JCP, JEP, JLS, JSR是什么意思吗?

目录 一、JCP 二、JSR 三、JLS 四、JEP 公众号&#xff1a;MCNU云原生&#xff0c;欢迎微信搜索关注&#xff0c;更多干货&#xff0c;及时掌握。 JCP, JEP, JLS, JSR这些概念是Java社区中的一些概念&#xff0c;但是没有没有经常关注社区的童鞋们未必知道这些缩写所代表的…

Java中JCP, JEP, JLS, JSR是什么

JCP Java Community Process JCP&#xff08;Java Community Process&#xff09;是一个开放的国际组织&#xff0c;主要由Java开发者以及被授权者组成&#xff0c;职能是发展和更新。 JCP维护的规范包括J2ME、J2SE、J2EE&#xff0c;XML&#xff0c;OSS&#xff0c;JAIN等。组…

java 使用JEP解析字符串计算公式 求值(附带自定义函数编写)

2.X 存在精确度问题 推荐使用3.X 参考文章: java 使用 jep3.5 解析公式自动计算(包含BigDecimal模式 浮点数精准计算) 1.增加jep依赖 <dependency><groupId>org.scijava</groupId><artifactId>jep</artifactId><version>2.4.2</versio…

使用Jep在Java中执行Python代码

接上次用Eclipse编写Python代码&#xff1a;使用Eclipse编写Python代码_Cc_Sonia的博客-CSDN博客_eclipse写python程序 为了把深度学习模型部署到Java App上&#xff0c;需要用Java调用Python。试过Jython&#xff0c;但它只对python2有效。。。最后supervisor建议使用Jep&…

jep的使用

参考jep官网:http://www.singularsys.com/jep/ Jep Java只用几行代码解析和评估数学表达式。此程序包允许您的用户输入公式作为字符串&#xff0c;并立即对其进行评估。Jep支持用户定义的变量&#xff0c;常量和函数。包括许多常见的数学函数和常数。 那么啰嗦,说白了就是支持…

python JEP安装

安装python ( 深坑 &#xff1a;安装之前请yum install python3-devel 避免出现i.e.: export LD_PRELOAD/usr/lib/libpython2.7.so.1.0 问题 ) 下载源码 Python Release Python 3.6.5 | Python.org 解压 进入目录 ./configure --prefix/opt/software/python --enab…

JEP:Java表达式分析器

JEP 是一个用于解析和计算数学表达式的 Java 类库。通过使用这个包你可以把公式看 作字符串并快速计算它们。其中内置了大量公共的数学函数和常量供用户使用。另外&#xff0c;你也 可以通过自定义变量、常量、函数等方式扩展 JEP 。 使用 JEP 计算一个字符串表达式包括…

java 使用JEP 进行节点计算

2.X 存在精确度问题 推荐使用3.X 参考文章: java 使用 jep3.5 解析公式自动计算(包含BigDecimal模式 浮点数精准计算)​​​​​​​ 1.JEP基础相关 请参考: java 使用JEP解析字符串计算公式 求值(附带自定义函数编写) 2.使用节点计算 注释写的很明白 要仔细看 public st…

如何在Java中执行Python模块?从认识JEP库开始

让我们从认识JEP库开始。 关注《Java学研大本营》 本教程基于带M1芯片的macOSX&#xff0c;用于Python 3.8/3.9和Java 11。 介绍 从我的实践来讲&#xff0c;我遇到的上一个挑战是&#xff0c;当基础应用引擎是Java的时候&#xff0c;我按常理应该添加一个新的机器学习功能。…

JEP 290 初识

JEP 290 初识 全局过滤器自定义过滤器内置过滤器 JEP 290是 oracle提供已一套JAVA反序列化机制&#xff0c;其并不是一种必须被强制执行的策略&#xff0c;而是需要程序员或者运维人员进行开发与启用。关于该机制的优缺点借用老外的一篇文章 https://dzone.com/articles/a-firs…

jep 使用方法与简介

1什么是jep JEP是Java expression parser的简称&#xff0c;即java表达式分析器&#xff0c;Jep是一个用来转换和计算数学表达式的java库。通过这个程序包&#xff0c;用户可以以字符串的形式输入一个、任意的公式&#xff0c;然后快速地计算出结果。Jep支持用户自定义变量、常…

那些人工智能明星公司都在搞什么?

事件&#xff1a;全球机器学习技术大会 时间&#xff1a;2021年1月13-14日 地点&#xff1a;金茂北京威斯汀大饭店 画外音&#xff1a;文末送所有PPT。 大会特邀近40位机器学习领域的技术领袖和行业应用专家&#xff0c;与1000来自电商、金融、汽车、智能制造、通信、工业互联网…

中国人工智能公司CIMCAI世界港航AI领军企业,自动化港口数字化码头,智能闸口各箱面箱况残缺检测视频流动态感知中国人工智能公司

中国人工智能公司CIMCAI世界港航AI领军企业&#xff0c;自动化港口数字化码头&#xff0c;智能闸口各箱面箱况残缺检测视频流动态感知&#xff0c;智能化港口码头数字化。CIMCAI已完成全球250万人工智能集装箱箱况检验&#xff0c;完成全球上亿集装箱信息&#xff0c;先进产品在…

外媒评选出来的中国五大人工智能(AI) 公司

https://www.toutiao.com/a6656628348795486727/ 2019-02-11 14:37:43 全球三分之二的人工智能投资正在进入中国市场&#xff0c;仅去年一年就帮助人工智能行业增长了67&#xff05;。 中国科技行业最近宣布了其前50家人工智能公司。其中包括14只“独角兽”--估值为10亿美元或…

【研究】那些人工智能公司现在发展到哪一步了?

作者&#xff1a;欧应刚 | 小编&#xff1a;小葱 近期&#xff0c;为了撰写《2018中国人工智能应用与生态研究报告》&#xff0c;中国软件网对我国人工智能产业应用和平台、生态建设进行了调研&#xff0c;以下是部分调研结果&#xff0c;更多内容见报告完整版。 1.已经有相当…

全球最强人工智能创新公司Top100榜单重磅发布!

自2012年至现在&#xff0c;名单上的100家跟人工智能相关的创业公司在367笔交易中累计融资总额达到117亿美元。以下是2017年的AI 100名单列表。 今天CB insights公布了第二个年度AI 100&#xff0c;即2018 AI 100 名单&#xff0c;如下图所示&#xff0c;这是其中100家最有希望…

2017-2020年人工智能公司死亡名单

▼ 更多精彩推荐&#xff0c;请关注我们 ▼ 有浪潮就有泡沫&#xff0c;有泡沫就有死亡。 被称为继移动互联网之后又一次个重要技术爆炸的人工智能&#xff0c;从者如云。从2017年以来&#xff0c;又有多少人工智能公司在浪潮中诞生&#xff0c;又有多少公司在浪潮中死亡&#…

AI公司--国外知名公司

微软、Facebook、IBM、迪士尼、亚马逊、Adobe 波士顿动力 波士顿动力成立于1992年&#xff0c;当时属于麻省理工学院&#xff0c;后被Alphabet收购。去年&#xff0c;软银从Alphabet手中收购了波士顿动力公司。软银通过自己的愿景基金&#xff0c;在机器人领域进行了大量投资。…

在国内人工智能领域,你最看好哪一家公司?

在人工智能的各个细分领域&#xff0c;除了微软、google、BAT这样的巨头&#xff0c;还有许多世界领先、拥有各自黑科技的中国企业&#xff0c;它们之中&#xff0c;有些正在成长为独角兽&#xff0c;有些已经成为了投资者的关注对象。 语音之王&#xff1a;科大讯飞 黑科技&…