分析JEP 290机制的Java实现

news/2024/3/29 23:26:45/文章来源:https://blog.csdn.net/text2205/article/details/129138981

简介

https://openjdk.org/jeps/290

Filter Incoming Serialization Data过滤传入的序列化数据

JEP290是Java官方提供的一套来防御反序列化的机制,其核心在于提供了一个ObjectInputFilter接口,通过设置filter对象,然后在反序列化(ObjectInputStream#readObject)的时候触发filter的检测

JEP 290 在 JDK 9 中加入,但在 JDK 6,7,8 一些高版本中也添加了:

Java? SE Development Kit 8, Update 121 (JDK 8u121)Java? SE Development Kit 7, Update 131 (JDK 7u131)Java? SE Development Kit 6, Update 141 (JDK 6u141)

处理

我这里的JDK是 8u202版本

ObjectInputStream

对于ObjectInputStream类来说,主要的过滤方法为filterCheck

image-20221009185828921.png

根据注释,我们知道这个方法主要是当序列化过滤器不为空的时候触发该过滤器

其中反序列化过滤器就为serialFilter属性值,跟进一下

image-20221009190023383.png

这是一个ObjectInputFilter接口,根据注释我们知道从流中读取类的类描述符和类的过滤器,可以不进行配置

我们看看该类的构造方法

image-20221009190254010.png

默认会对serialFilter属性进行赋值操作,跟进ObjectInputFilter.Config.getSerialFilter()方法的调用

image-20221009190420085.png

获取的是ObjectInputFilter中的内部静态类ConfigserialFilter属性

跟下来回到filterCheck方法的分析

image-20221009190703164.png

首先就会判断是否具有serialFilter这个过滤器,如果不为空,将会调用过滤器的checkInput方法进行过滤处理,传入了clazz / arrayLength / depth等信息

image-20221009191015234.png

这个方法返回的是一个ObjectInputFilter.Status,这是一个枚举类型

image-20221009191057036.png

接下来回到filterCheck方法

如果返回的状态为null/REJECTED两个之一,将会抛出异常

所以,对于过滤器的设置,我们可以通过创建一个ObjectInputFilter实例,并重写他的checkInput方法,在其中实现我们的过滤逻辑,之后通过调用ObjectInputStream#setInternalObjectInputFilter进行为stream添加过滤器

image-20221009191546558.png

ObjectInputFilter$Config

在这个类中,存在有一个静态代码块

image-20221009194839656.png

在调用该类的时候就会为serialFilter属性赋值,跟进到configuredFilter属性的来源

image-20221009194957544.png

主要是获取jdk.serialFilter属性值,之后通过调用createFilter方法进行过滤器的创建

跟进一下createFilter方法的调用

image-20221009195401018.png

这个方法将会调用ObjectInputFilter.Config.Global.createFilter方法进行创建

ObjectInputFilterConfigConfigConfigGlobal

接着上面的分析,我们跟进该类的createFilter方法

image-20221009195813279.png

将传入的JEP规则字符串var0传入Global内部静态类的构造方法中,创建了一个Golbal对象,进行返回,所以前面在ObjectInputStream类的构造方法中主要是为serialFilter赋值的是一个Global类

查看官方文档,我们知道JEP 290的编写规则为

  1. 如果模式以“!”开头,如果模式的其余部分匹配,则该类被拒绝,否则被接受

  2. 如果模式包含“/”,则“/”之前的非空前缀是模块名称。如果模块名称与类的模块名称匹配,则剩余模式与类名称匹配。如果没有“/”,则不比较模块名称。

  3. 如果模式以“.**”结尾,则它匹配包和所有子包中的任何类

  4. 如果模式以“.*”结尾,它匹配包中的任何类

  5. 如果模式以“*”结尾,它匹配任何以该模式为前缀的类。

  6. 如果模式等于类名,则匹配。

  7. 否则,状态未定

  • If the pattern starts with “!”, the class is rejected if the rest of
    the pattern matches, otherwise it is accepted

  • If the pattern contains “/”, the non-empty prefix up to the “/” is the
    module name. If the module name matches the module name of the class then
    the remaining pattern is matched with the class name. If there is no “/”,
    the module name is not compared.

  • If the pattern ends with “.**” it matches any class in the package and
    all subpackages

  • If the pattern ends with “.*” it matches any class in the package

  • If the pattern ends with “*”, it matches any class with the pattern as
    a prefix.

  • If the pattern is equal to the class name, it matches.

  • Otherwise, the status is undecided.

接下来看看Global构造方法中是如何进行解析的

image-20221009201153578.png

首先是通过传入的规则var1,将其根据;进行分割,并初始化filters属性为ArrayList数组

image-20221009201516961.png

首先判断是否以*结尾,进而判断是否是.*结尾,如果是以!开头的话成功匹配的话,将会通过lambada的格式调用this.filters.addStatus放置于filters属性中,这里举个例子就行了,后面就也就是同样的格式,进行filters属性的添加

我们看看filters属性是个什么东西?

image-20221009202802332.png

这是一个函数列表

这样成功设置了过滤器,当我们调用的时候将会调用

ObjectInputStream#filterCheckObjectInputFilter$Config$Global#checkInput

image-20221009203807974.png

主要是根据遍历filters属性通过反序列化的类进行获取对应的Status状态

过滤器

全局过滤器

通过前面的分析,我们可以知道在ObjectInputFilter$Config类中属性configuredFilter中获取了jdk.serialFilter属性值,这里就是全局过滤器

对于该属性值的设置有两种方式

  1. 配置JVM的jdk.serialFilter

  2. 配置%JAVA_HOME%\conf\security\java.security中的jdk.serialFilter字段

局部过滤器

同样有着两种方法进行设置

  1. 在创建ObjectInputStream对象之后通过调用其setInternalObjectInputFilter方法进行设置

  2. 又或者是调用Config#setObjectInputFilter方法进行设置

中的jdk.serialFilter字段

局部过滤器

同样有着两种方法进行设置

  1. 在创建ObjectInputStream对象之后通过调用其setInternalObjectInputFilter方法进行设置

  2. 又或者是调用Config#setObjectInputFilter方法进行设置

最后

分享一个快速学习【网络安全】的方法,「也许是」最全面的学习方法:
1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)

