写点什么

从 Java 9 反向移植对象反序列化过滤器

  • 2017-03-30
  • 本文字数:956 字

    阅读完需:约 3 分钟

JEP 290 让开发人员可以在反序列化对象时对传入数据进行过滤。该提案最初是针对 Java 9 提出的,但现在已经反向移植到Java 6、7、8 。该特性提供了一种机制,可以在处理对象输入流时过滤传入数据,并且可以帮助预防反序列化漏洞。前不久,这种漏洞曾影响了Apache Commons 及其他库。

反序列化不可信任数据是开放Web 应用安全项目(OWASP)和 CERT Oracle Coding Standard for Java (尤其是规则 SER12-J SER13-J )等所列出的一个众所周知的风险。软件开发人员应该总是检查通过ObjectInputStream传入的数据是否有效,不过,借助 JDK 中现有的工具,这有时候并不容易实现。JEP 290 改变了这种情况,它提供了一种方法过滤传入数据,而且不需要扩展ObjectInputStream。这是通过多种机制实现的,取决于相关开发人员的需要。

一般来说,开发人员可以通过编辑系统属性jdk.serialFilter或者conf/security/java.properties中的安全属性jdk.serialFilter配置默认的 ObjectInputFilter 。这些属性可以接受一种或多种模式,用于查找类(使用类似 Ant 文件模式的语法),或者设置对反序列化对象属性的限制:

复制代码
// 拒绝反序列化任何属于 untrustedmodule 的类,
// 以及任何元素数超过 500 的数组
jdk.serialFilter=!untrustedmodule/.**;maxarray=500
// 包 com.myorg.trusted 的白名单类,
// 但不一定是来自子包
jdk.serialFilter=com.myorg.trusted.*

如果需要更大的灵活性,那么开发人员可以指定自己的动作和检查,实现自己的 ObjectInputFilter ,然后使用 setObjectInputFilter 应用到已有的ObjectInputStreamObjectInputFilter可以使用 ObjectInputFilter.FilterInfo 提供的信息确定当前正在反序列化的对象是可以接受还是需要拒绝,或者该过滤器并没有提供足够的决策信息;在后一种情况下,自定义的过滤器可以将状态置为“不确定”,并委托另一个用户定义的过滤器或者默认的系统过滤器进行决策。

最后,如果开发人员希望在所有的反序列化过程中都使用自己的机制,就可以使用 ObjectInputFilter.Config.setSerialFilter 将一个用户定义的过滤器指定为系统默认的过滤器。

如本文开头所言,开发人员不需要等到 Java 9 才开始应用序列化过滤器;Java 8 update 121、Java 7 update 131、Java 6 update 141 均提供了 JEP 290。

查看英文原文 Object Deserialisation Filters Backported from Java 9

2017-03-30 19:002442
用户头像

发布了 1008 篇内容, 共 392.7 次阅读, 收获喜欢 344 次。

关注

评论

发布
暂无评论
发现更多内容

C/C++函数指针与指针函数

C语言与CPP编程

c++ C语言 函数指针

你真的了解 Base64 吗

hepingfly

Java base64 编码

oeasy教您玩转linux010203显示logo

o

数据分析之伯克森谬误:颜值和性格真成反比吗

KAMI

人生 数据分析 数据

AtmoicXXX与AtmoicXXXArray源码分析

Darren

源码 内存布局 CAS java 并发 AtmoicXXX

甲方日常 7

句子

工作 随笔杂谈 日常

联盟:互联网时代的人才变革

非著名程序员

互联网 个人成长 人才 人才发展 突破圈层,个体崛起

在Rust里面嵌入python代码

lipi

Python rust

架构师训练营0期 第十二周作业

WW

微服务下数据一致性的几种实现方式

xcbeyond

微服务 BASE理论 数据一致性

终端传感了解吗?18个知识点为你扫盲

华为云开发者联盟

IoT 信息化 传感器 传输协议 无线传输器

百度被绿了?

程序员生活志

百度 互联网 头条

缓冲区溢出

C语言与CPP编程

c++ C语言 缓冲区 堆栈溢出

我们一起学程序-五子棋

叫练

Java 多线程 游戏 websocket

面试官问:Spring Boot中Tomcat是怎么启动的

Java小咖秀

tomcat 面试 springboot

Pod安装神策SDK报错Remote branch v2.1.3 not found in upstream origin

凌宇之蓝

ios 小程序flutter, 跨平台 CocoaPods pod React Native

再爆安全漏洞,这次轮到Jackson了,竟由阿里云上报

YourBatman

Jackson Fastjson 安全漏洞 CVE-2020-24616

浮点数比较的精度问题

C语言与CPP编程

c c++

Docker -快速安装Elasticsearch

枫林

关于MySQL参数,这些你要知道

Simon

MySQL 参数

【高并发】要想学好并发编程,关键是要理解这三个核心问题

冰河

写作 多线程 高并发 同步 分工

C语言与C++常见面试题

C语言与CPP编程

c++ 面试 C语言

闲聊胡扯

C语言与CPP编程

随笔杂谈

Flink检查点存在的性能影响-16

小知识点

scala 大数据 flink

mPaas 厂商push不通排查指南

阿里云金融线TAM SRE专家服务团队

android push

Zeppelin SDK :Flink 平台建设的基石

Apache Flink

flink

最通俗易懂的 Redis 架构模式详解

哈喽沃德先生

redis 架构模式 redis集群 redis哨兵 redis主从

指针变量的传值和传址

C语言与CPP编程

c++ 指针 C语言

Elasticsearch初步认识

枫林

Java elasticsearch ES

Docker 安装和简单使用

枫林

Docker

深挖 Redis 6.0 源码—— SDS

yanglbme

redis 源码 源码分析

从Java 9反向移植对象反序列化过滤器_Java_Abraham Marín Pérez_InfoQ精选文章