2、渗透测试基础(一周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等

3、操作系统基础(一周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)

4、计算机网络基础(一周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现

5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固

6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)

在这里插入图片描述

恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k。

到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?

想要入坑黑客&网络安全的朋友,给大家准备了一份:282G全网最全的网络安全资料包免费领取!
扫下方二维码,免费领取

有了这些基础,如果你要深入学习,可以参考下方这个超详细学习路线图,按照这个路线学习,完全够支撑你成为一名优秀的中高级网络安全工程师:

高清学习路线图或XMIND文件(点击下载原文件)

还有一些学习中收集的视频、文档资源,有需要的可以自取:
每个成长路线对应板块的配套视频:


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

因篇幅有限,仅展示部分资料,需要的可以【扫下方二维码免费领取】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_71988.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c盘系统盘满了,无损扩容

磁盘管理 计算机-管理-磁盘管理 diskmgmt.msc1.选中c盘,右键选择扩展卷,如果是灰色,表示无法扩展 注意: 未分配区域不在同一磁盘,无法分配; 物理上不挨着的区域,无法分配; 2.把与c…

【Spring Cloud Alibaba】003-Nacos 概述与单机搭建

【Spring Cloud Alibaba】003-Nacos 概述与单机搭建 文章目录【Spring Cloud Alibaba】003-Nacos 概述与单机搭建一、Nacos 概述0、新技术学习思路推荐1、什么是 Nacos2、架构图架构图架构图信息二、Nacos 单机搭建1、下载与启动下载地址编辑 startup.cmd 文件下面对两种模式的…

cocos2d-x4.0 win10环境搭建

cocos2d-x默认只支持win32的版本,win64的我测试link不行 我搭建使用的环境 windows10vs2019py2.7cmake3 从GitHub上clone源码https://github.com/cocos2d/cocos2d-x coco2d-x默认带了submodule,有协同子模块,最好是一起下载,搞个…

破解遗留系统快速重构的5步心法(附实例)

前两天和一个架构师朋友闲聊,说到了 「重构」 这个话题,他们公司早年间上线的项目系统,因一直没专人在演进过程中为代码质量负责,导致现在代码越来越混乱,逐渐堆积成“屎山”,目前的维护成本已远高于重新开…

ubuntu server系统树莓派安装mysql8.0开启远程访问

文章目录前言博客一、安装mysql8.0二、创建一个远程访问的新用户三、在MySQL配置文件中启用远程访问。四、navicat15连接mysql8.0返回10061chatgpt回复前言 百度了半天没解决,问了下chatgpt成功解决了…… 博客 一、安装mysql8.0 确认MySQL 8.0服务器已安装并正在…

恺望数据:解决智驾数据生产痛点,提供自动化生产线和规模化人力

最近Chat GPT引起了一个热点话题,就是人工智能是否真的可以替代人类工作,特别是在需要进行数据标注等需要人力的领域。 自动驾驶数据服务公司恺望数据在最近的一个会议上透露了一些消息,他们已经推出了一个基于自动化的数据生产系统&#xff…

uniapp 引入彩色symbol和 指令权限

uniapp 引入iconfont图标库彩色symbol 1,先去阿里巴巴矢量图标库登录 然后点击下载至本地 2.下载本地,然后解压文件夹 3.打开终端cmd命令窗口 npm安装全局包npm i -g iconfont-tools 4.终端切换到上面解压的文件夹里面,运行iconfont-too…

idea 中的 profiles 详解

profile 主要是为了解决不同环境所需的不同变量、配置等问题. profile 一般出现在两个地方:settings.xml,pom.xml 在 settings.xml 时,一般用来做仓库的选择(只使用 aliyun 仓库可以这样配置 settings.xml) 在 pom.xml 时,一般…

EM算法总结

目录 一。Jensen不等式:若f是凸函数 二。最大似然估计 三。二项分布的最大似然估计 四。进一步考察 1.按照MLE的过程分析 2.化简对数似然函数 3.参数估计的结论 4.符合直观想象 五。从直观理解猜测GMM的参数估计 1.问题:随机变量无法直接…

开发日记-lombok

开发日记-lombok环境问题解决方案:1 Data注解失效 无法正常生成 get和set方法2 RequiredArgsConstructor(onConstructor _(Lazy)) 符号_无法识别环境 idea2020.1lombok1.18.24jdk1.8 问题 Data注解失效 无法正常生成 get和set方法RequiredArgsConstructor(onCons…

C++——map和set的应用总结

目录1. 关联式容器2. 键值对3. 树形结构的关联式容器3.1 set3.1.1 set的介绍3.1.2 set的使用3.2 multiset3.2.1 multiset的介绍3.2.2 multiset的使用3.3 map3.3.1 map的介绍3.3.2 map的使用operator[]3.4 multimap3.4.1 multimap的介绍3.4.2 multimap的使用3.5 map和set在OJ中的…

大学计算机基础 知识点总结

一/ 计算机的发展、类型及其应用领域。 1. 计算机(computer)是一种能自动、高速进行大量算术运算和逻辑运算的电子设备。 其特点为:速度快、精度高、存储容量大、通用性强、具有逻辑判断和自动控制能力。 2. 第一台计算机:ENIAC,美国&#…

【TensorFlow 】查看Tensorflow和python对应版本、将现有的TensorFlow更新到指定的版本

1、查看Tensorflow和python对应版本 1.1这里我是在TensorFlow官方网址产看的 1、打开官方网址 https://pypi.org/project/tensorflow/1.1.0rc2/#files但是这个网址好像打不开,点击会出现这样 问题不大 输入Tensorflow然后点击搜索,就会跳转到https://p…

面试官:说说react的渲染过程

hello,这里是潇晨,大家在面试的过程中有没有遇到过一些和react相关的问题呢,比如面试官让你说说react渲染的过程,这到题目比较开放,也比较考验大家对react渲染原理以及源码的整体架构的理解。 整体流程: r…

Vue — 详解mixins混入使用

前言 当我们的项目越来越大,我们会发现组件之间可能存在很多相似的功能,你在一遍又一遍的复制粘贴相同的代码段(data,method,watch、mounted等),如果我们在每个组件中去重复定义这些属性和方法会…

DJI 无人机 Onboard SDK ROS 功能包demo运行

DJI 无人机 Onboard SDK ROS 功能包demo运行demo功能准备测试环境运行 dji sdk 节点运行 demo 节点自动飞行任务航点自动飞行兴趣点环绕自动飞行飞行控制本地坐标位置控制搭建好 Onboard SDK ROS 的开发环境后,功能包自身具备一些写好的demo功能案例 dji sdk 的节点…

接口服务熔断方案

一.熔断方式1.中间件支持熔断2.支持节点级熔断2.支持url前缀匹配二.配置1.延迟方式expression "LatencyAtQuantileMS(50.0) > 100"//50%延迟超过100ms2.失败率方式expression "NetworkErrorRatio() > 0.30" //失败率超过30%3.组合方式expression …

Python学习-----文件操作(读写定位篇)

目录 前言: 1.打开文件 (open) 关闭文件(close) 2.文件的读取(文件变量名 f) (1)整体读取(read) (2)读取一行(readline) (3)读…

三次握手四次挥手详细解析面试常问

文章目录1.第2次握手传回了ACK,为什么还要传回SYN?2.断开连接-TCP 四次挥手3.为什么要四次挥手?4.为什么不能把服务器发送的 ACK 和 FIN 合并起来,变成三次挥手?5.如果第二次挥手时服务器的 ACK 没有送达客户端&#x…

51-52 - 进程状态设计

---- 整理自狄泰软件唐佐林老师课程 文章目录1. 问题2. 进程状态设计2.1 任务生命周期2.2 任务的状态2.3 任务的生命周期与状态切换2.4 状态切换概要设计2.4.1 核心数据结构>内核队列2.4.2 KillTask() 实现思路2.4.3 整体实现规划2.4.4 编程实验:任务生命周期状态…